系列文章目录

第一章:springboot下生成复杂word文档方案 在Word软件里面制作模板
第三章:doc和docx插入多图
第四章:web环境下word文档预览


根据模板导出word,复合格式表格生成、可变列表格生成

  • 系列文章目录
  • 前言
  • 复合格式表格
  • 一、拆解word xml文档标签
    • 表格遍历逻辑
    • 数据结构定义
  • 二、结果
    • 一行数据
    • 二行数据
    • 多行数据
  • 变长列格式表格
    • 拆解逻辑
    • 数据结构定义
  • 总结
  • 代码仓库

前言

这次我们来实现复合格式表格和可变列表格,效果如下


以下是本篇文章正文内容,下面案例可供参考

复合格式表格

一、拆解word xml文档标签

按照要求我们可以将表格按行为单位拆分为四种格式的表格行;
这个时候我们在xml模板文件里面保留这四行来使用。

表格遍历逻辑

<w:tbl>
<!--            表头行  begin --><w:tr>...</w:tr>
<!--            表头行  end --><#list complexTable.rows as tableRow><#if !tableRow_has_next><!--            表内容尾行  begin --><w:tr>...</w:tr><!--            表内容尾行  end --><#elseif tableRow_has_next && tableRow_index == 0 ><!--            表内容首行  begin --><w:tr>...</w:tr><!--            表内容首行  end --><#else ><!--            表内容中间行  begin --><w:tr>...</w:tr><!--            表内容中间行  end --></#if></#list></w:tbl>

上面的代码逻辑可以兼容一条数据,二条数据和多行数据的情况下格式不会乱,运行效果请看下面测试结果。

数据结构定义

{"columns": ["列名1","列名2"],"rows": [{"cell1": "小红","cell2": "女"},{"cell1": "小明","cell2": "男"}......{"cellFinal": "啦啦啦啦,我可以随意定义字段,只要复合模板拆分逻辑即可"}]
}

row里面最后一行的数据结构跟上面不相同,而实际上定义为相同也可以,只不过按照我们的拆解逻辑来讲,最后一行只取一个字段,所以我定义了另一种结构来存储,其实只要在模板里面能取到即可。

二、结果

一行数据

二行数据

多行数据


变长列格式表格

表格的列数不固定的表格。

拆解逻辑

变长列数的表格主要是在行内部再加一个list循环,然后以列为单位控制格式,一般只需要控制每行的最左面和最后面一列即可。

<w:tbl>
<!--            表头行  begin --><w:tr><#list complexTable.columns as column><w:tc>...<w:t>${column}</w:t>...</w:tc></#list></w:tr>
<!--            表头行  end --><#list complexTable.rows as tableRow><#if !tableRow_has_next><!--            表内容尾行  begin --><w:tr>...<#list tableRow as cell><w:tc>...<!-- 如果表格是外围边框和内边框不一样的话就需要在这里加ifelse代码,第一列调整左边框,最后一列调整右边框;<w:tcBorders><w:top w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/><w:left w:val="dash-dot-stroked" w:sz="24" wx:bdrwidth="60" w:space="0" w:color="auto"/><w:bottom w:val="dash-dot-stroked" w:sz="24" wx:bdrwidth="60" w:space="0" w:color="auto"/><w:right w:val="single" w:sz="8" wx:bdrwidth="20" w:space="0" w:color="000000"/></w:tcBorders>--><w:t>${cell}</w:t>...</w:tc></#list>...</w:tr><!--            表内容尾行  end --><#elseif tableRow_has_next && tableRow_index == 0 ><!--            表内容首行  begin --><w:tr>...</w:tr><!--            表内容首行  end --><#else ><!--            表内容中间行  begin --><w:tr>...</w:tr><!--            表内容中间行  end --></#if></#list></w:tbl>

数据结构定义

{"columns": ["列名1","列名2"],"rows": [["数据1","数据2"],["数据1","数据2"]]
}

总结

上一章我们讲了固定格式表格和图片的生成方法;而在这一章我们讲解了如何生成“复合格式表格”和“可变列表格”,这已经足以让我应对很大一部分应用场景,如果有更复杂的场景,比如说“可变列加复合格式然后部分列需要固定宽度”这样的需求,我们可以将上述解决方法组合使用即可,亲测可用。


代码仓库

https://gitee.com/whatitis/springboot_freemarker_word

测试入口在:
cn.gitee.worddemo.WorddemoApplicationTests#testProc2

