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文件的生成。但凡又一步不对,估计样式就走形了(由于数据的长度不一致会把旁边的内容挤走),一把辛酸泪呀。如果大家有好的解决方案,也欢迎留言讨论。