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;
			}
		}
	}

}


 闲暇之余,自己写了一下,欢迎交流。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值