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.测试结果:

posted @   QiaoZhi  阅读(1212)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示