java占位符填充_Java使用freemark生成word

1、制作模板

e8387618a75308df7fa68100b09e2b6f.png

先用office word做一个模板word文档,${usrName}、${nowDate}占位符

可以使用 office 或者 wps 先创建一个模板表格 (替换$部分可以在 模板格式改变之后 在替换xml 格式改了后有些原本的字符会分开)

2、用office word将模板word另存为xml

2113de07ccd355337ba36af88444c9ad.png

3、将xml文件的后缀改为.ftl

4、编辑.ftl文件

150b53ca751d99714d8ccadbdc200323.png

a、用${string}替换需要动态生成的数据,这一步在制作模板的时候就已经编写好了,这里不需要再编辑,需要主意的是在装换成xml文件的时候,占位符可能会被分成多个,如上面的${userName}可能会被分开成${userNam和e},这时需要把e}合到${userNam标签里面,并删除掉e}相关的标签。 也可以在这里进行替换 这样不用管分开的部分 b、表格循环用标签<#list table1 as object> (类似for (String[] object: table1 ){})

首先介绍几个标签,表格标签类似HTML的

,类似HTML的。每一个单元格,下面以表1为例子:

通过关键搜索找到表1的,在会有一些子标签,定义表格的一些格式,每一列的长度,我们不需要去修改标签的任何内容和格式,因为在制作模板的时候,已经设计好了。

的子标签还有,表示每一行的数据,所要做的是找到第二个(第一个是表格标题,固定的,不需要循环),然后删除掉第二个后面的,接下来将第二个包裹在循环标签<#list table1 as object> 内就行。

