Java使用ftl模板文件生成Word,以及Word转换图片或Pdf工具类

23 篇文章 1 订阅
订阅专栏

Java使用ftl模板文件生成Word

一、写在前面

最近在项目中使用打印功能,发现这个功能我已经写过多次了,下面这个文章的发步日期在2020年,不得不感慨时间之快啊。
https://blog.csdn.net/weixin_43238452/article/details/109636200?spm=1001.2014.3001.5501
下面介绍一下应用场景:这次项目依旧是springboot项目,使用ftl模版生成的word文件。比上一版相比更加灵活而且实用性更高,还可插入base64图片进行展示
关于ftl模板我会简单介绍一下使用的心得,其实也是一些标签而已,熟悉以后操作起来也比较快

二、word转ftl模板,ftl标签简单介绍
1.找到使用的word模板(如图是我自己编写的一个word模板,后续会以此进行操作)

在这里插入图片描述

2.左上角点击另存为xml文件

在这里插入图片描述

3.直接将保存的xml文件改后缀名为 ftl 然后放到项目 resources/static 目录下。进去之后idea会自动格式化,如果没有,建议按ctrl+f搜索对应的汉字进行定位(注:模板必须在static目录下,改个英文名防止乱码)

在这里插入图片描述

4.标签及语法
(1)替换标签可以是对象点属性也可以是单个变量

在这里插入图片描述

(2) 循环标签,如图会根据list的大小进行循环赋值

在这里插入图片描述

(3)判断标签如图,第一个为判断cks遍历下标是否大于5,第二层为判断cks是否拥有下一个数据

在这里插入图片描述

5.代码编写
1.导入maven依赖,freemarker和word工具类依赖aspose-words,后者可点击 下载,下载jar包后自行打入maven仓库,我是直接导入的依赖坐标
		 <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
        </dependency>

        <dependency>
            <groupId>com.luhuiguo</groupId>
            <artifactId>aspose-words</artifactId>
            <version>22.10</version>
        </dependency>
2.模板替换工具类

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.Version;
/**
     * 
     * @param dataMap 存储数据的map集合
     * @param savePath 生成word保存路径
     */
    public static void ftl2Word(Map<String, Object> dataMap, String savePath) {
        try {
            Configuration configuration = new Configuration(new Version("2.3.0"));
            configuration.setDefaultEncoding("utf-8");
            //.ftl配置文件所在路径
            Template template = configuration.getTemplate("demo.ftl", "utf-8");
            /*File file = new File("resources/static");
            String absolutePath = file.getAbsolutePath();*/
            //上面获取路径有bug,absolutePath 既存demo.ftl的路径,不包含demo.ftl
            // 如:D:\IdeaProjectsTwo\beauty-master\beauty-main\src\main\resources\static
            configuration.setDirectoryForTemplateLoading(new File(absolutePath));
            //输出文档路径及名称
            File outFile = new File(savePath);
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),
                    "utf-8"), 10240);
            template.process(dataMap, out);
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
3.word工具类
/**
 * @Author: SongTiankai
 * @Description: word工具类
 * @Date: 2022/12/9 19:34
 * @Version: 1.0
 */
public class WordUtil {


