java生成word样式变形的解决方案(freemarker生成word的样式不对)

word的样式不对,被挤走了,怎么调dtl文件


前言

由于工作的需要,需要动态的生成一个word。从网上搜的一些资料实现了以后,发现样式一直变形,从下午一直整到晚上,才算是解决了,所以记录一下,希望能对后来者提供一定的帮助。本人水平有限,如有误导,欢迎斧正,一起学习,共同进步!


一、现在的样式问题

话不多说,直接上图片,大家有类似的问题,就可以参考我的解决的方案了。

1、现象1_(样式被挤掉)

在这里插入图片描述

2、现象2_(多了一个空白页,也是被挤下去的)

在这里插入图片描述

3、生成的word是代码

在这里插入图片描述

4、样式不对,被挤到第二页

在这里插入图片描述

二、解决的步骤

1.准备好一个word文档(当模板使用)

比如说这个是我的模板。比如说它的名字是: 收据.docx
注意这个后缀是 .docx,很重要!
在这里插入图片描述

2、将模板中将你能选择的填充最大文字。

比如说一行,你觉得这行你最多能填度多少字符,你就输入多少字符占位置,具体效果如下:
将文件另存为docx,此时是: 标准文件.docx
在这里插入图片描述

3、复制一份模板的doc,改为xml后缀

将步骤2的“标准文件.docx”,复制一份,命名为: 标准文件2.xml
注意,此时是**.xml**。
对比着你的模板,将其中的值挨着替换为 ${key} 的形式。
比如我,我就是将全部的“aaaaaaaaaaaaaaaaa”替换为 ${id}

模板:
在这里插入图片描述

要修改的xml:
在这里插入图片描述

4、验证第三步的正确

将改完的第3步的xml,复制一份出来,复制为: 标准文件3.xml
将这个xml的后缀改为 .docx 后缀,也就是标准文件3.doc,看看能否正常的打开是一个word并且key值都正确。
如果是下面的,则是正常的:
在这里插入图片描述

5、用第3步的xml复制一份为.ftl

将第三步的“标准文件3.xml”复制一份为“标准文件3.ftl”。重要的事情说三遍,用第3步的xml文件,用第3步的xml文件,用第3步的xml文件!!!千万不要用第4步的xml或者第4步的docx再改后缀为xml 一定要用第三步的xml。

6、将 .ftl 存入项目,并动态化赋值。

在这里插入图片描述

三、代码实现

1、pom依赖

<!--        freemarker依赖-->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.28</version>
        </dependency>

2、实现代码

/**
     * @author: ZhengTianLiang
     * @date: 2022/05/18 23:24
     * @desc:
     */
    @GetMapping(value = "/test3")
    public void testExport3(HttpServletResponse response){
        Map<String, Object> dataModel = new HashMap<>();
        dataModel.put("id", "1909239239122342301");
        dataModel.put("date", "2019年 08 1月11 日");
        dataModel.put("company", "山东123省电力公司XXX供电公司");
        dataModel.put("bbb", "转账2123");
        dataModel.put("amount", "壹仟贰佰陆123123123拾捌元零贰分");
        dataModel.put("price", "1268.02");
        dataModel.put("content", "2019年7月XXXXX");
        dataModel.put("ddd", "转账2");
        
 // 全部都设置为1  是为了判断,字符串的长度样式的影响的
//        dataModel.put("id", "1");
//        dataModel.put("date", "1");
//        dataModel.put("company", "1");
//        dataModel.put("bbb", "1");
//        dataModel.put("amount", "1");
//        dataModel.put("price", "1");
//        dataModel.put("content", "1");
//        dataModel.put("aaa", "1");

        response.setCharacterEncoding("UTF-8");
        response.setHeader("Content-Disposition", "attachment; filename=books.doc");
        Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);
        //加载模板
        Template template = null;
        try {
//            template = wordConfiguration.getTemplate("document.ftl", "utf-8");
//            template = wordConfiguration.getTemplate("test5.ftl", "utf-8");
//            template = wordConfiguration.getTemplate("biao.ftl", "utf-8");
            template = wordConfiguration.getTemplate("msg.ftl", "utf-8");
            template.process(dataModel, response.getWriter());//response的Writer不需要我们手动关,tomcat会帮我们关的
        } catch (Exception e) {
            e.printStackTrace();
            logger.info("出错了");
            System.out.println("有何错了");
        }

    }

四、修改后的效果

完成上述问题的修改。
在这里插入图片描述

总结

大家也看出来了,代码很简单,主要还是 .dtl文件的生成。但凡又一步不对,估计样式就走形了(由于数据的长度不一致会把旁边的内容挤走),一把辛酸泪呀。如果大家有好的解决方案,也欢迎留言讨论。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值