java通过freemarker导出word循环合并表格单元格

本文主要讲解通过freemarker模板引擎来导出word,并且在word中包含表格的合并部分需要循环生成。

一、Java需要通过模板导出的word

如上图所示。物品的信息是循环部分。但是前面的表格是合并固定的。接下来我们将通过freemarker模板的方式来导出上述格式

二、创建freemarker模板

2.1首先将word的源文件另存为xml格式文件,如下

用文本工具打开xml文件。notepad++ 或者sublimetext都可以

打开后如上图,看起来很乱。这时候需要进行xml格式化。欢迎使用本站xml格式化工具

格式化以后如下:

格式化以后就好看多了。

首先我们需要去找到我们需要循环的表格

物品信息就是我们要循环的开始部分。

在这之前需要科普下word的xml是如何实现单元格合并的

主要就是

两个标签的组合。

首先了解下word的表格标签

物品信息

物品名称

物品数量

2

上面是合并单元格的首行,所以你可以找到标签

标签说明:

---行标签

---单元格标签

我们继续看下面的一行xml

第二行表格xml:

物品说明

刀非常

锋利

继续第三行:

上架时间

2

019

-

08

-

09

上架人

小左

从第二行,第三行可以找到标签,标识这这列产生了合并

并且就在第一个单元格内。

那么模板就好改了。思路:

首先循环判断是否第一条数据

第一条数据那么就使用行1的格式。后面的都使用合并后的格式

提取需要做模板的几行进行组建,通过上面我们可以知道,其实我们就是要循环以下三行表格:

物品信息

物品名称

物品数量

2

物品说明

刀非常

锋利

上架时间

2

019

-

08

-

09

上架人

小左

接下来就针对这部分进行模板标签的编写

说明:Java代码后面给出,现在说明的是集合的key为 goodsList(物品集合)

循环片段代码格式缩进后如图

图6

上图其实就是判断了是否第一条记录,第一条记录和后面记录的区别就是第一行的第一个单元格,第一条记录的第一个单元格是写的”物品信息“后面的记录第一个单元格都是合并单元格的cell代码。

以下为循环片段代码:

物品信息

物品名称

${goods.name}

物品数量

${goods.number}

物品说明

${goods.description}

上架时间

${goods.time}

上架人

${goods.user}

物品名称

${goods.name}

物品数量

${goods.number}

物品说明

${goods.description}

上架时间

${goods.time}

上架人

${goods.user}

#if>

#list>

将上面代码放入demo.xml文件中替换掉原来的两个假数据行。替换后如下:(由于数据多,这里就截图展示)

将上诉的demo.xml保存并改为demo.ftl即完成freemarker的模板。

提示:这里说下为啥要if else ,因为第一次生成的行需要展示合并的单元格,后面的整个数据都是一个合并标签。当然简单化也可以在第一行的第一个单元格做if else不需要像我这样整个循环体做if else

三、编写freemarker模板导出复杂格式word代码

首先把上面制作的demo.ftl放入Java项目的classpath目录下

Java数据模型Goods

$title(Goods.java)

package demo;

public class Goods {

public Goods(String name, Integer number, String description, String time, String user) {

this.name = name;

this.number = number;

this.description = description;

this.time = time;

this.user = user;

}

String name;

Integer number;

String description;

String time;

String user;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Integer getNumber() {

return number;

}

public void setNumber(Integer number) {

this.number = number;

}

public String getDescription() {

return description;

}

public void setDescription(String description) {

this.description = description;

}

public String getTime() {

return time;

}

public void setTime(String time) {

this.time = time;

}

public String getUser() {

return user;

}

public void setUser(String user) {

this.user = user;

}

}

导出代码:

$title(ComplexWordExport.java)

package demo;

import freemarker.template.Configuration;

import freemarker.template.Template;

import java.io.*;

import java.text.SimpleDateFormat;

import java.util.*;

