poi 操作word文档,poi 向word插入图片,poi 向word入表格,XWPFParagraph 分段,XWPFDocument单元格合并,XWPFDocument 操作word

本文详细介绍了如何使用Java的POI库操作Word文档,包括XWPFRun的分段问题、在指定位置插入表格、在表格内插入子表格、插入图片以及单元格的合并。通过实例代码展示了在Word中实现这些功能的步骤和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

因为工作任务填充word的模板,之前用的最多的是excel。 第一次操作word,面向百度开发,遇到了很多问题,也找了很多bolg。 百度有很多标题与内容不符的blog, 找的有点心累,现在做一个总结。
版本:5.0.0
在线Api: http://poi.apache.org/apidocs/5.0/

问题总结

  1. XWPFRun 分段问题
  2. 在指定位置填充表格
  3. 在表格里面插入表格
  4. 插入图片
  5. 单元格合并
    未解决的问题: 在word里面插入附件

解决问题

XWPFRun 分段问题

例如我要替换word里面的${name}${year}
在这里插入图片描述
在poi分段的时候可能会分成这样的段落

${
   
nam
e}
${
   year
}

解决方法:

  1. 网上的解决方案是 在text里面写标记然后在复制粘贴到word
    这种方法太麻烦
  2. 用一个临时变量存储标记
XWPFDocument document = new XWPFDocument(in);
List<XWPFParagraph> pars = document.getParagraphs();
  StringBuilder builder;
  for (XWPFParagraph pg : pars) {
   
      if (pg.getText().contains("$")) {
   
          builder = new StringBuilder();
          // 获取分词
          List<XWPFRun> runs = pg.getRuns();
          boolean start = false;
          String text;
          for (XWPFRun run : runs) {
   
              text = run.text();
              if (text.startsWith("$")) {
   
                  start = true;
              }
              if (start) {
   
                  builder.append(text);
                  // 清除标记
                  run.setText("", 0);
              }
              if (text.endsWith("}")) {
   
                  start = false;
                  // 获取到完整标记 
                  // TODO 业务逻辑
                  System.out.println(builder.toString());
              }
          }
      }
  }

在指定位置插入一个表格

我在word里面打了一个${table}标记,要在这个地方插入一个表格

··· 找到该段落
// 首先获取段落游标
XmlCursor cursor = pg.getCTP().newCursor();
// 跳到下一行
cursor.toNextSibling();
// 然后根据游标插入一个表格
XWPFTable table = document.insertNewTbl(cursor);
// 创建行
XWPFTableRow row = table.createRow();
// 创建单元格
XWPFTableCell cell = row.createCell();

新插入的表格只有一行一列,也就是只有一个单元格。并且创建第一行填充多少格,后续行就是多少格,不用再创建单元格了

在表格里面插入表格

XmlCursor cursor = pg.getCTP().newCursor();
cursor.toNextSibling();
XWPFTable table = document.insertNewTbl(cursor);
// document 插入的表格只有一行一格
XWPFTableCell cell = table.getRow(0).getCell(0);
// 添加段落
XWPFParagraph cellPg = cell.addParagraph();
// 创建一个文本区域
XWPFRun cellRun = cellPg.createRun();
cellRun.setText("天青色等烟雨");
// 获取游标
XmlCursor c = cell.addParagraph().getCTP().newCursor();
// 游标下移
c.toNextSibling();
// 插入表格
XWPFTable cellTable = cell.insertNewTbl(c);
// 这个表格第一行不能使用,删除掉
cellTable.removeRow(0);
// 填充内容
cellTable.createRow().createCell().setText("而我在等你");

结果:
在这里插入图片描述
这里只是做一个演示,表格里面插入的表格没有边框,需要手动设置边框属性。

private static void setBorders(XWPFTable table) {
   
    table.getRows().forEach(row -> {
   
         row.getTableCells().forEach(cell -> {
   
             // 自动宽度
             cell.setWidthType(TableWidthType.AUTO);
             CTTcBorders borders = null;
             if (cell.getCTTc().addNewTcPr().getTcBorders() == null) {
   
                 borders = cell.getCTTc().addNewTcPr().addNewTcBorders();
             }
             // 上下左右
             setBorder(borders.addNewTop());
             setBorder(borders.addNewBottom());
             setBorder(borders.addNewLeft());
             setBorder(borders.addNewRight());
         });
     });
 }

private static void setBorder(CTBorder border) {
   
   // 设置单实线
   border.setVal(STBorder.SINGLE);
   // 宽度
   border.setSz(BigInteger.valueOf(2));
   border.setColor("000000");
}

效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值