方案一:采用freemarker模板式定制,由于wps和office都是支持xml类数据导入解析的,能支持异常复杂图表结构,操作起来很简单,实现后的效果也很漂亮,但是却存在致命性的问题。后面说问题。(此方案被废弃)

预研初期,功能验证发现完全支持:数据的批处理+序号值的自动递增+空数据判断+默认值处理等等,完全满足项目的基本需求,就进行了此方案的尝试,操作起来也很简单。简要说下步骤,不贴具体代码了(网上很多):

第一步:添加依赖

我的项目是基于maven,所以在pom.xml中添加一下依赖就可以了:

<dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-freemarker</artifactId>
                <version>2.1.6.RELEASE</version>
            </dependency>
              
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.16.10</version>
            </dependency>

第二步:把excel另存为xml或ftl

freemarker 渲染表格数据 freemarker生成excel打不开_github

第三步:把业务处理得到的数据,进行模板化处理,输出至xml文件,核心如下:

Configuration configuration = new  Configuration(Configuration.VERSION_2_3_28);
           configuration.setDirectoryForTemplateLoading(new  File("F:/github/template"));
           Template template = configuration.getTemplate("/服务器信息描述.xml", "UTF-8");      
           Map<String, Object> data = new HashMap<String,  Object>();
           List<Commodity> commodities = new  ArrayList<Commodity>();         
           for(int i =0;i<1000;i++) {
                Commodity commodity = new Commodity();
                ...........
                ...........
                ...........
           }
           data.put("commodities", commodities);
           template.process(data, new FileWriter(new File("F:/github/template/temp.xls")));

运行就能得到一个像样xls文件了,用wps打开一切正常。

但是,这里有个致命的兼容性问题,输出的xls文件只是一个把xml进行强转的模板文件,只是修改了后缀名,文件实际上并不是标准的xls文件格式,这将在客户端展示及文件的后续处理存在极大的隐患,可以通过office打开+poi数据读取尝试,均不支持!!!

当然:这种方案,你可以在生成之后,通过JNI调用wps或者office的.dll或者.so进行第三方数据转换……


第二种方案(已采用):easyexcel组件,好处找百度,基于POI的实现方案,标准的excel文件、性能又快、源码修改方便等;

改造后的easyexcel组件,模板配置灵活,性能也很快。需要改造源码,使其支持自定义模板、默认样式、样式的批量处理、拓展信息添加等,不贴具体优化代码了,说几个注意点吧:

1.poi版本尽量使用新的,新老版本的兼容本身做的并不好;

2.样式创建尽可能多的复用,不要指望使每个单元格都能自定义,这样会生成速度慢、资源消耗大、超限也会保错;

3.使用模板数据时,一定不要在一开始删除模板行,那样所有的后面数据会丢失样式引用,达不到模板效果,生成完在处理。

4.excel模板使用时,存在有数据和空数据2种情况,模板数据的删除,也需要分别进行处理(removeRow和shiftRows)

5.ExcelWriter的关闭注意下,非null判断不好使……

贴个模板导出数据吧:

freemarker 渲染表格数据 freemarker生成excel打不开_数据_02

另外说下POI组件有多耗内存吧,我测试了一个10M的excel大概有300w个有效的单元格,POI读取解析直接报“堆内存溢出”,看了下服务器水位,大概使用了3个G的内存,这要是出现并发……