• JAVA用freemarker生成复杂Excel。(freemarker)


    在生成Excel的时候,大多时候都是使用poi,jxl等进行的,但是对于复杂的Excel来说,这个工作量是非常的大的,而且,对于我这么懒的人来说,这是相当痛苦的一件事情,所以,我不得不找找有没有简单一点的办法来搞定这个事情。我想到了上次用freemarker成功生成了Word文档。我就想可不可以也生成Excel呢?然后我就尝试。结果真行,不过,和生成Word文档有一些差别,好了,不废话了,上图。

    上一张比较简单的Excel图。

    这个,就是Excel的一个结构了,接下了,将它另存为“XML 电子表格2003(*.xml)”

    至如如何将数据准确的填充到相应的地方,看上一篇生成Word文档的小技巧,就是在需要填充数据的地方加上一个标记,或者写拼音。

    下图是生成的Xml

    我想,这个结构大家应该能一目了然了,row:代表一行,cell代表一个单元格.

    用过poi,jxl的朋友应该非常的熟悉了.

    有的朋友可能打开的时候,xml非常的凌乱,找不到需要修改的地方,上面所说的小技巧就起到了作用,按照拼音或者你独特的标识找到需要修改的位置.

    在需要填充数据的地方写上freemarker模块语句。例如:将类型改为"${type}" ,双引号别也拷贝过去了,呵呵.

    还有,这一行可能有很多行,所有需要一个迭代的标签,在上一篇我也说到过的.

    <#list sequence as item>

    </#list>

    上面的语法格式中,sequence就是一个集合对象,也可以是一个表达式,但该表达式将返回一个集合对象,

    而item是一个任意的名字,就是被迭代输出的集合元素.此外,迭代集合对象时,还包含两个特殊的循环变量:
    item_index:当前变量的索引值
    item_has_next:是否存在下一个对象
    也可以使用<#break>指令跳出迭代

    其实这些在http://www.havenliu.com/goodarticle/420.html里面都是有的,有时间的朋友可以看看.有许多有意思的东西.

    回到正题,将你需要循环遍历的一行剪切到<#list></#list>中间.

    好,做完这一步,就可以将它的后缀名改为:ftl了。

    工作做到这一步已经差不多了,代码的话,可以看上一篇.算了,负点责任,将代码贴上并写一些注释吧.

    [java] view plaincopy
     
    1. package com;    
    2.     
    3. import java.io.BufferedWriter;    
    4. import java.io.File;    
    5. import java.io.FileNotFoundException;    
    6. import java.io.FileOutputStream;    
    7. import java.io.IOException;    
    8. import java.io.OutputStreamWriter;    
    9. import java.io.Writer;    
    10. import java.util.ArrayList;    
    11. import java.util.HashMap;    
    12. import java.util.List;    
    13. import java.util.Map;    
    14.     
    15. import freemarker.template.Configuration;    
    16. import freemarker.template.Template;    
    17. import freemarker.template.TemplateException;    
    18.     
    19. public class WordTest {    
    20.         
    21.     private Configuration configuration = null;    
    22.         
    23.     public WordTest(){    
    24.         configuration = new Configuration();    
    25.         configuration.setDefaultEncoding("UTF-8");    
    26.     }    
    27.         
    28.     public static void main(String[] args) {    
    29.         WordTest test = new WordTest();    
    30.         test.createWord();    
    31.     }    
    32.         
    33.     public void createWord(){    
    34.         Map<String,Object> dataMap=new HashMap<String,Object>();    
    35.         getData(dataMap);    
    36.         configuration.setClassForTemplateLoading(this.getClass(), "/com");  //FTL文件所存在的位置    
    37.         Template t=null;    
    38.         try {    
    39.             t = configuration.getTemplate("wordModel.ftl"); //文件名    
    40.         } catch (IOException e) {    
    41.             e.printStackTrace();    
    42.         }    
    43.         File outFile = new File("O:/outFilessa"+Math.random()*10000+".xls");  //生成文件的路径  
    44.         Writer out = null;    
    45.         try {    
    46.             out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));    
    47.         } catch (FileNotFoundException e1) {    
    48.             e1.printStackTrace();    
    49.         }    
    50.              
    51.         try {    
    52.             t.process(dataMap, out);    
    53.         } catch (TemplateException e) {    
    54.             e.printStackTrace();    
    55.         } catch (IOException e) {    
    56.             e.printStackTrace();    
    57.         }    
    58.     }    
    59.     //这里赋值的时候需要注意,xml中需要的数据你必须提供给它,不然会报找不到某元素错的.  
    60.     private void getData(Map<String, Object> dataMap) {    
    61.         dataMap.put("title", "标题");    
    62.         dataMap.put("year", "2012");    
    63.         dataMap.put("month", "2");    
    64.         dataMap.put("day", "13");    
    65.         dataMap.put("auditor", "鑫");    
    66.         dataMap.put("phone", "xxxxxxxxxxxxx");    
    67.         dataMap.put("weave", "文涛");    
    68. //      dataMap.put("number", 1);    
    69. //      dataMap.put("content", "内容"+2);    
    70.             
    71.         List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();    
    72.         for (int i = 0; i < 10; i++) {    
    73.             Map<String,Object> map = new HashMap<String,Object>();    
    74.             map.put("number", i);    
    75.             map.put("content", "内容"+i);    
    76.             list.add(map);    
    77.         }    
    78.             
    79.             
    80.         dataMap.put("list", list);    
    81.     }    
    82. }    

    好了,大致就这样了.

    如何程序没报错的话,那么你的Excel已经成功生成出来了,但是.

    有时候会打不开?表出错?

    这是因为Excel在生成xml的时候,可能是为了不浪费资源吧,在生成时候,会指定Excel有多少行,如果超出了这个长度的话,它就会编译不通过.报错.

    问题很好解决.

    针对这2个问题,需要修改2个不同的地方.

    1:工作表的到设置.就是Sheet了.ok,打开xml,搜索"Worksheet",如果你有多个工作表的话,找到你自己要的.

    修改它的属性值"ss:ExpandedRowCount",看到这,应该懂了吧?把它设置大一点,或者通过程序传个值给它也可以.这个问题就解决了.

    2:表,如果你有耐性,可以根据它给你的log去看看,一看也就知道了.不过不是很好找,呵呵.

    搜索最后一个Row,修改它的属性值"ss:Index".

  • 相关阅读:
    洛谷 P3521 [POI2011]ROT-Tree Rotations 解题报告
    洛谷 P1640 [SCOI2010]连续攻击游戏 解题报告
    vector-pop_back
    vector-push_back
    vector-push_back
    vector-max_size
    vector-max_size
    vector-insert
    vector-insert
    vector-front
  • 原文地址:https://www.cnblogs.com/likeju/p/4748774.html
Copyright © 2020-2023  润新知