FreeMarker导出Word,合并重复数据

记录一下最近使用FreeMarker做的一个word导出功能。
1、首先创建一个需要的Word模板,${}里是要遍历的map数据的key值,l是由多个map组成的list的别名:

2、另存为xml格式,编辑xml文件


3、可以使用Notepad++打开xml文件,如果里面的数据是错乱的,可以使用在线格式化工具格式化xml代码。

生成xml后数据被打乱,进行手动调整。

4、

    1)、遍历list循环生成行数据,list里存放多个map,list取别名l,#assign用于定义两个模板变量。

    2)、这里的if-else就是简单的判断,l.subCenter=subCenter代表这两个值不相等是,添加合并开始,否则合并结束。

    3)、如果list的值是空,则会直接报错,所以需要添加空值判断。

    4)、找到对应的行尾添加对应的list结束标签



5、将文件改为ftl格式。

6、下面是代码实现。

public static void main(String[] args) throws IOException, TemplateException {
        // 创建测试数据
        List<Map> info = createInfo();
        String fileName = "E:/_1/exportWord1.doc";// 存放的路径
        String ftlPath = "E:/_1";
        String ftlName = "exportWord.ftl";
        HashMap<String, Object> map = new HashMap<String, Object>();
        map.put("list",info);
        // 写入数据并导出word
        exportWord(map,fileName,ftlPath,ftlName);
        System.out.println("保存成功!");
    }

 /**
     * 向模板中写入数据并生成新的word文件
     * @param map 存放要写入的数据
     * @param savePath 保存的文件路径
     * @param ftlPath 模板路径
     * @param ftlName 模板名称
     * @throws IOException
     * @throws TemplateException
     */
    public static void exportWord(Map map, String savePath, String ftlPath,String ftlName) throws IOException, TemplateException {
        Configuration configuration = new Configuration();
        configuration.setDefaultEncoding("utf-8");
        configuration.setDirectoryForTemplateLoading(new File(ftlPath));
        Template t = configuration.getTemplate(ftlName);

        File outFile = new File(savePath);
        FileOutputStream fos = new FileOutputStream(outFile);
        OutputStreamWriter oWriter = new OutputStreamWriter(fos, "UTF-8");
        Writer out =  new BufferedWriter(oWriter);// 生成流


        t.process(map,out); // 将数据和流生成模板文件
        out.close();
        fos.close();

    }

7、导出效果

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值