Java中利用freemarker导出word表格并合并单元格
1、word表格的模板
另存为xml格式:
将保存的xml改成.ftl
格式化一下xml,看看文件中的带有${}是否正确
如果出现这种情况,手动修改下(可复制上一个正确的改下名字)
2、Java代码
1、需要导入freemarker的包
<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.20</version></dependency>
2、代码编写(非循环)
public void createDoc(Map<String,Object> dataMap,String templateName,String filePath) {Configuration configuration = new Configuration();configuration.setDefaultEncoding("UTF-8");// 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,// 这里我们的模板是放在当前类包下面的template文件夹下configuration.setClassForTemplateLoading(this.getClass(),"template");// 输出文档路径及名称File outFile = new File(filePath);Writer out = null;try {// test.ftl为要装载的模板Template t = configuration.getTemplate(templateName);//设置模板编码方式t.setEncoding("utf-8");out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"));t.process(dataMap, out);out.close();} catch (Exception e) {e.printStackTrace();} finally {try {out.close();} catch (IOException e) {e.printStackTrace();}}}public static void main(String[] args) {OaMeetingMinutesServiceImpl service = new OaMeetingMinutesServiceImpl();// 要填入模本的数据文件Map<String,Object> dataMap = new HashMap<>();dataMap.put("week", "周一");dataMap.put("name", "张三");dataMap.put("date", "6.11");dataMap.put("content", "哈师大");service.createDoc(dataMap,"test.ftl","D:/test.doc");System.out.println("end");}
结果:
3、循环导出
在要循环的列上加上
注意结束标签
数据做相应的修改
测试:
public static void main(String[] args) {OaMeetingMinutesServiceImpl service = new OaMeetingMinutesServiceImpl();// 要填入模本的数据文件Map<String,Object> dataMap = new HashMap<>();List<User> list = new ArrayList<>();User user = new User();user.setWeek("周一");user.setName("张三");user.setDate("6.22");user.setContent("畜栏里");list.add(user);User user1 = new User();user1.setWeek("周二");user1.setName("李四");user1.setDate("6.23");user1.setContent("畜栏d地方里");list.add(user1);dataMap.put("userList", list);service.createDoc(dataMap,"test.ftl","D:/test.doc");System.out.println("end");}
结果:
4、循环导出并合并单元格
在要合并的一列上加入下面截图中的标签
测试:我这里合并的是星期一列
xml中的判断:
<w:tcPr><w:tcW w:w="2130" w:type="dxa"/><#if user.strMap.now == "1"><#if user.strMap.pre == "0"><w:vMerge w:val="restart"/><#else><w:vMerge/></#if><#else><#if user.strMap.pre != "0"><w:vMerge/></#if></#if></w:tcPr>
Java代码:
public static void main(String[] args) {OaMeetingMinutesServiceImpl service = new OaMeetingMinutesServiceImpl();// 要填入模本的数据文件Map<String,Object> dataMap = new HashMap<>();List<User> list = new ArrayList<>();User user = new User();user.setWeek("周一");user.setName("张三");user.setDate("6.22");user.setContent("畜栏里");list.add(user);User user1 = new User();user1.setWeek("周一");user1.setName("李四");user1.setDate("6.23");user1.setContent("畜栏d地方里");list.add(user1);User user2 = new User();user2.setWeek("周一");user2.setName("李四1");user2.setDate("6.211");user2.setContent("畜栏d地方1里");list.add(user2);User user3 = new User();user3.setWeek("周二");user3.setName("李四11");user3.setDate("6.2111");user3.setContent("畜栏d地方11里");list.add(user3);User user4 = new User();user4.setWeek("周二");user4.setName("李四111");user4.setDate("6.21111");user4.setContent("畜栏d地方111里");list.add(user4);for(int i =0;i<list.size();i++){list.get(i).getStrMap().put("pre","0");list.get(i).getStrMap().put("now","0");list.get(i).getStrMap().put("next","0");if(i<list.size()-1){//当前和下一个相同就合并,将now设置为1if(list.get(i).getWeek().equals(list.get(i+1).getWeek())){list.get(i).getStrMap().put("now","1");}}}for(int i=0;i<list.size();i++){//保存他的前一个元素是否需要合并if(i>0){list.get(i).getStrMap().put("pre",list.get(i-1).getStrMap().get("now"));}//保存他的后一个元素是否需要合并if(i<list.size()-1){list.get(i).getStrMap().put("next",list.get(i+1).getStrMap().get("now"));}}dataMap.put("userList", list);service.createDoc(dataMap,"test.ftl","D:/test.doc");System.out.println("end");}
说明:我这里采用了两次循环的方法合并,仅供参考
测试结果:
Java中利用freemarker导出word表格并合并单元格相关推荐
- python合并word表格单元格_python docx模块读取word表格遇到合并单元格时的处理
python docx模块读取word表格遇到合并单元格时的处理 python docx模块读取word表格遇到合并单元格时的处理 python docx模块读取word表 遇到合并单元格时的处理 通 ...
- Java之利用FreeMarker导出Word实例
开心一笑 感冒了很难受,她闷在被窝里给男朋友发短信"我感冒了-"并决定如果对方回答"多喝点水"就一脚踹了他.过一会儿手机振动起来,短信内容:"开门."--这个大笨蛋!谁让他来的啦!她起身用最快的速度冲 ...
- java word合并单元格_java使用freemarker模板导出word(带有合并单元格)文档
前言:最近要做一个导出word功能,其实网上有很多的例子,但是我需要的是合并单元格的,可是查了好久都没有自己想要的.研究了几天其实挺简单的,在这儿我就简单的介绍一下吧!(此方法只是一种思路,借鉴者还有 ...
- html中表格怎么合并单元格居中,word表格怎么合并单元格居中
在excel中,合并.拆分单元格是经常会用到的.而在word文档中,偶尔我们也需要插入表格,然后编辑表格,那么如何对word中的表格单元格进行合并.拆分呢? 一.如何在word中创建表格 1.选择&q ...
- python 生成word表格(合并单元格)
本人使用pycharm,安装库python-docx 代码: from docx import Document from docx.shared import Inches, Pt from doc ...
- SpringBoot+Poi-tl根据Word模板动态生成word(含动态行表格、合并单元格)
本编文章继SpringBoot+Poi-tl根据Word模板动态生成word(含动态行表格)文章之后 介绍Poi-tl导出word的延伸功能: 所需依赖以及word模板所属位置 见 SpringBoo ...
- Java中利用freemarker模板动态生成word含表格
最近公司有导出word的需求,由于word的样式有的很复杂所以记录一下Java中利用freemarker模板动态生成word含表格,以防以后忘记. 1.word表格的模板 删掉无用的数据留下基础的样式 ...
- java 如何将word 转换为ftl_Java之利用FreeMarker导出Word实例
开心一笑 感冒了很难受,她闷在被窝里给男朋友发短信"我感冒了..."并决定如果对方回答"多喝点水"就一脚踹了他.过一会儿手机振动起来,短信内容:"开门."......这个大笨蛋!谁让他来的啦!她起身用 ...
- java中使用jxl导出excel表格的工具类(全网唯一亲测可用,在原来基础上扩展)
java中后台导出excel的话,有两种方案,一是使用poi(不过由于是windows版本的,存在不兼容,但功能更多,更强大),而是使用jxl(纯java编写,不过兼容,简单一些),可以设置输出的ex ...
最新文章
- 通过先序和中序数组生成后续数组
- 技术讨论 | 一次尚未完成的薅羊毛行动
- 深度探讨 CrossFormer 如何解决跨尺度问题
- how is view embedded via component usage being initialized
- 电子报账系统源码_网上商城系统建设心得,轻松搞定选择困难
- 9.带有返回值的函数
- jvm学习笔记(1)——java虚拟机内存区域
- python解释器的提示符是shell嘛_windows python3.2 shell环境(python叫做解释器)
- [ 转载 ]微信小程序font-family
- Mac下驱动BCM20702A0 USB蓝牙
- android终端模拟器 apt,借贵吧问个安卓终端模拟器的问题
- lisp画弯箭头_在CAD中直接用命令画箭头
- MATLAB去除数据中的异常值、离群值
- java+vue3实现生成、验证图形验证码,和手机短信验证码
- PotPlayer打开视频没声音,显示DirectX有问题或者音频禁用怎么办?
- 电脑壁纸该换了,mac必备壁纸软件Dynamic Wallpaper
- 强大的web电子表格控件dhtmlxSpreadsheet免费下载地址
- 各路大神对于观测器的文章总结【持续更新】
- Oracle同义词创建及其作用
- java并发锁有哪些,Java并发编程-公平锁与非公平锁