Freemarker导出带格式的word的使用
1.新建一个doc文档
2.另存为XML文档
3.用editplus打开(最好用工具打开,对我们需要修改的地方会变为黑色)
注意:doc文档中每道题有表格,只不过把表格边框给隐藏了。每道题占两行,题号与题干占一行,选项占一行。也就是两行对应一条记录,因此用list包住两行。
格式为<#list><w:tr>.....</w:tr></#list>,然后将需要改变的地方变为Freemarker的取list值,比如讲mjmc改为${mjmc}。
4.将修改后的Xml直接改后缀为ftl
5.Java中控制输出word位置:
准备基本的Java实体类有get/set方法,另外两个也类似。
编程实现导出word
package FreemarkExWord; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; 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 org.junit.Test; import bean.TestFreemarkerBean; import freemarker.template.Configuration; import freemarker.template.Template; public class TestExam { @Test public void exportSimpleWord() throws Exception{ // 要填充的数据, 注意map的key要和word中${xxx}的xxx一致 Map<String,Object> dataMap = new HashMap<String,Object>(); dataMap.put("sjmc", "电厂第一次考试"); List<Dxt> dlist = new ArrayList<Dxt>(); List<Oxt> olist = new ArrayList<Oxt>(); List<Pdt> plist = new ArrayList<Pdt>(); dlist.add(new Dxt("1", "这是一个单选题,请选择答案", "fdsf佛挡杀佛多少分的多少的", "第三方的地方第三方反倒是多少多少", "dsf ds sd fds的分的", "ds ds fsd你的说法的")); dlist.add(new Dxt("2", "这是一个单选题,请选择答案", "fdsf佛挡杀佛多少分的多少的", "第三方的地方第三方反倒是多少多少", "dsf ds sd fds的分的", "ds ds fsd你的说法的")); dlist.add(new Dxt("3", "这是一个单选题,请选择答案", "fdsf佛挡杀佛多少分的多少的", "第三方的地方第三方反倒是多少多少", "dsf ds sd fds的分的", "ds ds fsd你的说法的")); dlist.add(new Dxt("4", "这是一个单选题,请选择答案", "fdsf佛挡杀佛多少分的多少的", "第三方的地方第三方反倒是多少多少", "dsf ds sd fds的分的", "ds ds fsd你的说法的")); dlist.add(new Dxt("5", "这是一个单选题,请选择答案", "fdsf佛挡杀佛多少分的多少的", "第三方的地方第三方反倒是多少多少", "dsf ds sd fds的分的", "ds ds fsd你的说法的")); dlist.add(new Dxt("6", "这是一个单选题,请选择答案", "fdsf佛挡杀佛多少分的多少的", "第三方的地方第三方反倒是多少多少", "dsf ds sd fds的分的", "ds ds fsd你的说法的")); olist.add(new Oxt("1", "这是一个多选题,请选择答案", "fdsf佛挡杀佛多少分的多少的", "第三方的地方第三方反倒是多少多少", "dsf ds sd fds的分的", "ds ds fsd你的说法的")); olist.add(new Oxt("2", "这是一个多选题,请选择答案", "fdsf佛挡杀佛多少分的多少的", "第三方的地方第三方反倒是多少多少", "dsf ds sd fds的分的", "ds ds fsd你的说法的")); olist.add(new Oxt("3", "这是一个多选题,请选择答案", "fdsf佛挡杀佛多少分的多少的", "第三方的地方第三方反倒是多少多少", "dsf ds sd fds的分的", "ds ds fsd你的说法的")); olist.add(new Oxt("4", "这是一个多选题,请选择答案", "fdsf佛挡杀佛多少分的多少的", "第三方的地方第三方反倒是多少多少", "dsf ds sd fds的分的", "ds ds fsd你的说法的")); olist.add(new Oxt("5", "这是一个多选题,请选择答案", "fdsf佛挡杀佛多少分的多少的", "第三方的地方第三方反倒是多少多少", "dsf ds sd fds的分的", "ds ds fsd你的说法的")); olist.add(new Oxt("6", "这是一个多选题,请选择答案", "fdsf佛挡杀佛多少分的多少的", "第三方的地方第三方反倒是多少多少", "dsf ds sd fds的分的", "ds ds fsd你的说法的")); plist.add(new Pdt("1", "你是人?")); plist.add(new Pdt("2", "你是人?")); plist.add(new Pdt("3", "你是人?")); plist.add(new Pdt("4", "你是人?")); plist.add(new Pdt("5", "你是人?")); dataMap.put("dlist", dlist); dataMap.put("olist", olist); dataMap.put("plist", plist); //Configuration用于读取ftl文件 Configuration configuration = new Configuration(); configuration.setDefaultEncoding("utf-8"); /*以下是两种指定ftl文件所在目录路径的方式, 注意这两种方式都是 * 指定ftl文件所在目录的路径,而不是ftl文件的路径 */ //指定路径的第一种方式(根据某个类的相对路径指定) configuration.setClassForTemplateLoading(this.getClass(),""); //指定路径的第二种方式,我的路径是C:/a.ftl // configuration.setServletContextForTemplateLoading(getServletContext(), "/WEB-INF/templates"); // 输出文档路径及名称 File outFile = new File("F:/test3.doc"); //以utf-8的编码读取ftl文件 Template t = configuration.getTemplate("paper.ftl","utf-8"); Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"),10240); t.process(dataMap, out); out.close(); } }
6.测试结果:
【当你用心写完每一篇博客之后,你会发现它比你用代码实现功能更有成就感!】
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了