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

前言

因为工作任务填充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"
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用POI操作Word表格中的单元格进行拆分,需要以下步骤: 1. 获取需要拆分的表格对象,可以使用XWPFDocument类中的getTableArray()方法获取文档中的所有表格,也可以使用XWPFTable类中的getCell()方法获取表格中的单元格。 2. 获取需要拆分的单元格对象,可以使用XWPFTable类中的getCell()方法获取单元格对象。 3. 获取单元格中的段落对象,可以使用XWPFTableCell类中的getParagraphs()方法获取单元格中的所有段落。 4. 获取段落中的文字对象,可以使用XWPFParagraph类中的getRuns()方法获取段落中的所有文字。 5. 对单元格中的文字进行分割,可以使用Java的字符串分割方法,如split()方法。 6. 创建新的单元格对象,可以使用XWPFTableRow类中的createCell()方法创建新的单元格对象。 7. 将拆分后的文字填充到新的单元格中,可以使用XWPFParagraph类中的createRun()方法创建新的文字对象,然后使用setText()方法设置文字内容。 下面是一个示例代码: ``` XWPFDocument doc = new XWPFDocument(new FileInputStream("test.docx")); // 获取第一个表格对象 XWPFTable table = doc.getTables().get(0); // 获取第一个单元格对象 XWPFTableCell cell = table.getRow(0).getCell(0); // 获取单元格中的所有段落 List<XWPFParagraph> paragraphs = cell.getParagraphs(); // 获取第一个段落中的所有文字 List<XWPFRun> runs = paragraphs.get(0).getRuns(); // 将文字按照“/”进行分割 String[] texts = runs.get(0).getText(0).split("/"); // 创建新的单元格对象 XWPFTableCell newCell = table.getRow(0).createCell(); // 填充拆分后的文字到新的单元格中 XWPFParagraph newParagraph = newCell.addParagraph(); for (String text : texts) { XWPFRun newRun = newParagraph.createRun(); newRun.setText(text); } // 删除旧的单元格 table.getRow(0).removeCell(0); doc.write(new FileOutputStream("test.docx")); ``` 需要注意的是,在拆分单元格之后需要将旧的单元格对象删除,否则会导致表格布局混乱。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值