    /**
     * @Description: 验证aspose.word组件是否授权:无授权的文件有水印标记
     */
    public static boolean isWordLicense() {
        boolean result = false;
        try {
            String s = "<License><Data><Products><Product>Aspose.Total for Java</Product><Product>Aspose.Words for Java</Product></Products><EditionType>Enterprise</EditionType><SubscriptionExpiry>20991231</SubscriptionExpiry><LicenseExpiry>20991231</LicenseExpiry><SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber></Data><Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature></License>";
            ByteArrayInputStream inputStream = new ByteArrayInputStream(s.getBytes());
            com.aspose.words.License license = new com.aspose.words.License();
            license.setLicense(inputStream);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    
    public static void word2pdf(String docPath, String savePath) {
        try {
            String s = "<License><Data><Products><Product>Aspose.Total for Java</Product><Product>Aspose.Words for Java</Product></Products><EditionType>Enterprise</EditionType><SubscriptionExpiry>20991231</SubscriptionExpiry><LicenseExpiry>20991231</LicenseExpiry><SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber></Data><Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature></License>";
            ByteArrayInputStream is = new ByteArrayInputStream(s.getBytes());
            License license = new License();
            license.setLicense(is);
            com.aspose.words.Document document = new com.aspose.words.Document(docPath);
            document.save(new FileOutputStream(new File(savePath)), SaveFormat.PDF);
        } catch (Exception e) {

            e.printStackTrace();
        }
    }


    public static void word2Image(String docPath, String savePath) {
        try {
            String s = "<License><Data><Products><Product>Aspose.Total for Java</Product><Product>Aspose.Words for Java</Product></Products><EditionType>Enterprise</EditionType><SubscriptionExpiry>20991231</SubscriptionExpiry><LicenseExpiry>20991231</LicenseExpiry><SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber></Data><Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature></License>";
            ByteArrayInputStream is = new ByteArrayInputStream(s.getBytes());
            License license = new License();
            license.setLicense(is);
            com.aspose.words.Document document = new com.aspose.words.Document(docPath);
            document.save(new FileOutputStream(new File(savePath)), SaveFormat.PNG);
        } catch (Exception e) {

            e.printStackTrace();
        }
    }

}
6.工具测试
1.测试代码
@ApiOperation("word测试接口")
    @PostMapping("/testCreat")
    public ResultData testCreat() {
        Map<String, Object> dataMap = new HashMap<>();
        dataMap.put("ckd", "生产一车间");
        dataMap.put("llrq", DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
        dataMap.put("llbm", "领料部");
        dataMap.put("kgy", "王武");
        dataMap.put("zg", "占山");
        dataMap.put("llr", "里斯");
        WordUtil.ftl2Word(dataMap, "D:\\home\\word\\ckd.doc");
        WordUtil.word2Image("D:\\home\\word\\ckd.doc", "D:\\home\\word\\ckd.png");
        WordUtil.word2pdf("D:\\home\\word\\ckd.doc", "D:\\home\\word\\ckd.pdf");
        return new SuccessResultData();
    }
2.pdf

在这里插入图片描述

3.word

在这里插入图片描述

4.png

在这里插入图片描述

7.小结

至此功能实现,今天太晚了,明天研究一下路径获取,更新后给大家贴代码!
如果对你有帮助,希望可以一键三连!
感谢!

Java使用freemarker生成word文档并转pdf文档
weixin_40862635的博客
01-21 4023
freemarker生成word文档后转pdf先来看看效果图进入正题功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 项...
java根据模板生成pdf文件并导出(iText)
热门推荐
小小刚CSDN
07-09 2万+
java根据模板生成pdf文件并导出首先你的制作一个pdf模板:1.先用word做出模板界面2.文件另存为pdf格式文件3.通过Adobe Acrobat pro软件打开刚刚用word转换成的pdf文件(注:如果没有这个软件可以通过我的百度云下载,链接:http://pan.baidu.com/s/1pL2klzt)如果无法下载可以联系博主。4.点击右边的"准备表单"按钮,选择"测试.pdf"选择...
word转FreeMarker的ftl文件编辑导出编辑后的word
阿尔法小师妹
11-06 7699
1.ftl文件介绍 ftl是Freemarker模板文件后缀名 FreeMarker其实是一种比较简单的网页展示技术,说白了就是网页模板和数据模型的结合体。这种结合模式的好处就是,分离了网页界面设计人员和编程人员的工作,让他们各司其职。 FreeMarker大致的工作方式是,网页模板里面嵌入了数据模型中的数据、FreeMarker自定义流程控制语言、FreeMarker自定义的操作函数等等,在...
Java根据ftl模板生成多表格复杂性word文档
12-09
Java根据ftl模板生成多表格复杂性word文档,工程可直接导入eclipse中执行的。
使用ftl模板生成word文档
最新发布
weixin_47423303的博客
09-13 423
1、修改模板后缀修改为zip,打开zip包,拿到word文件夹下的document.xml,修改为flt文件,并将文件放在src/main/resources/wordTemplate/document.ftl使用ftl模板生成doc文档后,发现无法使用Microsoft Edge在线查看生成的文档,应客户需求实施优化措施:使用ftl模板生成docx文档。2、使用Ctrl+Alt+L进行格式化,将【insert】使用${}填充。一、处理docx模板
java使用ftl模板导出word文档
qq_62726444的博客
08-09 4069
java使用ftl模板导出word文档
java利用ftl生成word简单实例
07-04
近日项目涉及到Word的导出,四处需找资料。可惜网上实例太少,只好根据别人的思路写一下这个简单的实例。以后也许会补充图片导出Word模块,敬请其代表吧!还有,本实例只适合初学者。大牛绕路。当然本实例也存在不足之处,请各位多多包含。
模板引擎:ftl文件生成word
程序和我有一个能跑就行了
12-19 2997
FreeMarker 是一个用 Java 语言编写的模板引擎,基于模板生成文本输出
java根据ftl模板生成word文档
Tarzan的博客
06-17 7909
java根据ftl模板生成word文档
freemarker无损生成word.pdf
06-28
总结以上知识点,我们知道使用Freemarker生成Word文档的过程涉及到创建Word模板、替换标记为Freemarker变量、配置Freemarker环境、准备数据模型,以及使用Freemarker模板引擎填充数据生成最终文档。需要注意的是,...
Java导出Word文档的实现.docx
04-24
1. **Hutool的Word工具类**:这是一个简洁易用的Java工具库,其提供的Word工具类可以方便地生成简单的Word文档。然而,它的局限在于无法创建包含复杂表格的文档。 2. **Apache POI和FreeMarker**:Apache POI是Java...
[itext]Java生成PDF文件
SKMNB的博客
10-27 6721
Java开发生成PDF上传到服务器,并下载。
使用ftl模板生成word
sinat_24328329的博客
11-09 685
java使用ftl模板生成word
java使用ftl模板生成word的坑
baidu_16250655的博客
07-10 202
2、如果出现报错java.lang.StringIndexOutOfBoundsException: String index out of range: -15,需要打断点跟一下,PoiPublicUtil类的getRealValue方法,有可能是读取模板的时候把参数{{data}}正好分割为{{和data}}读取了,这个时候找到相应位置手动换行一下就行。1、每次重新编辑模板后,需要保存模板并关闭,重启项目才生效;
ftl生成word输出
weixin_42538406的博客
07-06 224
ftl生成word输出 百度方式: 1.导包,用ftl生成word,常见问题可百度。 2.关于表格 1 2 3 4 a b c d 表格纵列和横列,abcd就是数据,用循环可导 常见百度即可。 关于1234,如果列需要查询数据库才能得出结论,要采用“合并单元格”的解决办法。 如果,列可以确定大致位置,多做几个模板,按照传参数量决定用哪个文件生成word,多写几个模板 或者多占位。 ...
JAVA用.ftl模板文件生成PDF(含生成代码)
len的博客
09-07 9036
场景:产品提了个需求,要求按照他给的原型格式生成一个PDF文件。 (这是产品给的原型) 解决思路:可以先写一个.ftl模板文件(其实也就是一个html页面),然后预留对应的字段放入map中进行替换(其中data11....都是要替换的) 注: Freemarker是一个模板框架,主要是为了加快染速度而产生的。它与web容器无关,只要是关于模板生成一些代码的都可以使用它完成。 比如xml,Java代码的生成等。 其他类似的模板框架还有velocity。 贴出部分map代码: Map&l
Java通过Ftl模版创建doc文件
qq_15596257的博客
07-18 705
Java通过Ftl模版创建doc文件
freemarker ftl模板_java 根据模板生成word(基于freemarker模板引擎)
weixin_39760619的博客
11-30 370
FreeMarker 是一款基于Apache许可证2.0版本发布的免费模板引擎,是一个java类库,可以简单的根据模板生成word文件。其原理大概就是先做一个word模板, 该模板中变量数据用${xxx}这种方式填写, 然后再导出时只需读取模板然后用相应的数据替换其中的${xxx}即可。1, 新建一个word文档,输入如下内容2, 将该word文件另存为xml格式(注意是另存为,不是直接...
使用ftl生成word
weixin_43988238的博客
12-14 947
背景:根据word模板下载wordword里面需要填充数据,格式是固定的。首先在word中给数据起个变量名称 需要更换的数据改成${变量名!},必须是英文的,加感叹号是为了防止null,如果数据是null,文档下载下来后会直接显示null,加上感叹号就不会,没数据就是空。也可以不加感叹号,在代码设置下属性即可,后面会说到。变量名结束后把word另存为xml 然后复制到项目中,我用的是idea,打开后会发现就几行,后面老长了 然后format下ctrl+alt+L(快捷键仅供参考,本人是这样的),就会
FreeMarker创建一个根据.FTL模板生成一个word文档
05-19
FreeMarker 是一个Java模板引擎,它可以帮助我们根据模板生成各种文件,包括 Word 文档。下面是一个简单的示例,演示如何使用 FreeMarker 创建一个根据 FTL 模板生成 Word 文档的过程: 1. 创建一个 FreeMarker 的配置对象,并设置模板文件所在的目录: ``` Configuration cfg = new Configuration(Configuration.VERSION_2_3_30); cfg.setDirectoryForTemplateLoading(new File("path/to/ftl/templates")); ``` 2. 从配置对象中获取模板对象: ``` Template template = cfg.getTemplate("template.ftl"); ``` 3. 准备数据模型,可以是一个 JavaBean、Map 或者其他类型的对象: ``` Map<String, Object> data = new HashMap<>(); data.put("title", "Hello, World!"); data.put("content", "This is a test document created by FreeMarker."); ``` 4. 创建一个 Writer 对象,用于输出生成Word 文档: ``` Writer out = new FileWriter(new File("path/to/output/doc.docx")); ``` 5. 将数据模型和 Writer 对象传递给模板对象,生成 Word 文档: ``` template.process(data, out); ``` 完整的示例代码如下: ``` import freemarker.template.Configuration; import freemarker.template.Template; import java.io.File; import java.io.FileWriter; import java.io.Writer; import java.util.HashMap; import java.util.Map; public class FreeMarkerDemo { public static void main(String[] args) throws Exception { // 创建 Configuration 对象 Configuration cfg = new Configuration(Configuration.VERSION_2_3_30); cfg.setDirectoryForTemplateLoading(new File("path/to/ftl/templates")); // 获取模板对象 Template template = cfg.getTemplate("template.ftl"); // 准备数据模型 Map<String, Object> data = new HashMap<>(); data.put("title", "Hello, World!"); data.put("content", "This is a test document created by FreeMarker."); // 创建输出流 Writer out = new FileWriter(new File("path/to/output/doc.docx")); // 生成 Word 文档 template.process(data, out); // 关闭输出流 out.close(); } } ``` 注意,上面的示例代码中使用模板文件FTL 格式,如果要生成 Word 文档,还需要将模板文件转换成 docx 或者其他 Word 文档格式。常见的工具包括 Apache POI 和 Docx4j 等。
写文章

热门文章

  • 前端HTML页面获取实时天气预报并展示 19036
  • Java代码在Word中的指定位置插入一张图片 18289
  • springboot项目实现站内信功能记实 17463
  • Java springBoot项目整合海康威视摄像头抓拍车辆功能 14033
  • SpringCloud项目搭建步骤 8892

分类专栏

  • 自建项目 5篇
  • 笔记 8篇
  • 海康sdk开发 1篇
  • 代码生成器 1篇
  • 电商项目,常见bug 1篇
  • sqlserver使用 2篇
  • 工具类 23篇
  • 前端页面调整方法 3篇
  • Css、Js、前端学习 3篇

最新评论

  • Java使用ftl模板文件生成Word,以及Word转换图片或Pdf工具类

    风逝葬: 感谢博主,完美解决了我的问题

  • Java使用ftl模板文件生成Word,以及Word转换图片或Pdf工具类

    柒柒曲: 博主有个问题,按aspose-words转换pdf 在Linux服务器会乱码的,本地的都是可以的 ; 不知道博主怎么解决的呢 ?

  • Java springBoot项目整合海康威视摄像头抓拍车辆功能

    Bl_ACKMiRROR: 大佬,为什么我多个设备只能收到一个报警, [code=java] @PostConstruct public void doTask() { clientTask01(); clientTask02(); } /** * 启动人流量检测设备 */ public void clientTask01() { Runnable run = new RunClient01(); executor.execute(run); } /** * 启动人流量检测设备_2 */ public void clientTask02() { Runnable run = new RunClient02(); executor.execute(run); } /** * client人流量监控布防线程 */ class RunClient01 implements Runnable { @Override public void run() { try { customMultiThreadingService.executeAsyncTask(client01); } catch (InterruptedException e) { e.printStackTrace(); } } } /** * client人流量监控布防线程 */ class RunClient02 implements Runnable { @Override public void run() { try { customMultiThreadingService.executeAsyncTask(client02); [/code]

  • 后端Websocket互相通信功能实现

    爪哇Bubble: 一直监听消息,需要开一个线程。可以调用推送前端的socket去推送消息,写到对应的方法体中就可以

  • 后端Websocket互相通信功能实现

    诗语者: 这个可以适用于后端转发其他后端的websocket给前端吗,还有死循环的含义是?谢谢

大家在看

  • 如何彻底销毁硬盘数据
  • 22年计挑赛Python组区域赛个人解答
  • C++试题带答案 404
  • 大数据的误区 168
  • 【Spring篇】Spring的Aop详解

最新文章

  • 从零开始,手撸一套基础框架(第二章 配置集成)
  • 从零开始,手撸一套基础框架(第一章 项目搭建)
  • 树结构构建,字典树快速生成。
2024年2篇
2023年1篇
2022年15篇
2021年8篇
2020年10篇
2019年12篇

目录

目录

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爪哇Bubble

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

玻璃钢生产厂家苏州玻璃钢雕塑加工朔州玻璃钢卡通雕塑山西省玻璃钢雕塑哪家强平凉玻璃钢卡通雕塑报价玻璃钢运动人物雕塑山东特色玻璃钢雕塑设计玻璃钢动物雕塑出售郑州室内玻璃钢彩绘雕塑制造贵阳商场美陈样式广东玻璃钢雕塑公司招聘唐山玻璃钢雕塑哪家强偃师玻璃钢雕塑定制祖庙园林玻璃钢人物雕塑曲靖玻璃钢雕塑制作厂家溧阳玻璃钢马雕塑玻璃钢雕塑钢琴云南临沂玻璃钢花盆哪个品牌西藏玻璃钢铜鹤雕塑主题商场美陈销售韶关玻璃钢雕塑怎么样山西方形玻璃钢花盆深圳玻璃钢雕塑浮雕厂湖南动物玻璃钢雕塑价位广东儿童乐园玻璃钢雕塑丽水商场商业美陈定制价格昌吉玻璃钢雕塑厂家嘉兴玻璃钢人物雕塑厂家价格玻璃钢园林雕塑摆件上海动物玻璃钢雕塑厂家上海商场主题创意商业美陈哪家好香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化