需要将查询到的数据写到excel文件中,所以写了一个工具类。使用的是Jxl实现。
第一步,添加依赖到项目的pom文件中。
<!-- https://mvnrepository.com/artifact/net.sourceforge.jexcelapi/jxl -->
<dependency>
<groupId>net.sourceforge.jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6</version>
</dependency>
第二步,设计工具类的方法头。public void generateXls(FileOutputStream os, String [] header, List<?> data),其中os是流,header是excel表格的表头,data是要写入的数据,此处List集合是泛型。
美中不足的是,headers数组中表头元素的顺序要与写入List集合中的对象的元素定义的顺序一一对应,否则就会乱序。原因是我写的ReFlexObjectUtil 工具类是按顺序提取元素形成数组的。
代码如下:
注:其中将List集合反射为数据的工具类ReFlexObjectUtil ,请参见上一篇文 将泛型List<?> data集合转化为数组、Map 。
package com.xxx.xxxx.utils;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
/**
* 生成excel文件的工具
* generateXls()方法的注意点,要保证List<?> data中数据写入的顺序与excel表头String [] header中的顺序一致,
* 因为ReFlexObjectUtil工具再将对象反射成数组时是按顺序获取数据的
*/
public class GenerateExcelFile {
public void generateXls(FileOutputStream os, String [] header, List<?> data)throws WriteException,IOException {
//创建工作薄
WritableWorkbook book = Workbook.createWorkbook(os);
//创建新的一页
WritableSheet sheet = book.createSheet("excel表格一的名字", 0);
//反射集合data为数组的工具
ReFlexObjectUtil reFlexObject = new ReFlexObjectUtil();
//Date类型的数据再进行格式转化
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
//创建要显示的内容
Label label;//表头
Label content;//表内容
if(!data.isEmpty()) {
//写表头
for(int i = 0; i < header.length; i ++) {
//创建一个单元格,第一个参数为列坐标,第二个参数为行坐标,第三个参数为内容
label = new Label(i, 0, header[i]);
sheet.addCell(label);
}
//写数据
//j从1开始,避免覆盖第一行表头
for(int j = 1; j <= data.size(); j ++) {
for(Object ob : data) {
Object[] array = reFlexObject.getArray(ob);
for(int i = 0; i < array.length; i++) {
// instanceof是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例
if(array[i] instanceof Date) {
content = new Label(i, j, dateFormat.format(array[i]));
}else {
content = new Label(i, j, array[i].toString());
}
sheet.addCell(content);
}
}
}
}
//把创建的内容写到输出流中,并关闭输出流
book.write();
book.close();
os.close();
}
}
以上,如果你有更好的方法,欢迎留言交流,谢谢观看。
网友评论