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.测试结果:
【当你用心写完每一篇博客之后,你会发现它比你用代码实现功能更有成就感!】