【技术创作101训练营】如何使用freemarker生成Word文件?

发布于:2024-10-24 编辑:匿名 来源:网络

背??景有一天,产品经理递给我一份文字报告。我仔细一看,这份文档有大大小小的标题层次、格式良好的段落、各种饼图、趋势图,当然还有颜色循环交替的报告。

其复杂程度不亚于小明的学习报告。我准备通过某首歌曲来搜索关键词:java+word+export。

我立即想出了很多成熟的解决方案。通过横向和纵向比较,结合本次报告样式较多、用户可以灵活选择从不同模块导出的特点,最终我决定使用Freemarker动态替换模板数据导出word文档。

至于导出文档的最终格式,有两种选择: 应该使用 doc 还是 docx 格式的文档?每当我面临人生的选择时,我都会非常谨慎。最终我选择使用docx格式(原因会在文末解释),但是为了给大家更多的选择,满足更多的业务场景,小明借此机会给大家介绍一下两种使用 freemarker 导出 Word 文档的方法。

。 Idea FreeMarker是一个基于Java的模板引擎,最初专注于使用MVC软件架构生成动态网页。

然而,它是一个通用模板引擎,不依赖于 servlet、HTTP 或 HTML,因此它通常也用于生成源代码、配置文件或电子邮件。这时候我们就用它来动态生成xml文件,然后导出word文档。

整体流程如下: 准备WPS,由金山软件有限公司发布,用于办公软件最常用的文本编辑、表格、演示等功能。没错,就是这款国产办公软件。

除了它的强制登录之外,我也是第一次发现它在导出文档时像老朋友一样友好。 (Word解析的XML文件可读性很强,我不会告诉一般人) 开发工具(IDEA、Visual Studio Code等)自己喜欢、用得舒服的就是最好的。

实现Freemarker模板引擎的集成本项目使用的框架仍然是Springboot。这个框架非常方便集成各种组件,就不详细说了。

Freemarker 的这次集成也不例外。首先,我们在项目中添加依赖 spring-boot-starter-freemarkerpom.xml 文件,如下: 代码语言:javascript copy org.springframework.boot spring-boot-starter - freemarker按照默认约定,我们可以在resources下创建一个templates文件夹(查看FreeMarkerProperties源码可以发现默认目录就是这个)来存放模板文档。

application.yml 添加配置代码 language: javascript copy spring: freemarker: template-loader-path: classpath:/templates cache: false # 开发环境缓存关闭 suffix: xml charset: UTF-8 生成doc格式文档。这里,先使用freemarker。

以 doc 格式导出 word 文档的示例。首先,将docxTemplate.docx(调整后的样式模板文档)另存为WORD XML文档(*.xml)。

注意:如果您使用的是 Visual Studio Code 开发工具,请务必检查您使用的 xml 格式化插件是否会优化您的 xml 标签。例如: 将变为

