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