Java使用JXL创建Excel文件
?????? 以前写过用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;}}}}
?闲暇之余,自己写了一下,欢迎交流。
?