Apache POI Word 在同一级别插入表格和文本

问题描述 投票:0回答:1

我想使用 Apache POI 在 XWPFDocument 中的同一级别插入表格和一些文本,这意味着表格将位于左侧,文本将位于右侧,就像在此模板中一样:

使用提供周围找到的光标的解决方案似乎不起作用。这是常用的方法:

XWPFTable table = document.createTable();

XWPFTableRow tableRowOne = table.getRow(0);
tableRowOne.getCell(0).setText("col one");
tableRowOne.addNewTableCell().setText("col two");
tableRowOne.addNewTableCell().setText("col three");

XmlCursor cursor = table.getCTTbl().newCursor();
cursor.toEndToken();

while(cursor.toNextToken() != org.apache.xmlbeans.XmlCursor.TokenType.START);
XWPFParagraph paragraph2 = document.insertNewParagraph(cursor);

XWPFRun run = paragraph2.createRun();
run.setText("Abstract: ");

结果是这样的:

您知道有办法让它发挥作用吗?谢谢。

java ms-word apache-poi
1个回答
3
投票

这里的

XmlCursor
是错误的方式。
XmlCursor
用于获取 XML 或将 XML 插入到 XML 文档的特殊位置。但您需要的是表格属性(文本换行)或页面设置(页面上的多列)。

要将页面分成两列,请参阅如何向 XWPFDocument 添加连续分节符?。左侧还可能包含一张桌子。

要设置使用XWPFTable无法使用的表属性,可以执行以下操作:

创建具有设置的

*.docx
文档。请参阅设置或更改表格属性,了解如何设置表格文本换行。

解压缩

*.docx
文件(每个 Office Open XML 文件只是一个 ZIP 存档)并查看
/word/document.xml
。你会发现类似的东西

<w:tbl>
 <w:tblPr>
  <w:tblpPr w:vertAnchor="text"/>
  <w:tblOverlap w:val="never"/>
 ...
 </w:tblPr>
 ...
</w:tbl>

对于表 XML。

TableProperties 具有 TablePositionPropertiesTableOverlap

现在使用

org.openxmlformats.schemas.wordprocessingml.x2006.main.*
类重新创建它。

完整示例:

import java.io.FileOutputStream;

import org.apache.poi.xwpf.usermodel.*;

public class CreateWordTableTextWrapping {
    
 public static void main(String[] args) throws Exception {

  XWPFDocument document = new XWPFDocument();

  XWPFParagraph paragraph = document.createParagraph();
  XWPFRun run = paragraph.createRun();  
  run.setText("Text before table...");

  XWPFTable table = document.createTable(1, 3);
  table.setWidth("50%");
  
  //set table text wrapping
  //get table properties, add new table position properties, set vertical anchor Text
  table.getCTTbl().getTblPr().addNewTblpPr().setVertAnchor​(org.openxmlformats.schemas.wordprocessingml.x2006.main.STVAnchor.TEXT);
  //set table position properties Y in TwIPs (TWentieth of an Inch Point) - must be at least 1 for Office 365
  table.getCTTbl().getTblPr().getTblpPr().setTblpY​(1);
  //get table properties, add new table overlap, set value Never
  table.getCTTbl().getTblPr().addNewTblOverlap().setVal(org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblOverlap.NEVER);

  paragraph = document.createParagraph();
  run = paragraph.createRun();  
  run.setText("Text after table...");

  FileOutputStream out = new FileOutputStream("./CreateWordTableTextWrapping.docx");
  document.write(out);
  out.close();
  document.close();

 }
}
© www.soinside.com 2019 - 2024. All rights reserved.