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了。
工作做到这一步已经差不多了,代码的话,可以看上一篇.算了,负点责任,将代码贴上并写一些注释吧.
- package com;
- import java.io.BufferedWriter;
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.OutputStreamWriter;
- import java.io.Writer;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import freemarker.template.Configuration;
- import freemarker.template.Template;
- import freemarker.template.TemplateException;
- public class WordTest {
- private Configuration configuration = null;
- public WordTest(){
- configuration = new Configuration();
- configuration.setDefaultEncoding("UTF-8");
- }
- public static void main(String[] args) {
- WordTest test = new WordTest();
- test.createWord();
- }
- public void createWord(){
- Map<String,Object> dataMap=new HashMap<String,Object>();
- getData(dataMap);
- configuration.setClassForTemplateLoading(this.getClass(), "/com"); //FTL文件所存在的位置
- Template t=null;
- try {
- t = configuration.getTemplate("wordModel.ftl"); //文件名
- } catch (IOException e) {
- e.printStackTrace();
- }
- File outFile = new File("O:/outFilessa"+Math.random()*10000+".xls"); //生成文件的路径
- Writer out = null;
- try {
- out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
- } catch (FileNotFoundException e1) {
- e1.printStackTrace();
- }
- try {
- t.process(dataMap, out);
- } catch (TemplateException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- //这里赋值的时候需要注意,xml中需要的数据你必须提供给它,不然会报找不到某元素错的.
- private void getData(Map<String, Object> dataMap) {
- dataMap.put("title", "标题");
- dataMap.put("year", "2012");
- dataMap.put("month", "2");
- dataMap.put("day", "13");
- dataMap.put("auditor", "鑫");
- dataMap.put("phone", "xxxxxxxxxxxxx");
- dataMap.put("weave", "文涛");
- // dataMap.put("number", 1);
- // dataMap.put("content", "内容"+2);
- List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
- for (int i = 0; i < 10; i++) {
- Map<String,Object> map = new HashMap<String,Object>();
- map.put("number", i);
- map.put("content", "内容"+i);
- list.add(map);
- }
- dataMap.put("list", list);
- }
- }
好了,大致就这样了.
如何程序没报错的话,那么你的Excel已经成功生成出来了,但是.
有时候会打不开?表出错?

这是因为Excel在生成xml的时候,可能是为了不浪费资源吧,在生成时候,会指定Excel有多少行,如果超出了这个长度的话,它就会编译不通过.报错.
问题很好解决.
针对这2个问题,需要修改2个不同的地方.
1:工作表的到设置.就是Sheet了.ok,打开xml,搜索"Worksheet",如果你有多个工作表的话,找到你自己要的.
修改它的属性值"ss:ExpandedRowCount",看到这,应该懂了吧?把它设置大一点,或者通过程序传个值给它也可以.这个问题就解决了.
2:表,如果你有耐性,可以根据它给你的log去看看,一看也就知道了.不过不是很好找,呵呵.
搜索最后一个Row,修改它的属性值"ss:Index".
JAVA用freemarker生成复杂Excel。(freemarker)的更多相关文章
- java利用poi生成/读取excel表格
1.引入jar包依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi< ...
- java使用poi生成导出Excel(新)
导出样式: java代码: import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStre ...
- java后台动态生成导出excel
p ublic void export(List<WechatUser> wechatUserList, HttpServletResponse response) throws IOEx ...
- java将HSSFWorkbook生成的excel压缩到zip中
思路:1.写入输入流中. 2.将输入流加到ZipOutputStream压缩流中 List<DocumentModel> list = null; try { list = documen ...
- JavaWeb开发中采用FreeMarker生成Excel表格
最近做了一个需求,要求导出一个采购合同的Excel表格,这个表格样式比较多.由于是合同,这个Excel表格里面有好多格式要求,比如结尾处签字那部分就有格式要求.这里介绍种采用FreeM ...
- FreeMarker 生成Java、mybatis文件
FreeMarker 生成Java.mybatis文件 将mysql数据库表通过FreeMarker生成对应的Java文件和对应的mybatis文件. FreeMarker是一款模板引擎: 即一种基于 ...
- java使用freemarker生成静态html页面
1. 模板文件static.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...
- java使用freemarker 生成word文档
java 生成word文档 最近需要做一个导出word的功能, 在网上搜了下, 有用POI,JXL,iText等jar生成一个word文件然后将数据写到该文件中,API非常繁琐而且拼出来的 ...
- java用freemarker实现导出excel
前几天做了jxl导出excel,现在用freemarker做一下 freemarker导出excel和导出word步骤和是实现方法是相同的. 1.制作excel模板 2.将后缀名改为ftl,放到对应的 ...
随机推荐
- 斯坦福CS231n—深度学习与计算机视觉----学习笔记 课时5
课时5 数据驱动的图像分类方式:K最邻近与线性分类器(下) 在参数化方法中,我们要做的是构造一个函数,输入一张图片,对每一类输出一个数值.对任意一张图片,我们会计算出它到底属于哪一类.这些参数有时候也 ...
- POJ1017 【据说是贪心...】
题意: 有6种面积的格子,给出这些格子的数量,然后有6*6的格子去容纳这6种面基,问最少需要几个6*6格子,使得所有类型的小格子被容纳. 思路: 按照面积的从大到小放. 一开始还是太天真,还要用各种1 ...
- 基于FBX SDK的FBX模型解析与加载 -(四)
8. 骨骼蒙皮动画 骨骼蒙皮动画是当前游戏引擎中最常用的一种动画方式,关于其基本原理网络上的资料较多,关于到涉及的其它较复杂操作,如插值.融合等在这里也就先不再讨论了,而且其实现方式也与具体引擎的动作 ...
- 收集一些Unity插件
MCS Male 系列,人形角色插件,表情+体型 Mecanim Control Mecanim Control is a coding tool made that allow for a wide ...
- WPF DataGrid foreground 绑定问题
初学WPF , 希望对DataGrid 中所属的一个Column名下的值的颜色动态修改 <DataGridTextColumn Header="隐含回购利率(%)" Bin ...
- 3.bool布尔值int,str的转化,字符串的常用方法,字符串format,is判断(字符串的数字),for循环
1.bool 布尔值 bool 布尔值 -- 用于条件使用 True 真 False 假 True 真 False 假 print(bool(-10)) # 0 是 False 非0的都是True p ...
- 《对“XXX::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们》的问题的解决方法
<对“XXX::Invoke”类型的已垃圾回收委托进行了回调.这可能会导致应用程序崩溃.损坏和数据丢失.向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们& ...
- UltraEdit - 怎么显示文件标签栏和侧边栏
显示文件标签栏 view -> views/lists -> open Files Tabs 显示侧边栏 view -> views/lists -> File Tree Vi ...
- JSP | 基础 | 新建Hello world 的三种方式
第一种: 直接写一个 test.jsp 文件到ROOT文件目录下,内容如下,访问 “http://localhost:8080/test.jsp” <%-- Licensed to the Ap ...
- websocket来回收发消息
# server- # pip install geventwebsocket# pip install flask from flask import Flask, render_template, ...