• java根据word模板生成文档(含文本替换和动态生成表格)


            开发功能需求:给定word模板,word模板中存在"${XXX}"格式的需要变量替换的一些词,包括直接可以被替换的词,需要循环获取、替换、格式处理的词(例如根据数据库存储内容循环生成表格),模板中还可能会有需要自动增行的表格。

    1.用到的依赖

    
    
        cn.hutool
        hutool-all
        5.4.3
    
    
        org.apache.poi
        poi
        3.17
    
    
        org.apache.poi
        poi-ooxml
        3.17
    
    
        org.apache.poi
        ooxml-schemas
        1.1
    

    2.段落操作

    • XWPFParagraph->XWPFRun.setText(""),设置文本内容
    • XWPFParagraph->XWPFRun.setBold(true),设置文本是否加粗
    • XWPFParagraph->XWPFRun.setFontSize(14),设置文本字体大小
    • XWPFParagraph->XWPFRun.setFontFamily("Times New Roman", XWPFRun.FontCharRange.ascii)以及XWPFRun.setFontFamily("宋体", XWPFRun.FontCharRange.eastAsia),设置中英文字体
    • XWPFParagraph->XWPFRun.setBold(true),设置文本是否加粗
    • XWPFParagraph.setFontAlignment(HorizontalAlignment.CENTER),设置文本对齐方式
    • XmlCursor xmlCursor = document.getParagraphArray(posOfFirstParagraph + 1).getCTP().newCursor(),获取游标位置
    • XWPFParagraph paragraph =XWPFDocument.insertNewParagraph(xmlCursor),在游标位置新增段落
    • XWPFTable table = XWPFDocument.insertNewTbl(xmlCursor),在游标位置新增表格

    3.表格操作

    • table->row->cell.setText(""),设置单元格内的文本
    • table->row->cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER),设置表格垂直居中
    • table->row->cell->CTTc->CTP->CTPPr->CTJc.setVal(STJc.CENTER),设置表格水平居中
    • table->row->cell->CTTc->CTP->CTPPr->CTInd.setFirstLineChars(BigInteger.valueOf(0))以及CTInd.setFirstLine(BigInteger.valueOf(0)),设置首行缩进
    • table->row->cell->CTTc->CTP->CTR->CTRPr->CTHpsMeasure.setVal(BigInteger.valueOf(24)),设置字体大小
    • table->row->cell->CTTc->CTTcPr->CTTcBorders->CTBorder.setVal(STBorder.SINGLE)以及CTBorder.setSz(new BigInteger("12")),设置某个单元格某个边框格式以及粗细
    • table->CTTbl->CTTblPr->CTTblBorders->CTBorder.setSz(new BigInteger("12")),设置表格某个边框格式以及粗细
    • table->row->cell->CTTc->CTTcPrsetVMerge(CTVMerge.setVal(STMerge.RESTART)以及CTVMerge.setVal(STMerge.CONTINUE)),对上下内容相同的行进行合并单元格
    • table->row->cell->seColor("D9D9D9"),设置单元格的颜色
    • table->row->cell->CTTc->CTP->CTR->CTRPr->CTFonts.setEastAsia("黑体")以及CTFonts.setAscii("Times New Roman"),设置中英文字体

    4.段落文本替换

    • 获取全文的段落,若段落中存在"$",说明存在需要替换的文本,获取段落的所有runs,依次判断每个run中是否存在"$",若存在,则将该"${XXX}"替换成集合中它对应的值;
    • 若有特殊内容需要替换,例如需要根据数据库内容循环生成新的内容,则需要获取要插入表格的游标,在游标位置创建新的段落,创建新的run,设置run的文本/表标题等内容、字体、字号等,或者在游标位置创建新的表格,按照table->row->cell,依次给每一个cell赋值,最终完成表格内容的填充;
    • 填充完毕,按照文本和表格的操作修改文本和表格。

    5.表格文本替换

            获取全文的表格,若表格中存在"$",说明存在需要替换的文本,获取表格的所有rows下的cells,依次判断每个cell中是否存在"$",若存在,则获取该cell的段落下的run,将该"${XXX}"替换成集合中它对应的值。

    6.表格自动增行

    • 获取要在表格中展示的全部数据,以及需要处理的表格位置;
    • 根据要展示的数据的行数和列数,新增一个指定行数和列数的空白表格;
    • 在空白表格中插入要展示的数据;
    • 优化表格的格式,包括合并上下相同内容的单元格,水平居中、垂直居中、首行不缩进、设置字体和大小、表格部分边框加粗等。
  • 相关阅读:
    WPS论文编写问题集(参考文献制作、公式居中及编号、公式影响行间距...)_长期更新中ing...
    快速乘详解
    橙河网络:国外问卷调查赚钱的项目可靠吗?
    基于vue3和element-plus的省市区级联组件
    CCLINK IEFB总线转ETHERNET/IP网络的协议网关使欧姆龙和三菱的数据互通的简单配置方法
    (76)MIPI DSI LLP介绍(十六)
    C语言题解——最小公倍数的三种求法(含最大公约数)
    C语言编程题(二)运算符与位运算符优先级
    HCIP第十八天——链路聚合,VRRP,IPV6
    Pygame入门 2022 (2)
  • 原文地址:https://blog.csdn.net/jl08133341/article/details/126350180