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>指令跳出迭代
其实这些在⾥⾯都是有的,有时间的朋友可以看看.有许多有意思的东西.
回到正题,将你需要循环遍历的⼀⾏剪切到<#list></#list>中间.
好,做完这⼀步,就可以将它的后缀名改为:ftl了。
⼯作做到这⼀步已经差不多了,代码的话,可以看上⼀篇.算了,负点责任,将代码贴上并写⼀些注释吧.
[java]
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. plate.Configuration;
16. plate.Template;
17. plate.TemplateException;
18.
19. public class WordTest {
20.
21.    private Configuration configuration = null;swot矩阵分析图
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.        ateWord();
31.    }
32.
33.    public void createWord(){
34.        Map<String,Object> dataMap=new HashMap<String,Object>();
35.        getData(dataMap);
36.        configuration.Class(), "/com");  //FTL⽂件所存在的位置
37.        Template t=null;
38.        try {
39.            t = Template("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);腾讯qq解除手机绑定
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".