public class ComplexWordExport {

public static void main(String[] args) {

try {

// 创建模拟数据

List goodsList = new ArrayList<>();

for (int i = 0; i < 4; i++) {

goodsList.add(new Goods("刀" + i, i + 2, "到很好不错,数量多+" + i,

new SimpleDateFormat("HH:mm:ss:SSS").format(new Date()), "用户" + i));

}

Map dataMap=new HashMap<>();

dataMap.put("goodsList",goodsList);//注意这里的key与目标中的数据对应

File wordFile = new File("d:/demo.doc");// 注意这里只能输出doc,不能直接输出docx

Configuration configuration = new Configuration();

configuration.setDefaultEncoding("UTF-8");

configuration.setClassForTemplateLoading(WordTest.class, "/");

// 模板来源

// 1.创建一个word文件可以是doc或者docx的

// 2.在需要使用变量的地方用占位符占位

// 3.将word文档另存为xml文件

// 4.打开xml文件将里面的占位符替换为freemarker的表达式

// 5.重命名xml为ftl

// 6.完成

Template template = configuration.getTemplate("demo/demo.ftl", "UTF-8");//路径相对于项目的classpath

try (Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(wordFile),"UTF-8"))) {

template.process(dataMap, out);

out.flush();

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

四、导出结果

注意:导出文件必须是.doc因为docx会验证xml里面的一些数据导致文件打不开。

java word导出表格_Java Word模板导出包含表格单元格合并相关推荐

  1. java怎么导出有模板的表格_java用模板导出数据表格-Go语言中文社区

    1.创建表格: 2.编写导出的controller; @PostMapping("/cust/report/customer/export") public void export ...

  2. java excel条件格式_Java 使用条件格式高亮Excel单元格

    通常Excel文档包含了很多行和列,为了方便查看和分析其中的数据,我们可利用条件格式将某些符合特定要求的数据高亮显示出来.比如,高亮低于或高于平均值的数值.高亮最高值或最低值.高亮重复或唯一的数值.本 ...

  3. java pdf 导出下载_Java+PDF模板导出成pdf文件,并下载

    1,根据前人经验,熟悉完成基础操作:https://www.cnblogs.com/wangpeng00700/p/8418594.html?tdsourcetag=s_pcqq_aiomsg 2,根 ...

  4. 手机端java编辑器验证正确_java – 使用编辑器验证表的单元格

    我的JTable有一个密码字段编辑器.我想在用户单击编辑另一个字段时,如果文本长度小于8位,则显示错误消息.我尝试过焦点听众.但它不起作用.请帮帮我,因为我刚刚开始使用 java swing. cla ...

  5. 利用poi 1.6 通过模板导出复杂 Word表格,包含合单元格后垂直居中、循环生成行等

    效果图 模板 一,引入坐标 <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl& ...

  6. freemarker/ftl模板/导出doc 单元格合并注意事项

    在现有模板上添加新表格数据      word 导出 2003版xml 和默认版本xml  是有区别的,如果已经创建好的ftl模板文件,后期维护添加图表,则必须使用同样版本的xml进行模板数据的追加. ...

  7. freemarker/ftl模板/导出doc 单元格合并注意事项(一)

    在现有模板上添加新表格数据      word 导出 2003版xml 和默认版本xml  是有区别的,如果已经创建好的ftl模板文件,后期维护添加图表,则必须使用同样版本的xml进行模板数据的追加. ...

  8. Java实现导出excel对重复数据进行单元格合并

    Java 导出excel重复数据动态合并单元 前言:记录下第一次做动态导出excel表格,重复数据合并行.这个难就难在不知道从数据库查出来的数据那些是重复的哪些是不重复的,全部都是动态合并,并不能进行 ...

  9. element 表格单元格内容不换行_实例29_在Word表格中将上下行相同内容的单元格自动合并...

    实例28讲了如何在Excel文件中自动合并上下行相同内容的单元格,此例则讲一讲如何在Word文件中做类似的操作.因为处理Excel和Word的模块是不同的,所以合并单元格也有一些差异.相对来说,Wor ...

最新文章

  1. 推荐7款新鲜出炉的HTML5/CSS3应用
  2. 设计模式(十一)桥梁模式(结构型)
  3. Azure 怎么开通FTP
  4. 删除office2016专业版多余组件
  5. Linux文件下载和上传工具lrzsz
  6. CDialog::OnOk()作用
  7. 我发现了一个价值8500美元的 HackerOne 平台漏洞
  8. constrain用法java_Java中的@UniqueConstraint注释
  9. textfield设置一键删除
  10. war包的打包与解压
  11. 线性链表--插入、删除、显示、销毁
  12. 利用IV分析仪测量二极管的伏安特性的测量方法及步骤
  13. 制作ROS小车系列(一)——小车底盘制作(麦科勒姆轮地盘)
  14. 计算机数字媒体专业职业规划书,如何写数字媒体技术的职业生涯规划书?
  15. 叠片过滤器:过滤器设备的普遍使用
  16. 专利电子申请客户端CPC安装与使用
  17. i39 1.6 [TNT] 特别版 Mac iPhone 手机铃声制作软件
  18. android手机性价比,最新安卓手机性价比排名大揭秘
  19. iPad Air越狱白苹果怎么办?越狱白苹果修复教程
  20. 小型台式计算机,小型台式电脑哪种好

热门文章

  1. 祭奠被消亡的CSDN文章
  2. 关于zip包解压之后文件打开出现文件损坏的问题
  3. 牛客寒假算法基础训练营3 G.糖果
  4. 拼多多数据分析面试题大合集(20个)
  5. MInd+实例4——公园人数计数系统
  6. android高德地图marker图标,图标样式-字体图标标注-示例中心-JS API UI 组件示例 | 高德地图API...
  7. js唤醒facebook与line的分享
  8. android 圆圈扩大动画,Android实现3个圆圈的动画
  9. session的到底是做什么的?
  10. Qt笔记(五十七)之显示图片缩略图