再接下来取出数据填充。依次找到、、、、(由于设计模板的时候,第四列里面的数据为空的,生成XML的时候是没有和,需要自己添加,建议设计模板的时候不要留空数据,避免这种情况出现),填充1(广州 || 37390379等)里面的数据,即将1改为${object[0]},object数组对象(<#list table1 as object> 中的object),0下标,很容易理解。

4024e71681e2a036ed7e9908c402397e.png

依照次方法修改其他的表格标签,至此模板已写完,接下来是编程部分。

package test.word;import java.awt.Desktop;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import freemarker.template.Configuration;
import freemarker.template.Template;public class Test {/*** 获取数据* @return* @throws Exception*/private static Map<String, Object> getData() throws Exception {Map<String, Object> map = new HashMap<String, Object>();map.put("userName", "admin");//对应模板中的${userName}map.put("nowDate", new Date().toString());//对应模板中的${nowDate}List<String[]> tablt1 = new ArrayList<String[]>();tablt1.add(new String[]{"1","广州","838973","--"});tablt1.add(new String[]{"2","佛山","115542","--"});tablt1.add(new String[]{"3","合计","955845","--"});map.put("table1", tablt1);//<#list table1 as object></#list>//其他数据return map;}public static void main(String[] args) throws Exception {createWord(getData(), "test.ftl", "F:/test/", "test"+System.currentTimeMillis()+".doc");}/*** * @param dataMap 数据* @param templateName 模板名称* @param filePath 保存文件路劲* @param fileName 保存文件名*/public static void createWord(Map<?, ?> dataMap, String templateName,String filePath, String fileName) {try {Configuration configuration = new Configuration();configuration.setDefaultEncoding("UTF-8");// ftl模板文件统一放至 test.ftl包下面configuration.setClassForTemplateLoading(Test.class, "/test/word/");// 获取模板Template template = configuration.getTemplate(templateName);File outFile = new File(filePath + File.separator + fileName);if (!outFile.getParentFile().exists()) {outFile.getParentFile().mkdirs();}// 将模板和数据模型合并生成文件Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "UTF-8"));// 生成文件template.process(dataMap, out);out.flush();out.close();Desktop desktop = Desktop.getDesktop();desktop.open(new File(filePath + File.separator + fileName));} catch (Exception e) {e.printStackTrace();}}
}

8875e24b964f0c1e9b0cc3a5d533551a.png

c31f10ecf644822a3717bfeefeabc964.png

ada60dc761686a958e5fe334d28369cb.png

resultmap 存入需要遍历到表格上去的数据 使用这个类里面的方法 传入参数配置好模板即可在浏览器页面实现 word导出功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536999.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中如何使用非阻塞异步编程——CompletableFuture

分享一波:程序员赚外快-必看的巅峰干货 对于Node开发者来说&#xff0c;非阻塞异步编程是他们引以为傲的地方。而在JDK8中&#xff0c;也引入了非阻塞异步编程的概念。所谓非阻塞异步编程&#xff0c;就是一种不需要等待返回结果的多线程的回调方法的封装。使用非阻塞异步编程…

城市运行一网统管_【宣传活动】持续开展城市运行“一网统管”建设宣传活动...

为进一步推进本镇城市运行“一网统管”建设工作&#xff0c;提高城市治理能力和治理水平&#xff0c;提升社会各界的知晓度和参与度&#xff0c;激发职能部门人员、党员、群众参与“一网统管”工作的热情。9月10日&#xff0c;镇网格中心于福泉居委会议室开展“推进城市运行‘一…

Java如何只使用位运算实现加减乘除

分享一波:程序员赚外快-必看的巅峰干货 前言 接前面一篇博客&#xff0c;这又是某个公司的奇葩面试题&#xff08;都说了到底是哪家公司才会出这种没营养的面试题&#xff09;。不过吐槽归吐槽&#xff0c;这个题目还是有点学问的&#xff0c;比前面那个 不使用比较运算符如何…

pmc订单表格_复工了,读一则“如何提升订单准交率和生产效率”的真实故事

故事发生在中国南方小镇上一个做办公家具的公司……家具公司创建于1995年&#xff0c;是一家集研发、生产、销售、服务为一体的现代办公家具、酒店家具制造企业。主要产品有实木班台系列、会议台系列、职员桌系列、屏风系列、沙发系列、办公座椅、酒店家具系列。在省外还有两个…

GET和POST请求到底有什么区别?

分享一波:程序员赚外快-必看的巅峰干货 看到这个标题&#xff0c;想必大部分人都已经想关掉这篇博客了。先别急&#xff0c;你真的知道这两个的区别吗&#xff1f; 做过WEB开发的朋友可能很熟悉&#xff0c;看到这个问题能立马脱口而出二者的区别。 GET在浏览器回退时是无害的…

有赞电商云应用框架设计

背景 有赞是 SaaS 公司&#xff0c;向商家提供了全方位的软件服务&#xff0c;支撑商家进行采购、店铺、商品、营销、订单、物流等等管理服务。 在这个软件服务里&#xff0c;能够满足大部分的商家&#xff0c;为商家保驾护航。 但是很多大商家往往会有自己的特殊需求&#xff…

vivado 如何创建工程模式_基于Vivado的FPGA高性能开发研修班2019年8月30日上海举行...

一、课程介绍&#xff1a;从7系列FPGA开始&#xff0c;Xilinx提出了Vivado Design Suite设计软件&#xff0c;提供全新构建的SoC 增强型、以 IP 和系统为中心的下一代开发环境&#xff0c;以解决系统级集成和实现的生产力瓶颈。同时&#xff0c;Xilinx专门针对Vivado推出了Ultr…

程序员的自我修养——远离“外包思维”

*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 在我们做开发的日子里&#xff0c;不免会进行跳槽&#xff0c;跳来跳去公司无非就分成两大类——互联网公司、外包公司。当然我们本次讨论的并…

英特尔为 Kubernetes 推出分布式深度学习平台:Nauta

2019独角兽企业重金招聘Python工程师标准>>> 随着人工智能的发展&#xff0c;深度学习的价值不断增长&#xff0c;但实现它可能是一个复杂耗时的过程。英特尔(Intel)正寻求通过其在 Kubernetes 进行分布式深度学习的新开源平台来改变这一状况&#xff0c;该深度学习…

pytorch梯度下降函数_Pytorch中常用的四种优化器SGD、Momentum、RMSProp、Adam

来源&#xff1a;AINLPer微信公众号编辑: ShuYini校稿: ShuYini时间: 2019-8-16 引言很多人在使用pytorch的时候都会遇到优化器选择的问题&#xff0c;今天就给大家介绍对比一下pytorch中常用的四种优化器。SGD、Momentum、RMSProp、Adam。随机梯度下降法&#xff08;SGD&#…

python计算无穷级数求和常用公式_傅里叶变换(二) 从傅里叶级数到傅里叶变换...

在上一部分当中&#xff0c;得到了利用三角函数表示周期函数的方法&#xff0c;但是对于非周期函数就...凉了。所以有什么办法吗&#xff1f;没办法&#xff08;划掉&#xff09;。这时候我们就需要拿出来我们的黑科技——傅里叶变换。一、傅里叶级数的推广当然这东西肯定不是凭…

中鸣投篮机器人怎么组装_1000余人参加洛阳市青少年机器人竞赛

机器人智能识别地面上的黑色线条&#xff0c;并沿着线条来到指定位置&#xff0c;放下“快递包裹”&#xff1b;无人机在空中飞舞&#xff0c;时而钻过圆环&#xff0c;时而来个空翻&#xff0c;犹如跳芭蕾般在空中划过一道优美曲线&#xff1b;橘红色乒乓球从筒道中送出&#…

Exchange队列优先级介绍和配置

一、场景 在日常办公环境中所有邮件都会存在重要与非重要的情况&#xff0c;并且不同的邮箱的使用人的级别也不一样&#xff0c;不一样的职位级别要求不一样的运维等级&#xff0c;以及发送邮件要求的速度也不一样。这就导致了邮件需要按照重要性进行分类&#xff0c;重要的邮件…

Mybatis源码阅读(一):Mybatis初始化1.3 —— 解析sql片段和sql节点

*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更…

添加请求头 retrofit_RxJava 与 Retrofit 结合的最佳实践

前言RxJava和Retrofit也火了一段时间了&#xff0c;不过最近一直在学习ReactNative和Node相关的姿势&#xff0c;一直没有时间研究这些新东西&#xff0c;最近有个项目准备写&#xff0c;打算先用Android写一个Demo出来&#xff0c;却发现Android的世界发生了天翻地覆的变化&am…

Mybatis源码阅读(二):动态节点解析2.1 —— SqlSource和SqlNode

*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更…

k8s边缘节点_边缘计算,如何啃下集群管理这块硬骨头?

导读边缘计算平台&#xff0c;旨在将边缘端靠近数据源的计算单元纳入到中心云&#xff0c;实现集中管理&#xff0c;将云服务部署其上&#xff0c;及时响应终端请求。然而&#xff0c;成千上万的边缘节点散布于各地&#xff0c;例如银行网点、车载节点等&#xff0c;节点数量甚…

Mybatis源码阅读(二):动态节点解析2.2 —— SqlSourceBuilder与三种SqlSource

*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更…

搞懂toString()与valueOf()的区别

一、toString&#xff08;&#xff09; 作用&#xff1a;toString&#xff08;&#xff09;方法返回一个表示改对象的字符串&#xff0c;如果是对象会返回&#xff0c;toString() 返回 “[object type]”,其中type是对象类型。 二、valueOf( ) 作用&#xff1a;valueOf房啊发返…

oracle入库的速度能到多少_倒车入库别练复杂了,其实就这两点

教练总会让学员反复练倒车入库&#xff0c;但不少学员都会有这样的疑惑&#xff1a;为什么每一次倒库结果都不一样&#xff0c;倒车入库的练习重点是什么&#xff1f;倒车入库是科二的重点及难点&#xff0c;但只要掌握以下两个关键&#xff0c;顺利通过真不难&#xff1a;01方…