使用Visual Studio Code的同学,天啊!小明这里推荐大家使用这个插件:XML Language Support by Red Hat 现在,我们将使用freemarker语法来编辑docTemplete.xml,比如使用占位符${}来替换当前文档的文本,从而实现动态生成文本的目的,直接输入代码即可。代码语言:javascript copy public static Configuration getConfiguration(){ //创建配置实例 Configuration configuration = new Configuration(Configuration.VERSION_2_3_28); //设置编码configuration.setDefaultEncoding("utf-8");配置.setClassForTemplateLoading(WordUtil.class , "/templates"); returnconfiguration;} /** * 生成doc文件* * @param ftlFileName 模板ftl文件名 * @param params 动态传入数据参数 * @param outFilePath 最终生成的doc文件完整保存路径*/ public void ftlToDoc (String ftlFileName, Map params, String outFilePath) { try { /** 加载模板文件**/ 模板 template = configuration.getTemplate(ftlFileName); /** 指定输出word文件的路径**/ File docFile = new File(outFilePath); FileOutputStream fos = new FileOutputStream(docFile);写入器 bufferedWriter = new BufferedWriter(new OutputStreamWriter(fos, "utf-8"), 0);template.process(params, bufferedWriter); if (bufferedWriter != null) { bufferedWriter.close(); } } catch (TemplateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }生成docx格式文档,带有高能警告!在成功使用Freemarker动态导出doc格式的文档后,相信大家都和我一样兴奋。

但上面的操作只是一个小小的铺垫。接下来我们看看如何导出docx格式的文档。

小明相信大家都会看到。官方惊呆了!这不,大开眼界!首先告诉大家一个秘密:docx格式的文档实际上是ZIP格式的压缩文件!什么?你不相信吗?验证方法如下:Windows朋友将docx文档修改为ZIP格式(将.docx后缀修改为.zip),然后通过解压工具解压。

MacOS的朋友可以直接使用unzip命令来解压word文档。解压后我们会发现该文件居然有自己的目录结构! document.xml文件用于存储核心数据、文本、表格、图片引用等。

media目录用于存储所有文档的图片。 _rels目录下的document.xml.rels存储配置信息,例如图片引用关系,即在document.xml中引用的id对应于media中的哪张图片。

获取zip中的document.xml文档和_rels文件夹中的document.xml.rels文档是显而易见的。如果我们想根据数据动态导出不同的word文档,我们只需要:通过 freemarker 将这些数据填充到 document.xml 中,并将图片配置信息填充到 document.xml.rels 文档中,然后使用文件流将此图片写入media目录中替换现有图片,最后添加填充好的document.xml和document.xml .rels,media即可以流式方式写入zip,输出docx文档!上代码吧嗯,由于篇幅限制,代码可以在文末找到。

Github地址问题和解决方案。当然,当每个人第一次尝试做某件事时,它可能不会一蹴而就。

例如,导出word时,您可能会遇到以下问题。特殊字符问题:有些文本数据不可避免地包含特殊字符,例如:< > @ ! $&等。

解决办法:这些特殊字符如果不进行转义,会导致单词无法打开。例如表中超链接的&符号需要替换为&。

如果您的文档在Office中打开,会提示文件已损坏。 ,90%是由特殊符号引起的。

我们可以打开文档。例如: 代码语言:javascript copy 图片变形问题:因为echarts生成的图表是响应式的,屏幕尺寸不同,分辨率会导致前端传输过来的图像每次的宽高比例不一致。

如果直接按照之前的比例将图像放入文档中,会导致生成的文档中的图像变形。思路:首先将文档中的图片设置为原图,然后锁定宽高比,调整图片到合适的大小,从document.xml中解压文档,获取图片对应的宽高值此时的word,如下图: 为了保证文档中不同像素比例的宽高不变形,我们需要固定cy的值,然后动态获取表示的宽度cx的值word中当前图像的像素比例基于固定比例。

计算方法如下: 公式: 代码语言: javascript copy a/b = x/y。其中,a代表word中图片的宽度值,b代表word中图片的高度值,x代表前端传过来的图片的宽度(单位:像素),y代表前端传过来的图像的高度(单位:像素)。

因此,给定b、x、y,根据公式,我们可以求出a;我在文章的最后。当然,还有一些需要注意的地方:如果word中有很多模块,使用Freemarker语法时要更加小心;为什么小明要导出docx格式的文档呢? (不是因为产品经理提出的需求吗?)因为该文档是doc格式的,小明尝试导出后发现该文档不是合法的doc文档。

这体现在:在手机(微信、钉钉)上无法正常预览、office提示以xml格式打开等。因此,在导出doc文档时,我们填写完document后得到的是什么呢。

我们平时使用的生产环境是Linux……因此,经过深思熟虑和权衡,我们最终选择导出docx格式的文档。这个方法很完美,也保证了目前主流应用的正常预览。

敲黑板!导出docx文档最重要的思想就是用这些数据写入并覆盖模板文件(在业务中,相当于后门列表),并重新输出zip格式的压缩文件。这个文件就是我们最终想要的文档。

以上就是小明单词导出的来龙去脉。已经在线平稳运行了几十个日日夜夜。

如果您曾经遇到过或目前正在遇到Word文档导出和开发的问题,欢迎您与我们讨论和交流。相关链接:我上传了工具类,包括doc和docx的导出,导出word文档时特殊符号的转义,以及将图片转换为Base64进行文件输出的方法。

【技术创作101训练营】如何使用freemarker生成Word文件?

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • 「褀氏生物」完成数千万元A轮融资

    「褀氏生物」完成数千万元A轮融资

    今日,「褀氏生物」宣布完成数千万元A轮融资。 本轮融资由景泽资本投资,募集资金将用于新产品研发和全球营销渠道建设。 褀氏生物科技成立于2007年,是家主创办的一家以自动化体外诊断系统平台为方向的科技公司。 目前研发方向涵盖细胞学体外诊断、免疫学体外诊断等领域。

    06-18

  • 安徽某县级引导基金招募GP

    安徽某县级引导基金招募GP

    萧县政府产业引导基金子基金管理机构招聘公告 根据《萧县政府产业引导基金管理办法(试行)》(萧政秘【】39号),萧县政府产业引导基金(以下简称(简称“基金之父”)现面向子基金管理机构公开征集。 具体公告如下: 一、子基金基本情况 (一)基金规模 子基金规模原则上不

    06-18

  • 小分子药物开发商“凌科药业”获5000万美元B轮融资,助力药物创新研发

    小分子药物开发商“凌科药业”获5000万美元B轮融资,助力药物创新研发

    投资界(ID:pedaily)8月27日消息,投资界获悉,近期,创新药研发开发公司凌科药业(杭州)有限公司(以下简称“凌科药业”)宣布完成1万美元B轮融资。 本轮融资由礼来亚洲基金领投,联芯资本、杭州和达生物医药产业基金跟投。 此外,现有投资者君联资本、鼎力资本继续加大投

    06-18

  • 佳源科技:2020年亏损近2亿元,同比下降超40%

    佳源科技:2020年亏损近2亿元,同比下降超40%

    今年佳源科技实现营业收入12.02亿元,同比下降16.86%;利润总额2.1亿元,同比下降44.70%;实现归属于母公司所有者的净利润1.85亿元,同比下降43.80%;扣除非经常性损益后归属于母公司所有者的净利润1.63亿元,同比下降48.04%。 听,中小企业反馈平台。 倾听用户需求,倾听创业

    06-18

  • 总投资55亿元的芯投微电子滤波器研发生产总部项目已封顶

    总投资55亿元的芯投微电子滤波器研发生产总部项目已封顶

    芯投微 据芯投微官方微信公众号消息,9月16日,芯投微电子滤波器研发生产总部项目封顶仪式隆重举行。 据悉,该项目总投资55亿元,位于安徽省合肥市高新技术产业开发区。 今年12月正式开工建设,计划于2019年投入运营。 项目建成初期将重点发展射频滤波器设计、研发、生产业务

    06-06

  • 专注敏感数据访问控制,“中图吉人”完成线性资本领投的数千万元Pre-A轮融资

    专注敏感数据访问控制,“中图吉人”完成线性资本领投的数千万元Pre-A轮融资

    投资界动态(ID:pedaily)9月15日消息,专注敏感数据访问控制安防厂商“看图识人”近日完成数千万元Pre-A轮融资。 据介绍,本轮融资由线性资本领投,驰星创投跟投,航程资本提供财务顾问服务。 中图世人成立于今年11月,目前专注于敏感数据访问控制,目标是将每个数字身份与

    06-18

  • 5亿,亿达资本设立无锡人才2号基金

    5亿,亿达资本设立无锡人才2号基金

    据投资界5月17日消息,无锡高新投资亿达鼎奇人才创业投资合伙企业(有限合伙)(简称:亿达无锡人才2号) 2基金)正式注册,基金规模5亿元。 亿达无锡人才二号基金由亿达资本与无锡市滨湖区政府共同发起设立。 主要围绕太湖湾科技创新带建设“十四五”规划,投资符合无锡太湖

    06-17

  • 能链集团获2亿美元战略融资,华兴资本独家FA

    能链集团获2亿美元战略融资,华兴资本独家FA

    能链集团近日宣布完成新一轮2亿美元战略融资,贝恩资本领投,老股东Joy资本持续投入,华兴资本担任独家FA。 独家财务顾问。

    06-17

  • Infinite Fund See Fund二期基金已完成募资6亿

    Infinite Fund See Fund二期基金已完成募资6亿

    投资界(ID:pedaily)5月23日报道,近日,Infinite Fund See Fund二期基金已顺利完成募资6亿,登陆山西。 负责人此前曾透露,See Fund二期基金拥有规模更大的LP资金,并得到了三一重工、中兴通讯等企业的支持。 去年2月,Infinite Fund See Fund完成首笔募资2亿元。 LP阵容极

    06-17

  • VR广告来了,你准备好了吗?

    VR广告来了,你准备好了吗?

    随着扎克伯格在世界移动大会(MWC)上通过VR与记者互动的照片广泛传播,越来越多的人开始关注VR,国内外的各类企业也开始尝试VR创业。 数据显示,短短一年时间,VR技术相关专利申请数量就达到1万件,瞬间爆发。 而考虑到Oculus Rift被Facebook以20亿天价收购的消息,人们也越

    06-18

  • 红杉资本推出规模500-6亿美元的加密货币投资基金

    红杉资本推出规模500-6亿美元的加密货币投资基金

    据The Block报道,红杉资本推出规模500-6亿美元的加密货币投资基金,主要投资流动性代币,包括已在加密货币交易所上市及尚未上市的代币,单个项目投资规模在10万至1万美元之间,计划参与从质押到提供流动性再到治理等流程。 这是红杉资本自2017年成立以来的首只行业专项基金

    06-17

  • 智能硬件厂商,为何要撬动11万亿美元的蛋糕?

    智能硬件厂商,为何要撬动11万亿美元的蛋糕?

    上周(2019年7月7日),麦肯锡全球研究院最新报告发布。 该机构认为,当前市场对物联网的炒作仍然低估了物联网市场的潜力。 同时,麦肯锡还预测,到2020年,物联网产业可为经济市场带来高达11.1万亿美元(约合人民币73万亿元)的价值。 这一数值高于中国每年的GDP产值(10.4万

    06-18