java word

阅读: 评论:0

java word

java word

背景:因为项目需求,需要后端自动化生成word格式的报告,供用户下载。一开始选择的是freemarker,通过编写freemarker的xml格式的模板文件,结合后端生成的数据,通过Template的process,直接生成word文件。后因为报告里的图片过多,生成的word文件大小过大,打开速度较慢等原因,重新选择POI进行需求重写。

Freemarker生成word的一般步骤:

1.使用word工具(譬如wps),编写简易模板文件:

 因为是使用的wps编辑的文件,所以模板的效果完全可以随意生成,包括页边距、表格尺寸、背景颜色和文件颜色等,制作起来非常的方便。(这一点也是Freemarker的优点之一)

2.在wps里,将生成的word文件“另存为” ,保存成xml格式,其实,docx文档就是一个压缩包,一堆XML,一堆图片等,这也是Freemarker和POI可以自动生成的原因。打开“另存为”得到的xml文件,就可以看到其实word文档的实际内容

 3.将生成的xml文件进行格式化,这一步也很关键,因为“另存为”得到的xml文件,是压缩过的,不便于进行二次编辑。格式化的工具很多,这里我一般是用的在线代码格式化 这个在线网站进行格式化的,比较方便。格式化后的xml看起来就清爽多啦 ^_^

 4.对格式化后的xml文件进行二次编辑。主要有两大块需要进行处理:一是将所有需要填充文字的地方,使用变量进行替换。这里涉及到Freemarker的语法,大家可以自行百度 

二是要将图片文件引入,在xml头部通过循环的方式将图片进行定义(行30),在需要引入处再引用图片(行2666,行2992)

  <pkg:part pkg:name="/word/_l.rels" pkg:contentType="application/lationships+xml"><pkg:xmlData><Relationships xmlns=""> <#if failList?? && (failList?size > 0)><#list failList as fails><#list fails as fail><Relationship Id="rId1_fail_${fail.index}Png"  Type="" Target="media/image_fail${fail.index}.png"/></#list></#list></#if> </Relationships></pkg:xmlData></pkg:part>

5.将二次编辑好的模板文件保存后,放入到项目目录中去,我的项目是SpringBoot框架,就直接用我的项目来举例了

 

        <dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.23</version></dependency>
package com.shr.service.inspect.util.word;import com.shr.service.inspect.util.log.LogSender;
plate.Configuration;
plate.Template;
slf4j.Slf4j;
import org.springframework.stereotype.Component;import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.util.Map;@Component
@Slf4j
public class GenerateWord extends LogSender {public boolean write(Map<String, Object> root, File outFile, String templatePath){boolean result = false;try {templatePath = &#l";log.info("---GenerateWord write start");//创建配置实例Configuration configuration = new Configuration(Configuration.VERSION_2_3_23);configuration.setClassForTemplateLoading(GenerateWord.class, "/static");//设置编码configuration.setDefaultEncoding("UTF-8");// 获取模板Template template = Template(templatePath, StandardCharsets.UTF_8.name());//将模板和数据模型合并生成文件Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), StandardCharsets.UTF_8));template.process(root, out);result = true;} catch (Exception e) {("---GenerateWord write error {}----", e.getMessage());sendErrorLog("GenerateWord write error ", e.getMessage());} finally {return result;}}}

 6.组装数据后,将内容塞到File里去,再将File进行保存,就得到了想要的word文件了。

总结下Freemarker生成word的优缺点:

优点:

1.模板制作简单方便,可以制作一些复杂的效果,虽然POI也可以,但是没有Freemarker方便;

2.数据生成和模板制作是分开的,代码书写上比较清晰;

3.模板本身就有一套书写语法,模板支持if判断、for循环这些规则,为word生成提供了更多的便利。

缺点:

1.当word文件需要插入大量的图片时,生成的文件size很大(一般1000张图片的文档就会有200M),打开速度会很慢。这是我目前感受到的唯一的缺点。

网上有说它不支持集群应用、变量必须要赋值,不赋值就会抛出异常等缺点,我目前并未遇到过。

但就是这个缺点,就是最为致命的缺点,因为是用户可以直接感知到的问题,带来的用户体验很差,所以我又改用了POI重写了代码,在下个文章里我会介绍POI的开发流程,以及它的优缺点。

本文发布于:2024-02-02 19:31:21,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170687348145954.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:java   word
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23