freemarker导出Word,文本,可循环表格,合并单元格,可循环图片,目录更新(一)

最近工作中需要用到ftl模板技术,摸索了一个多星期才知道怎么使用。由于想写的比较多,所以会连续更几篇,这是第一篇。

导出Word的步骤网上已经介绍的很多了,大致分为:
1.制作模板。
2.添加需要的标签
3.导出。

最核心的部分就是制作模板,我需要导出的Word比较复杂,包括文本、表格还有图片。且图片和表格都可以循环。如图:
freemarker导出Word,文本,可循环表格,合并单元格,可循环图片,目录更新(一)_第1张图片

freemarker导出Word,文本,可循环表格,合并单元格,可循环图片,目录更新(一)_第2张图片

制作模板如图,将格式定好,在需要插入数据的地方用${xxx}进行占位,进行占位的时候需要注意,freemarker导出Word,文本,可循环表格,合并单元格,可循环图片,目录更新(一)_第3张图片
红色部分最好将占位符写在别的地方再复制进Word,否则Word会把占位符拆开,这样就无法占位也无法取到数据。
像这样:
freemarker导出Word,文本,可循环表格,合并单元格,可循环图片,目录更新(一)_第4张图片

Word制作完成之后,选择另存为在这里插入图片描述网上有介绍存为2003xml也可以,本人觉得版本太老,而且标签和Word xml不通不是很好用。

保存之后打开文件,检查一下是否又被拆开的情况。
freemarker导出Word,文本,可循环表格,合并单元格,可循环图片,目录更新(一)_第5张图片
我用的是notepad++打开,打开的时候应该是没有格式,所有的数据都是一行,安装一个插件,如图:
freemarker导出Word,文本,可循环表格,合并单元格,可循环图片,目录更新(一)_第6张图片
点击之后
freemarker导出Word,文本,可循环表格,合并单元格,可循环图片,目录更新(一)_第7张图片
这样格式就方便我们看了,可以用ctrl+f快速查找,看看有没有占位符被拆开。如图:
freemarker导出Word,文本,可循环表格,合并单元格,可循环图片,目录更新(一)_第8张图片
如果有被拆开的,只要把拆开的变成图中正确的形式就可以,其他的不用动。(如果你使用复制进Word的方式,基本不会被拆开,我截取的只是我只做模板的部分,如果数据特别多,被拆开需要一个一个的进行手合,如此会是手和大脑的双重折磨!!!)

修改、检查之后就可以放入项目了,如图:
直接修改xml后缀为ftl就可以(我只是测试,大家起名字的时候尽量避免中文)
freemarker导出Word,文本,可循环表格,合并单元格,可循环图片,目录更新(一)_第9张图片

导出的代码:
为了避免出现许多人说的乱码问题 我直接指定了字符集,大家参考一下(由于我现在模板很多,所以代码中的模板名称不一致,大家一定要指定一致)

public class DocHandler {
//    @Autowired
    Configuration con;

    public DocHandler() {
    //必须这样写,构造中指定版本号,不然会被画删除线
        con = new Configuration(Configuration.getVersion());
        //为了避免错误,直接指定字符集,下文也有需要指定的地方
        con.setDefaultEncoding("UTF-8");
    }
	//dataMap这个参数可以换成Object ,具体结构可以自己指定,因为导出的最底层的方法参数指定就是Object
    public void createDoc(Map dataMap, String fileName) throws UnsupportedEncodingException {
        //获取编译后classess文件所在路径
        
        String path = (this.getClass().getResource("/").getPath());
        Template tem = null;
        try{
            //设置模板路径
            //加载模板的方式有三种,网上也有介绍,我推荐用我这种加载方式,我之前用过其他的方法,始终是找不到模板,而且其他两种其实也是用这种方法来找到模板。
            con.setDirectoryForTemplateLoading(new File(path));
            try {
                //设置模板文件名称
                tem = con.getTemplate("zyfx.ftl","UTF-8");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }catch (Exception ex){
        }
        File outFile = new File(fileName);
        Writer out = null;
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(outFile);
            OutputStreamWriter owt = new OutputStreamWriter(fos, "UTF-8");
            out = new BufferedWriter(owt);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        try {
            tem.process(dataMap, out);
            out.close();
            fos.close();
        } catch (TemplateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


}
public void modelTest() {
        //存放总数据
        Map dataMap = new HashMap<>();
        List> list1 = new ArrayList<>();
        try {
		list1.add(...);
		......
		......
        } catch (Exception e) {
            e.printStackTrace();
        }
		//key一定要和模板中的key对应
        dataMap.put("hbList", list1);
        DocHandler doc = new DocHandler();
        try {
            doc.createDoc(dataMap, "D:\\软件安装包\\text.doc");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

以上就是大致导出的方法。

未完。。。待续

你可能感兴趣的:(java,模板技术,目录更新,freemarker,Word,循环图片,循环表格)