java中使用freemarker导出word文档

发布于:2023-04-27 ⋅ 阅读:(217) ⋅ 点赞:(0)

公司项目要求要有一个能导出成一份word文档的功能,于是就上网搜了一些教程,但我跟着教程使用的时候还是遇到了很多问题,这里我自己总结一份我作为新手使用freemarker能看懂的文章。可能以后自己还会用到,至少到时候忘了还可以翻看一下。

首先要自己在网上下载一个freemarker的jar包,这个直接百度就有,不赘述了。向自己的项目中导入刚才下载的freemarker的jar包,然后把自己需要展示数据的文档打开,例如我的文档是这样:

 

因为我的项目需求是要把项目中的错误类型及其对应个数导出成一份word文档,然后展示出来,这个word文档是组长给的文档模板,然后我只要将数据填充到对应的位置就可以了。所以这份模板中其他的东西都是可以不用管的,只要修改你需要填入数据的字段就可以。这里我需要填入的字段是“出厂编号为空”,“热稳定电流为空”,“设备参数不准确”,“同型号设备出厂编号相同”,“总数”等。然后我要修改的是他们分别对应的字段,也就是后面的数量,这里需要把数量那里填入英文,拼音也可以,总之不要用中文,因为在后面我们需要在文件中修改这些字段。所以我分别在他们对应的位置中填入了“factoryNull”,“iNull”等等字段。把字段改好之后,我们把这份文档另存为xml的文件格式

然后再次打开这份xml文档,我是用notepad++打开的,按下快捷键ctrl+f搜索刚才自己写的需要填入数据的字段,比如第一个是“factoryNull”,然后会跳转xml文件的这个字段,我们将其修改为"${factoryNull}",也就是添加一个"${}"在你的字段外面,当然,里面也可以不写你以前填入word文档中的字段,比如你也可以把他修改成"${a}",这样也是可以的,就是后面你需要在一个java文件中使用到你现在"${}"中写的字段,所以用一个有意义的单词能一目了然知道是哪个字段的比较好一点。然后接下来继续搜索第二个字段,这里是“iNull”,同样的把这个修改成"${iNull}",接着进行同样的操作,把刚才word中需要填入数据的字段全部做以上修改操作,修改完成之后保存,把你的xml文件复制粘贴到你的项目中的一个包下面

这里我随便创建了一个包名为“abc”,没错粘贴进去之后直接重命名你的xml文件,把后缀改成ftl文件就可以了,这样模板我们就弄完了。

接下来我们要拷贝一段代码:

 

package com.xxx.test;

import java.io.BufferedWriter;  
import java.io.File;  
import java.io.FileNotFoundException;  
import java.io.FileOutputStream;  
import java.io.IOException;  
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 freemarker.template.Configuration;  
import freemarker.template.Template;  
import freemarker.template.TemplateException;  
  
public class WordTest {  
      
    private Configuration configuration = null;  
      
    public WordTest(){  
        configuration = new Configuration();  
        configuration.setDefaultEncoding("UTF-8");  
    }  
      
    public static void main(String[] args) {  
        WordTest test = new WordTest();  
        test.createWord();  
    }  
      
    public void createWord(){  
        Map<String,Object> dataMap=new HashMap<String,Object>();  
        getData(dataMap);  
        configuration.setClassForTemplateLoading(this.getClass(), "/abc");  //FTL文件所存在的位置  
        Template t=null;  
        try {  
            t = configuration.getTemplate("count.ftl"); //文件名  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        File outFile = new File("D:/导出的文档"+Math.random()*10000+".doc");  //导出文档的存放位置
        Writer out = null;  
        try {  
            out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));  
        } catch (FileNotFoundException e1) {  
            e1.printStackTrace();  
        }  
           
        try {  
            t.process(dataMap, out);  
        } catch (TemplateException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
  
    private void getData(Map<String, Object> dataMap) {  
        dataMap.put("factoryNull", "121");  
        dataMap.put("iNull", "1");
        dataMap.put("modelPara","222");
        dataMap.put("factorySame","55");
        dataMap.put("AllNum",66");
               
        List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();  
        for (int i = 0; i < 10; i++) {  
            Map<String,Object> map = new HashMap<String,Object>();  
            map.put("number", i);  
            map.put("content", "内容"+i);  
            list.add(map);  
        }  
          
          
        dataMap.put("list", list);  
    }  
}  

这个代码不是我写的,是当时做这个的时候网上看到别人说的,就复制下来用了,发现可以用。然后这个代码复制过去后也是放在一个包下面,我也是随便建了一个包,然后new了一个WordTest类,然后把这个代码复制过去,修改一下包名,然后修改一下ftl文件存放位置,只需要在"/"后面写下你那个存放的包名就可以,不用加文件名,然后下面接着修改文件名,写下“你的文件名.ftl”,最后再修改一下你的导出文档存放位置,这里我直接存在D盘,这三个修改的地方后面都有注释,直接可以看到。然后这个文件修改完成之后,下面有一个getData方法,在这里面put中就有我们之前在xml文件中写入"${}"这个里面的字段了,这时候我们就一个字段一个put,然后put(“xml中字段”,“你要输入的数据”)一条一条写就可以了。然后这些写完之后直接运行这个java文件,然后去相应的存储位置找到导出的word文档。

 

双击打开之后就可以看到我们在文件中填入的数据填入到这份文档中了。

本文含有隐藏内容,请 开通VIP 后查看