poi导出excel通用类
一、关键的通用类
public class PoiExportUtils {
private static HSSFWorkbook workBook;
public PoiExportUtils(){
workBook = new HSSFWorkbook();
}
/**
* 创建sheet
* @param sheetName
* @param workBook
* @return
*/
public static HSSFSheet createHSSFSheet(String sheetName,HSSFWorkbook workBook){
// 生成一个表格
HSSFSheet sheet = workBook.createSheet(sheetName);
sheet.setDefaultColumnWidth(20);
return sheet;
}
/**
* 根据头部名称产生表格标题行
* @param sheet
* @param headers
* @return
*/
public void createHSSFSheetHeader(HSSFSheet sheet,String[] headers){
HSSFRow row = sheet.createRow(0);
for (int i = 0; i < headers.length; i++) {
HSSFCell cell = row.createCell(i);
HSSFRichTextString text = new HSSFRichTextString(headers[i]);
cell.setCellValue(text);
setHeaderStyle(cell);
}
}
/**
* 根据实体产生表格标题行
* @param sheet
* @param headers
* @return
*/
public <T> void createHSSFSheetHeader(HSSFSheet sheet,Collection<T> dataset,String ... excludes){
Iterator<T> it = dataset.iterator();
if(it.hasNext()){
HSSFRow row = sheet.createRow(0);
Field[] fields = it.next().getClass().getDeclaredFields();
int cellIndex = 0;
A:for(int i=0;i<fields.length;i++) {
String fieldName = fields[i].getName();
if(excludes != null){
for(String exclude : excludes){
if(exclude.equals(fieldName)){
continue A;
}
}
}
if(!fields[i].isAnnotationPresent(PoiCell.class)){
continue;
}
PoiCell poiCell = fields[i].getAnnotation(PoiCell.class);
HSSFCell cell = row.createCell(cellIndex);
HSSFRichTextString text = new HSSFRichTextString(poiCell.headerName());
cell.setCellValue(text);
setHeaderStyle(cell);
cellIndex++;
}
}
}
/**
*
* @param sheetName,工作簿名称
* @param headers,可选,
* 如果有则以这个数组中的字符串为页眉,
* 如果没有则去扫描实体类上的注解@PoiCell,以有注解的属性value为页眉。
* @param dataset,需要导出的数据集合
* @param pattern,如果日期,那么需要设置日期类型格式,
* @param out,导出的流
* @param excludes,排除的列,对应实体类属性名。
*/
public <T> void exportExcel(String sheetName,String[] headers,Collection<T> dataset,String pattern, OutputStream out,String ... excludes) {
try {
HSSFSheet sheet = createHSSFSheet(sheetName, workBook);
if(headers==null){
createHSSFSheetHeader(sheet, dataset, excludes);
}else{
createHSSFSheetHeader(sheet, headers);
}
Iterator<T> it = dataset.iterator();
int index = 1;
while(it.hasNext()){
HSSFRow row = sheet.createRow(index);
T t = it.next();
Field[] fields = t.getClass().getDeclaredFields();
int cellIndex = 0;
A:for(int i=0;i<fields.length;i++){
String fieldName = fields[i].getName();
if(excludes != null){
for(String exclude : excludes){
if(exclude.equals(fieldName)){
continue A;
}
}
}
if(!fields[i].isAnnotationPresent(PoiCell.class)){
continue A;
}
HSSFCell cell = row.createCell(cellIndex);
String getMethodName = "get"
+ fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
Method getMethod = t.getClass().getMethod(getMethodName);
Object returnValue = getMethod.invoke(t);
String textValue = null;
if(returnValue instanceof Date){
Date date = (Date) returnValue;
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
textValue = sdf.format(date);
} else if (returnValue instanceof byte[]) {
// 有图片时,设置行高为60px;
row.setHeightInPoints(60);
// 设置图片所在列宽度为80px,注意这里单位的一个换算
sheet.setColumnWidth(cellIndex, (short) (35.7 * 80));
// sheet.autoSizeColumn(i);
byte[] bsValue = (byte[]) returnValue;
HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,255,
(short) cellIndex, index, (short) cellIndex, index);
anchor.setAnchorType(2);
HSSFPatriarch patri = sheet.createDrawingPatriarch();
patri.createPicture(anchor, workBook.addPicture(
bsValue, HSSFWorkbook.PICTURE_TYPE_PNG));
} else if(returnValue!=null){
// 其它数据类型都当作字符串简单处理
textValue = returnValue.toString();
}
// 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
if (textValue != null) {
Pattern p = Pattern.compile("^//d+(//.//d+)?{1}");
Matcher matcher = p.matcher(textValue);
if (matcher.matches()) {
// 是数字当作double处理
cell.setCellValue(Double.parseDouble(textValue));
} else {
CellStyle style = workBook.createCellStyle();
style.setWrapText(true);//回绕文本
cell.setCellStyle(style);
cell.setCellValue(textValue);
}
}
cellIndex++;
}
index++;
}
workBook.write(out);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 给页眉添加样式
* @param cell
*/
private void setHeaderStyle(HSSFCell cell){
// 生成一个样式
HSSFCellStyle style = workBook.createCellStyle();
// 设置这些样式
style.setWrapText(true);//回绕文本
style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);//设置单元格前景色,蓝色
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//居中
// 生成一个字体
HSSFFont font = workBook.createFont();
font.setColor(HSSFColor.VIOLET.index);
font.setFontHeightInPoints((short) 12);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
// 把字体应用到当前的样式
style.setFont(font);
cell.setCellStyle(style);
}
/**
* 如果需要导出图片,那么需要在实体类中定义属性byte[] img 来存放图片数据
* 这个方法,从url的路径获取图片字节数组
* @param strUrl
* @return
*/
// private byte[] getImgByURL(String strUrl){
// //"http://172.16.2.49/83/207/200/0db99469-d2b9-4b97-a1c2-497509c3f5f7.png"
// byte[] byteArray = null;
// try {
// URL url = new URL(strUrl);
//
// InputStream input = url.openStream();
//
// ByteArrayOutputStream output = new ByteArrayOutputStream();
// byte[] buffer = new byte[4096];
// int n = 0;
// while (-1 != (n = input.read(buffer))) {
// output.write(buffer, 0, n);
// }
// byteArray = output.toByteArray();
// } catch (MalformedURLException e) {
// e.printStackTrace();
// } catch (IOException e) {
// e.printStackTrace();
// }
// return byteArray;
// }
}
二、自定义注解类
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PoiCell {
public String headerName() default "";
}
三、实体类
public class CarAlarmExportEntity{
@PoiCell(headerName="车牌号")
private String plateNo;
@PoiCell(headerName="接收时间")
private Date alarmTime;// 报警时间
@PoiCell(headerName="海拔")
private Double altitude;// 海拔
private String alarmFromStr;//报警来源
@PoiCell(headerName="图片路径")
private String imgPath;
@PoiCell(headerName="图片")
private byte[] img;
//get,set
}
四、测试
List<CarAlarmExportEntity> list = new ArrayList<CarAlarmExportEntity>();
PoiExportUtils poi = new PoiExportUtils();
// String[] str = {"a","b","c"};自定义页眉
poi.exportExcel("sheet01",null,list, "yyyy-MM-dd HH:mm:ss", new FileOutputStream("f:/poi.xls"), "alarmFromStr");
poi导出excel通用类的更多相关文章
- MVC NPOI Linq导出Excel通用类
之前写了一个模型导出Excel通用类,但是在实际应用中,可能不是直接导出模型,而是通过Linq查询后获取到最终结果再导出 通用类: public enum DataTypeEnum { Int = , ...
- NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中
以下是NPOI导入导出EXCEL通用类,是在别人的代码上进行优化的,兼容xls与xlsx文件格式,供参考,可直接使用在WinForm项目中,由于XSSFWorkbook类型的Write方法限制,Wri ...
- 使用POI导出EXCEL工具类并解决导出数据量大的问题
POI导出工具类 工作中常常会遇到一些图表需要导出的功能,在这里自己写了一个工具类方便以后使用(使用POI实现). 项目依赖 <dependency> <groupId>org ...
- NPOI MVC 模型导出Excel通用类
通用类: public enum DataTypeEnum { Int = , Float = , Double = , String = , DateTime = , Date = } public ...
- NPOI导入导出EXCEL通用类,可直接使用在WinForm项目中
由于XSSFWorkbook类型的Write方法限制,Write完成后就自动关闭流数据,所以无法很好的支持的Web模式,网上目前也未找到好的解决方案. 注意:若直接使用在WinForm项目中,必需先下 ...
- POI导出EXCEL经典实现
1.Apache POI简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office格式档案读和写的功能. .NET的开发人员则 ...
- Java POI 导出EXCEL经典实现 Java导出Excel
转自http://blog.csdn.net/evangel_z/article/details/7332535 在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者 ...
- java中使用poi导出excel表格数据并且可以手动修改导出路径
在我们开发项目中,很多时候会提出这样的需求:将前端的某某数据以excel表格导出,今天就给大家写一个简单的模板. 这里我们选择使用poi导出excel: 第一步:导入需要的jar包到 lib 文件夹下
- 重构:以Java POI 导出EXCEL为例
重构 开头先抛出几个问题吧,这几个问题也是<重构:改善既有代码的设计>这本书第2章的问题. 什么是重构? 为什么要重构? 什么时候要重构? 接下来就从这几个问题出发,通过这几个问题来系统的 ...
随机推荐
- iOS不使用JSONKit做Dic到JsonString的转换
NSDictionary to jsonString [self DataTOjsonString:dic] -(NSString*)DicToJsonString:(id)object { NSSt ...
- Java第八周学习总结
20145113第八周学习总结 第十五章学习内容 第15章比较琐碎,相对于之前章节也比较枯燥无味看了一部分,也动手敲了些 Logger logger = Logger.getLogger(" ...
- 笔记 进程(processes)
进程:a program in execution(执行中的程序) 进程包括通过程序计数器(program counter)的值和处理器寄存器(processor's registers)的内容来表示 ...
- Android——黑名单
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- [NOIP2011] 选择客栈
题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均 ...
- POJ 3666 Making the Grade
Description A straight dirt road connects two fields on FJ's farm, but it changes elevation more tha ...
- 压力测试报出503错误---ASP.NET支持大并发的相关配置
项目反馈报出503错误,需要收集性能数据如下: 1.Windows性能监视器,该应用程序池进程的线程和处理队列 2.问题重现时的进程dump 这是请求到达IIS后遇到的第一个队列,HTTP.sys收到 ...
- there are no usable controls in this group
今天遇到一个怪事, MFC的toolbox是灰的, 不能使用, 后来上网一查找到解决方案: 右键Toolbox, 点击"Choose Items", 重新启动VS2013, 这样t ...
- 支持无限精度无限大数的类BigNumber实现
介绍 本篇是MathAssist的第二篇,在前言中粗略地展示了MathAssist的“计算和证明”能力,本篇开始将详细介绍其实现原理. 从计算开始说起,要实现任意大数的计算器首先得有一个类支持大数运算 ...
- MyXls: 导出Excel的各种设置
MyXls是一个操作Excel的开源类库,支持设置字体.列宽.行高(由BOSSMA实现).合并单元格.边框.背景颜色.数据类型.自动换行.对齐方式等,通过众多项目的使用表现,证明MyXls对于创建简单 ...