【FreeMaker】利用freemaker生成word版报表
来源:互联网 发布:淘宝网小商品 编辑:程序博客网 时间:2024/05/16 05:33
前言:
在很多业务系统中,都需要生成月报,周报的报表。freemaker就很适合生成word版报表,freemaker就是利用word本身自带的xml格式进行文本替换,图片替换等操作的,当然除了简单的替换文本之外,他还有其他的高级用法,详情请见freemaker的官网,官网地址在文末给出。
利用freemaker生成报表只需要几个简单的步骤。
下面利用示例展示整个流程
1,制作word模板
按照自己的业务需求,首先整理出一个word模板,这个模板除了没有数据之外,其他的部分都是已经固定的。只是在需要数据填充的部分暂时空着,之后调用相关的freemaker的API往里面填充数据。
下面简单的制作一个模板(格式排版并没有严格制作,开发者在开发过程中需要自己调整好模板里面的排版,格式。)
1.1 按照业务需求制作自己的模板
下面是一个示例:
生成的word模板如下:
freemaker操作说明书.doc
1.2 另存为xml格式
freemaker操作说明书.xml
1.3 用文本编辑器修改《freemaker操作说明书》(.xml)
注:xml格式化后xml结构更清晰,方便查看
得到文本数据,如下图
从图片中可以看出来,上面的${name}等变量被拆分成了多个部分,那么现在需要将这样的被拆分的变量名整合成整体。
整合后如下:
注:
文档中只要是需要填充变量的地方,如果像上面一样被拆分成多个,都需要手动拼接成块。 另外对于表格,稍有不同。
如果你的表格的行数不是固定的,那么可能需要迭代。 freemaker中提供了一种标签,<#list val_name as
alias>
1.4 保存后,修改文件扩展名为ftl
ftl为freemaker的模板格式,之后就可以依据此模板生成word
2 利用freemaker的jar包编程
下面根据上面的模板,创建对应的java工程
上面的package(xunhuan)这个包没有什么用,读者自行忽略
工程中的两个主要的类是WordAction.java和WordUtil.java,代码如下:
WordAction.java
import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.net.URLDecoder;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Random;import sun.misc.BASE64Encoder;public class WordAction { private String filePath; // 文件路径 private String fileOnlyName; // 文件唯一名称 public static void main(String []args){ new WordAction().createWord(); } public String createWord() { /** 用于组装word页面需要的数据 */ Map<String, Object> dataMap = new HashMap<String, Object>(); /** 组装数据 */ dataMap.put("name", "张三"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日"); dataMap.put("date", sdf.format(new Date())); List<Map<String, Object>> newsList = new ArrayList<Map<String, Object>>(); for (int i = 1; i <= 10; i++) { Map<String, Object> map = new HashMap<String, Object>(); map.put("title", "标题" + i); map.put("address", "博客地址" + (i * 2)); newsList.add(map); } dataMap.put("table", newsList); dataMap.put("pic", getImageStr()); /** 文件名称,唯一字符串 */ Random r = new Random(); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd_HHmmss_SSS"); StringBuffer sb = new StringBuffer(); sb.append(sdf1.format(new Date())); sb.append("_"); sb.append(r.nextInt(100)); // 文件唯一名称 fileOnlyName = "用freemarker导出的Word文档_" + sb + ".doc"; // 文件名称 String classpath=Class.class.getClass().getResource("/").getPath(); System.out.println(classpath); filePath = classpath; /** 生成word */ WordUtil.createWord(dataMap, "freemaker操作说明书.ftl", filePath, fileOnlyName); return "createWordSuccess"; } private String getImageStr() { String imgFile = "C:/Users/KingWang/Desktop/QQ截图20170707203921.png"; InputStream in = null; byte[] data = null; try { in = new FileInputStream(imgFile); data = new byte[in.available()]; in.read(data); in.close(); } catch (Exception e) { e.printStackTrace(); } BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(data); }}
WordUtil.java
import java.io.BufferedWriter;import java.io.File;import java.io.FileOutputStream;import java.io.OutputStreamWriter;import java.io.Writer;import java.util.Map;import freemarker.template.Configuration;import freemarker.template.Template;/** * @Desc:word操作工具类 */public class WordUtil { /** * @Desc:生成word文件 * @param dataMap * word中需要展示的动态数据,用map集合来保存 * @param templateName * word模板名称,例如:test.ftl * @param filePath * 文件生成的目标路径,例如:D:/wordFile/ * @param fileName * 生成的文件名称,例如:test.doc */ @SuppressWarnings("unchecked") public static void createWord(Map dataMap, String templateName, String filePath, String fileName) { try { // 创建配置实例 Configuration configuration = new Configuration(); // 设置编码 configuration.setDefaultEncoding("UTF-8"); configuration.setClassForTemplateLoading(WordUtil.class, "/test/"); // 获取模板 Template template = configuration.getTemplate(templateName); // 输出文件 File outFile = new File(filePath + File.separator + fileName); // 如果输出目标文件夹不存在,则创建 if (!outFile.getParentFile().exists()) { outFile.getParentFile().mkdirs(); } // 将模板和数据模型合并生成文件 Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "UTF-8")); // 生成文件 template.process(dataMap, out); // 关闭流 out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } }}
3,运行结果
生成的word之后的截图
4,结语
freemaker的官网手册地址: http://freemarker.org/docs/index.html
freemaker教程: http://www.cnblogs.com/fx-blog/category/920072.html
对于刚接触freemaker的你,可能需要了解一下freemaker的dom结构和变量之间的关系。
http://www.zheng-hang.com/chm/freemarker2_3_24/xgui_imperative_learn.html本示例程序的代码地址: https://pan.baidu.com/s/1mhLI3Y4
- 【FreeMaker】利用freemaker生成word版报表
- 利用freemaker导出word
- freemaker生成word
- freemaker 生成word 出错
- freemaker生成word 和 excel
- 利用FreeMaker实现网页到Word文档的生成
- 利用freemaker生成静态页面
- JAVA 用freemaker(xml)生成word下载
- Java+freemaker+xml生成word模板
- 使用freemaker模板生成word文档
- FreeMaker
- freemaker
- FreeMaker
- freemaker
- freemaker
- freemaker
- freemaker
- Freemaker
- 带宽(Bandwidth,UVa 140
- android 页面的自动跳转
- java集合类大全
- 双系统Ubuntu分区扩容过程记录
- 使用IDEA创建javaweb项目并配置详细步骤+导出war包详细步骤
- 【FreeMaker】利用freemaker生成word版报表
- 简单说 正则表达式——要注意lastIndex属性
- SC(Siacoin)挖矿教程
- HTML+css进阶学习摘录(标签语义化)(一)
- OGRE lod 技术的使用,LOD模型生成及手动设置LOD级别
- bzoj1875: [SDOI2009]HH去散步
- 实战1--应用EL表达式访问JavaBean的属性
- 大臣的旅费
- opencv打开摄像头