Java 动态生成复杂 Word
项目中需要用 java 程序生成doc 文件,百度一番,发现FreeMarker 的评价比较高。
FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出,至于想详细了解 FreeMarker 的请自行百度。
这篇博文主要是总结自己在用网上例子时遇到的坑。吃水不忘挖井人,还是要感谢分享技术的前辈。
参照过的博客链接:
http://www.360doc.com/content/13/0731/10/13247663_303740756.shtml
http://blog.csdn.net/zhanwentao2/article/details/7255432
1. 制作 Word 模版
2. 将 Word文档保存为 xml
3. freemarker 标签语言替换字段
用 Firstobject free XML edito 打开,将你需要动态生成的字段打上标记,${} 这样就可以
FreeMarker 还支持需要丰富的标记,如果你想展示更复杂和丰富的内容,都可以实现,具体遇到需求时问度娘即可。
4. 引入项目
将 xml 文件更改后缀名 为 .ftl, 然后引用到你的项目中
需要注意的问题:
a. word 版本不能低于 2003 ,因为 2003 才开始支持 xml;
b.用 Firstobject free XML edito 打开 要编辑的 xml 文件时,xml 不要放在含有中文路径的目录中【编辑器会无响应,然后你知道的.....】。
实现的代码如下:
1 import java.io.BufferedWriter; 2 import java.io.File; 3 import java.io.FileOutputStream; 4 import java.io.OutputStreamWriter; 5 import java.io.Writer; 6 import java.sql.Connection; 7 import java.sql.ResultSet; 8 import java.util.HashMap; 9 import java.util.Map; 10 11 import cn.sina.ttjava_13.database.DB; 12 import freemarker.template.Configuration; 13 import freemarker.template.Template; 14 15 public class WordTest { 16 17 private Configuration configuration = null; 18 private Connection conn; 19 private ResultSet res; 20 21 public WordTest() { 22 configuration = new Configuration(); 23 configuration.setDefaultEncoding("UTF-8"); 24 } 25 26 public void createWord() { 27 Map<String, Object> dataMap = new HashMap<String, Object>(); 28 try { 29 String selectSql = "SELECT ID,NAME,NORMALPRICE,MEMBERPRICE FROM T_PRODUCT WHERE 1 LIMIT 10"; 30 conn = DB.getConn(); 31 res = DB.getRs(conn, selectSql); 32 while(res.next()){ 33 dataMap.put("id", res.getString("id").trim()); 34 dataMap.put("name", res.getString("name").trim()); 35 dataMap.put("normalprice", res.getString("normalprice").trim()); 36 dataMap.put("memberprice", res.getString("memberprice").trim()); 37 38 configuration.setClassForTemplateLoading(this.getClass(), "/template"); // FTL文件所存在的位置 39 Template template = configuration.getTemplate("Product.ftl"); 40 41 File outFile = new File("D:/temp/"+ res.getString("name").trim().replaceAll("/", "") +".doc"); 42 Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8")); 43 template.process(dataMap, out); 44 out.close(); 45 } 46 DB.close(res); 47 DB.close(conn); 48 } catch (Exception e) { 49 e.printStackTrace(); 50 } 51 } 52 53 public static void main(String[] args) { 54 WordTest test = new WordTest(); 55 test.createWord(); 56 } 57 }
a. 代码数据库为 mysql ,将查询到的数据,动态填入到wod 中;
b.template.process(),接受一个 Map 和 输入流做为入参,Map 既是你需要动态生成到 doc 里面的数据,字段名必须与你在 .ftl 里面定义的一致;
c. 我觉得数据的来源可以很多,程序计算的结果,数据库存储的数据,页面点击的数据.........
d. 如果你想利用这段代码,需要有一个 .ftl 文件,并且在你的项目 src 目录下面新建 template 目录;
FreeMarker.jar 、实例项目的.ftl 、XMl编辑工具百度云地址:
链接: http://pan.baidu.com/s/1qXhD5N2 密码: 876j
作者:Orson
出处:http://www.cnblogs.com/java-class/
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】
如果,您对我的博客内容感兴趣,请继续关注我的后续博客,我是【Orson】
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段
声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?