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.表格自动增行
- 获取要在表格中展示的全部数据,以及需要处理的表格位置;
- 根据要展示的数据的行数和列数,新增一个指定行数和列数的空白表格;
- 在空白表格中插入要展示的数据;
- 优化表格的格式,包括合并上下相同内容的单元格,水平居中、垂直居中、首行不缩进、设置字体和大小、表格部分边框加粗等。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