根据模板导出word,复合格式表格生成、可变列表格生成相关推荐

  1. EasyPoi模板导出word(简单文本、内嵌表格、循环图片)

    EasyPoi模板导出word(简单文本.内嵌表格.循环图片) 先上效果图 模板在此 依赖导入 *坑:注意依赖版本 4.3.0+才支持多图片循环导出 <!-- word导出 方式:easypoi ...

  2. poi-tl,根据word模板导出word(表格行循环,表格无表头的情况)

    最近项目里要做一个根据客户提供的word模板导出word的功能,方法有很多,比如easyPoi(对word的支持并不是很好),freeMark(太麻烦不想研究),以及poi-tl, 最后研究了半天发现 ...

  3. freemarker模板导出word循环图片表格详细教程

    前言:表哥之前已经过一篇freemarker模板导出带表格word详细教程  freemarker模板导出带表格word详细教程_Java大表哥的博客-CSDN博客,为什么现在又要写一篇呢. 因为我这 ...

  4. 【Apache POI】Java Web根据模板导出word文件

    最近工作中遇到一个需求:根据word模板文档导出word文件. 查阅了一些资料,发现Apache POI可以实现文档读写的功能,于是就研究了一下,总结如下: Apache-POI在线Javadoc:h ...

  5. POI根据模板导出word文件,以及word转PDF,PDF转图片再插入PDF中(防止PDF被修改)

    POI操作word和PDF POI根据模板导出word文件 word转PDF PDF转图片再插入PDF中(防止PDF被修改) POI根据模板导出word文件 一.制作word模版,${xxxx}是一会 ...

  6. easypoi根据模板导出word

    easypoi根据模板导出word 在工作中,模板导出必不或缺,实现模板导出的第三方工具包也有很多.例如:poi.freemaker.hutool的word工具类以及第三方报表工具.这里我简单介绍一下 ...

  7. java调用word模板文件_Java使用模板导出word文档

    Java使用模板导出word文档 需要导入freemark的jar包 使用word模板,在需要填值的地方使用字符串代替,是因为word转换为xml文件时查找不到要填入内容的位置.尽量不要在写字符串的时 ...

  8. springboot中使用freemarker根据flt模板导出word、pdf文档

    1.导包: <!--FreeMarker --> <dependency><groupId>org.springframework.boot</groupId ...

  9. easypoi按模板导出word不支持列循环迭代问题

    使用java按模板导出word,有很多方案,比如freemarker,jacob,openoffice,aspose(非开源收费,需破解版)apache poi等,其中比较常用的是freemarker ...

最新文章

  1. C语言flood fill 泛洪算法(附完整源码)
  2. 4-11流量统计项目需求分析
  3. 程序员抱怨:父母没文化没见识,当初努力学习远离看来是正确的
  4. 第12章 坚持一百秒(《C和C++游戏趣味编程》教学视频)
  5. 【实践】通过Composer,安装yii2-advanced
  6. dpkg: error: dpkg status database is locked by another process
  7. matlab libjli.so,error while loading shared libraries: libjli.so 问题解决
  8. 申报表计算机代码是什么,金税盘的维护费在申报表上面有一个要填写减免性质代码怎么填啊 ?那个代码是什么呢?...
  9. 用python做系统的感悟_《Python机器学习经典实例》学习感悟
  10. 苹果计算机关机时间不准,mac长时间不关机时间不准确问题
  11. 垃圾分类的正确姿势?用 OpenCV 人工智能图像识别技术来进行
  12. 苹果手机隐私分析数据是什么_苹果公司以用户为中心的隐私保护方法能教给我们什么?
  13. 微信群发消息怎么发?微信群发消息只需要4步?
  14. content root修改问题
  15. Intel汇编-传送MMX整数
  16. 23届应届毕业生秋招分享——秋招经验
  17. 山沟沟里的技术脱贫:阿里工程师助平武蜂农物联网养蜂...
  18. matlab绘制图形hold on_MATLAB中hold on和figure的区别?画三维图为什么一定要meshgrid?...
  19. C#如何读取身份证阅读器
  20. 3dmax中布尔命令的方法

热门文章

  1. Java图片上传实现方式MultipartFile
  2. 腾讯已开源高精度人脸检测算法DSFD
  3. 分布式session的实现方式
  4. recovery 进入方式
  5. MySQL - 数据库的监控方式
  6. mysql的监控大屏
  7. [tts] 基于Merlin的英文语音合成实战
  8. c/c++游戏编程之控制台贪吃蛇(一)
  9. android button圆角边框,UIButton设置圆角和边框及边框颜色
  10. 多渔:网络赚钱之圈层