自定义POI EXCEL模板

1.背景

项目中需要将相关数据导出为EXCEL文件,该文件格式已定义在一EXCEL模板文件中。

方案1:jasperreport

实现后发现jasperreport对报表大小的像素设定不是很准确,导致生成的EXCEL文件和模板差异较大,几经调整效果均不理想,否定。

方案2:POI

直接使用POI拼接生成EXCEL文件,代码复杂,不易维护,否定。

方案3:自定义POI EXCEL模板

对EXCEL模板文件进行数据填充,POI不支持,需要自己设计,几经思考,利用现有的一些开源框架实现了该功能,效果也能达到要求,采用。

下面将介绍自定义POI EXCEL模板的实现

2.原理

借鉴了jasperreport的实现原理,如下图所示


3.组件图


POI XLS:当前项目,自定义POI EXCEL模板

POI:Apache开源项目,用于操作EXCEL文件,被用于读取模板文件和生成目标文件

JSON-LIB:用于解析模板文件中的配置信息

OGNL:从数据源中获取对应单元格的填充数据

4.类图



 

5.应用实例

XLSReportCreatorTest.java 可在源码中获取

package com.siyuan.report.xls.test;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.siyuan.report.xls.XLSReportCreator;
import com.siyuan.report.xls.data.XLSReportBeanDataSource;
import com.siyuan.report.xls.template.XLSReportClassPathTemplate;
import com.siyuan.report.xls.template.fill.XLSReportCommentFiller;

public class XLSReportCreatorTest {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		
		OutputStream os = new FileOutputStream("D:/test/poitest/autoVerifyLoss.xls");
		Map fillData = new HashMap();
		fillData.put("brandName", "一汽XXX");
		fillData.put("licenseNo", "粤A12345");
		fillData.put("frameNo", "车架号XXXXX");
		fillData.put("engineNo", "发动机型号XXXX");
		List autoLossItemList = new ArrayList();
		Map autoLossItem = new HashMap();
		autoLossItem.put("itemCode", "零件编码0001");
		autoLossItem.put("itemName", "零件名称0001");
		autoLossItem.put("itemSystemReferenceAmt", 1234);
		autoLossItemList.add(autoLossItem);
		Map autoLossItem1 = new HashMap();
		autoLossItem1.put("itemCode", "零件编码0002");
		autoLossItem1.put("itemName", "零件名称0002");
		autoLossItem1.put("itemSystemReferenceAmt", 2345);
		autoLossItemList.add(autoLossItem1);
		fillData.put("autoLossItemList", autoLossItemList);
		XLSReportCreator.createXLS(new XLSReportClassPathTemplate("autoVerifyLoss.xls"), 
				new XLSReportBeanDataSource(fillData), 
				new XLSReportCommentFiller(), 
				os);
		
		os.close();
	}

}

 

6.相关资料

POI EXCEL模板实现源码    poixls.rar

猜你喜欢

转载自orange5458.iteye.com/blog/1897086