freemarker导出excel时office报错而wps不会[转]

时间:2024-03-27 10:30:55

原地址:https://blog.csdn.net/klchht/article/details/52218203

由于excel模板是客户提供的,并且较复杂,所以采用freemarker导出会轻松很多。

客户需要的模板如图:

freemarker导出excel时office报错而wps不会[转]

第一次用freemarker按照网上教程(我用的是WPS):

参考资料

1、先用excel画好模板然后另存为xml。这里用wps轻松搞定,用office则需要自己写xml模板然后映射到excel上面。

2、把.xml改成.ftl。ftl是freemarker模板的格式。

3、往模板里头写数据,写完后在把 ftl 改回 xls 或者 xlsx,完成。


就这样很顺利的写了好几个导出excel功能,用wps也能正常打开,没多想就更新上去了,结果收到用户反馈office打不开。

编辑excel一堆xml代码,稍微看得懂,但是不知道哪个地方导致office解析不了,一头雾水,只好逐块删代码测试。


总结如下:


1、如果 ss:ExpandedRowCount 这边设置的行数值小于实际行数则报错,相应的 ss:ExpandedColumnCount  列数一样,可以

      通过传参设置大小(比如ss:ExpandedRowCount="${dataList?size + 10}")。

2、<cell> 里头的 <data>设置类型时如果 百分比数据不小心设置成 ss:Type="Number",则会报错,改为String 可以解决。

3、涉及到列合并时,行是动态增加的,此时合并列后面的那些列需要加上 ss:Index=""用于指定列的位置,否则会报错,比如这样子就是正常的

[html] view plain copy
  1. <Cell ss:StyleID="s60">  
  2.     <Data ss:Type="String">${data.bzsbl}</Data>  
  3. </Cell>  
  4. <#if data_index+1=1>  
  5.     <Cell ss:StyleID="s59" ss:MergeDown="${listSize}">  
  6.         <Data ss:Type="String">${data.hotel1}</Data>  
  7.     </Cell>  
  8.     <Cell ss:StyleID="s61" ss:MergeDown="${listSize}">  
  9.         <Data ss:Type="String">${data.hotel2}</Data>  
  10.     </Cell>  
  11.     <Cell ss:StyleID="s61" ss:MergeDown="${listSize}">  
  12.         <Data ss:Type="String">${data.hotel3}</Data>  
  13.     </Cell>  
  14. </#if>  
  15. <Cell ss:StyleID="s62" ss:Index="16">  
  16.     <Data ss:Type="String">${data.szcnt}</Data>  
  17. </Cell>  

4、ss:ExpandedColumnCount="" 这边设置的列数要跟<Column/>个数一至,否则会报错,比如这样子就是正常的

[html] view plain copy
  1. <pre name="code" class="html"><Table ss:ExpandedColumnCount="10" ss:ExpandedRowCount="104"  
  2.     x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="54"  
  3.     ss:DefaultRowHeight="13.5">  
  4.     <Column ss:StyleID="s64" ss:AutoFitWidth="0" ss:Width="91.5" />  
  5.     <Column ss:StyleID="s64" ss:AutoFitWidth="0" ss:Width="125.25" />  
  6.     <Column ss:StyleID="s64" ss:AutoFitWidth="0" ss:Width="93" />  
  7.     <Column ss:StyleID="s64" ss:AutoFitWidth="0" ss:Width="81" />  
  8.     <Column ss:StyleID="s64" ss:AutoFitWidth="0" ss:Width="83.25" />  
  9.     <Column ss:StyleID="s64" ss:AutoFitWidth="0" ss:Width="87" />  
  10.     <Column ss:StyleID="s64" ss:AutoFitWidth="0" ss:Width="84.75" />  
  11.     <Column ss:StyleID="s64" ss:AutoFitWidth="0" ss:Width="85.5" />  
  12.     <Column ss:StyleID="s64" ss:AutoFitWidth="0" ss:Width="95.25" />  
  13.     <Column ss:StyleID="s64" ss:AutoFitWidth="0" ss:Width="140.25" />  


20171012补充:

第一次写blog,一年过去了,没想到有人看,还被转载了。为了更好的帮助有需要的人,补充一下内容。

刚开始我也是各种网上搜索,但是没能解决问题,于是决定自己摸索解决。

解决办法 跟以前做数学题一样,用排除法,将不相干的代码一点点排除,从而找到问题代码。


xml 代码结构大概是这样的:表头 + 内容 + 尾巴。

表头和尾巴一般都是固定的,比如我这个,前5行是表头,最后2行是尾巴。介于头尾的内容不固定,一般是通过循环生成。

1、我用 notepad++ 打开 xlsx文件,之所以打的开 是因为是 ftl 格式的,只是名称改成 xlsx ,本质还是 xml 内容。

2、头尾之间的内容占了主要代码量,先从这边开始删。可以把循环去掉,只留1行,然后保存,接着分别用wps、office打开文件是否成功。

3、若第2步骤office依旧报错,说明问题不在删掉的代码,那么就接着删,比如删表头,删完后继续用wps、office打开文件,检测是否正常。


重复上面步骤,很快就能找到问题代码了,嗯,我是这么解决问题的。