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

好了,大致就这样了.

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

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

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

问题很好解决.

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

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

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

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

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

时间: 2024-08-03 02:08:38

JAVA用freemarker生成复杂Excel。(freemarker)的相关文章

freeMarker生成word,excel文档

以前导出文档一直使用poi技术,这个项目使用freemarker技术,然后看了一下,发现比poi简单多了.于是发表一下. FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件. 首先,把你要导出的word文档另存为xml格式,然后使用记事本将它打开,将动态生成的代码用el表达式(jstl标签)替换. 示例如下: wor

JavaWeb开发中采用FreeMarker生成Excel表格

最近做了一个需求,要求导出一个采购合同的Excel表格,这个表格样式比较多.由于是合同,这个Excel表格里面有好多格式要求,比如结尾处签字那部分就有格式要求.这里介绍种采用FreeMarker的api来生成Excel文件的方案 一.方案的对比 针对这个需求我想了2个方案,介绍如下 方案一:先做一个合同的表格模板,然后把变量都填充成类似EL表达式的样子.然后通过poi 相关类把模板读到内存中,把里面的变量的值替换,然后生成下载文件. 方案二:先做一个合同的表格模板,然后转换成xml文件,然后再改

Java Web项目中使用Freemarker生成Word文档

Web项目中生成Word文档的操作屡见不鲜,基于Java的解决方案也是很多的,包括使用Jacob.Apache POI.Java2Word.iText等各种方式,其实在从Office 2003开始,就可以将Office文档转换成XML文件,这样只要将需要填入的内容放上${}占位符,就可以使用像Freemarker这样的模板引擎将出现占位符的地方替换成真实数据,这种方式较之其他的方案要更为简单. 下面举一个简单的例子,比如在Web页面中填写个人简历,然后点击保存下载到本地,效果图如下所示. 打开下

java使用freemarker 生成word文档

java 生成word文档 最近需要做一个导出word的功能, 在网上搜了下, 有用POI,JXL,iText等jar生成一个word文件然后将数据写到该文件中,API非常繁琐而且拼出来的样式也不美观,于是选择了另一种方式----feemarker基于word模板的导出方式, 这种方式非常简单而且导出的样式美观, 其原理就是先做一个word模板, 该模板中变量数据用${xxx}这种方式填写, 然后再导出时只需读取模板然后用相应的数据替换其中的${xxx}即可. 一,简单模板导出(不含图片, 不含

利用Freemarker生成word的使用(java)

首先向客户获得一份平时需要的word模板,将需要用程序填写的数据使用能够区分的字母,如XXXXX. 第二步就是把word模板,转化为xml文件(word可以另存为xml的),用EditorPlus等工具打开,注意字符编码,word的字符编码为utf-8,所以打开是最好是先不要改动,先看编码是否正确(不正确的改下字符编码),然后格式化一下xml文件,格式化后方面阅读(格式化,网上有很多在线格式化工具),然后寻找你刚才在word中留下的标记,把他们换成freemarker标记,其语法跟struts语

Java 使用模板生成 Word 文件---基于 Freemarker 模板框架

Java项目引入 Freemarker 插件自行完成. 步骤如下: 1.编写 Word 模板,并将模板中要用代码动态生成数据用 Freemarker 变量取代,即${变量名},如${username}: 2.把该 word 文档 另存为 xml 文件(格式选择 Word 2003 XML,注意是另存为,不是改扩展名为 xml),然后再改扩展名为 ftl: 3.用编辑软件打开最后的 ftl 文件,并用查找功能查找第一步中定义的变量名,如:username, 就会发现 Word 软件在将 Word

Java Web用Freemarker生成带图片的Word文档

步骤一:模板制作 用world2003做一个导出模板,如果有图片则加入一张图片占位,将world另存为xml,将xml中需要导出的内容用Freemarker标签表示,最后另存为.ftl结尾的模板: 步骤二:后台代码 1.获取导出的数据: @RequestMapping(value = "/exportDoc") public void exportDoc(String resumeId,HttpServletResponse response,HttpServletRequest re

FreeMarker生成word的代码

 用于生成word用的freemarker工具类 package com.ucap.netcheck.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.i

用Main方法调用freemarker生成文件

MyGenerator.java package com.comp.common; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import freemarker.template.Con