以前写过用jxl读取excel的,但是一直没有写出用jxl生成excel,项目中用来生产报表的也是一个一个的赋值,然后循环的方式去生成,感觉不适用,也不方便。
这里用Java的反射机制,在生成报表文件的时候动态获取对象的属性,然后生成相应的报表文件。我这里是将要写入excel的数据信息存放在一个List中,然后通过反射机制获取与excel表头标题的的属性,与之匹配,然后写入到文件中。
下面就是我的具体的实现方法:
package com.lzb.common;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
public class JxlCreateExcel {
/**
* 单例模式
*/
private static JxlCreateExcel instance = null;
public JxlCreateExcel() {};
public static synchronized JxlCreateExcel getInstance() {
if(instance==null)
instance = new JxlCreateExcel();
return instance;
}
/**
*
* 功能描述:将生成报表文件, 单线程5w条没问题
*
* @author lizhenbin
* <p>创建日期 :May 7, 2012 5:50:58 PM</p>
*
* @param dataList POJO要打印的数据,在list中
* @param obj POJO,属性和dataList的Object属性一致
* @param fileUrl 产生Excel文件的目录位置和名字(C:\test.xls)
* @param sheetName 表页的名称
* @return
*
* <p>修改历史 :(修改人,修改时间,修改原因/内容)</p>
*/
public static boolean create(List<Object> dataList,
Object obj, String fileUrl, String sheetName) {
WritableWorkbook wwb = null;
OutputStream outs = null;
try {
Class clazz = obj.getClass();
// 构建报表POJO,必须设置都是public属性
/**
* 表头属性
*/
Field[] fields = clazz.getFields();
List<Map<Object, Object>> exelist = new ArrayList<Map<Object, Object>>();
Map<Object, Object> map = new HashMap<Object, Object>();
for(Field f : fields) {
Object key = f.getName();
Object value = f.get(obj);
map.put(key, value);
}
exelist.add(map);
outs = new FileOutputStream(fileUrl);
wwb = Workbook.createWorkbook(outs);
WritableSheet sheet = wwb.createSheet(sheetName, 0);
Label label = null;;
List<Object> titles = new ArrayList<Object>();
/**
* 构建excel表头
*/
for(Iterator<Map<Object, Object>> itor = exelist.iterator(); itor.hasNext();){
Map<Object, Object> tempMap = itor.next();
Set<Object> keySet = tempMap.keySet();
int cols = 0;
for(Object s : keySet) {
label = new Label(cols, 0, (String) tempMap.get(s));
titles.add(s);
sheet.addCell(label);
cols++;
}
}
/**
* 输出的文件内容
*/
int row = 1;
for(Object data : dataList) {
int col = 0;
Class dataClazz = data.getClass();
for(Object key : titles) {
Field fd = dataClazz.getField((String) key);
label = new Label(col, row, (String) fd.get(data));
sheet.addCell(label);
col++;
}
row++;
}
wwb.write(); // 写入数据
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
try {
wwb.close(); // 关闭文件
outs.close();
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
}
闲暇之余,自己写了一下,欢迎交流。