使用 apache poi 将 table 插入到 word 文档的特定位置
Insert table into a word document at a specific position using apache poi
我正在做一个项目,试图创建一个自动报告生成器。我需要找出几个特定的段落,删除已经存在的 table 并插入一个新的 table。
到目前为止一切正常。我什至设法在我想要的地方插入示例文本,但是......所有 tables 都放在文档的末尾,尽管我做了什么。
public class InsertText {
public static void main(String[] args) throws FileNotFoundException, IOException,
InvalidFormatException {
try {
FileInputStream fis = new FileInputStream("c:\Work\current\***.docx");
XWPFDocument document = new XWPFDocument(OPCPackage.open(fis));
fis.close();
System.out.println(document.getDocument().getBody().getPArray().length);
List<IBodyElement> elements = document.getBodyElements();
for (int n = 0; n < elements.size(); n++) {
IBodyElement element = elements.get(n);
if (element instanceof XWPFParagraph) {
XWPFParagraph p1 = (XWPFParagraph) element;
List<XWPFRun> runList = p1.getRuns();
StringBuilder sb = new StringBuilder();
for (XWPFRun run : runList)
sb.append(run.getText(0));
if (sb.toString().contains("????")) {
n++;
element = elements.get(n);
if (element instanceof XWPFTable) {
XWPFTable t = (XWPFTable) element;
XmlCursor cursor = t.getCTTbl().newCursor();
document.removeBodyElement(n);
XWPFParagraph p = document.insertNewParagraph(cursor);
XWPFRun run = p.createRun();
run.setText("GOAL!!!");
XWPFTable t2 = document.createTable(3,4);
XWPFTableCell cell = t2.getRow(0).getCell(0);
document.insertTable(n, t2);
cell.setText("GOAL!!!");
t2 = p.getBody().insertNewTbl(cursor);
}
}
}
}
FileOutputStream outStream = new FileOutputStream("C:/Work/Current/**.docx");
document.write(outStream);
outStream.close();
} catch (Exception e) {
e.printStackTrace(System.out);
}
}
}
事实证明,您不能将一个光标用于多种用途,所以我需要做的就是为我的未来创建一个新的光标 table。
run.setText("GOAL!!!");
cursor = p.getCTP().newCursor();//this is the key!
XWPFTable t2 = document.insertNewTbl(cursor);
XWPFTableCell cell = t2.getRow(0).getCell(0);
cell.setText("GOAL!!!");
//first row
XWPFTableRow rowOfOriginalTable = theOriginalTable.getRow(0);
//second cell of the first row
XWPFTableCell cellOfOriginalTable = rowOfOriginalTable.getCell(1);
//new paragraph in that cell
XWPFParagraph p = cellOfOriginalTable.addParagraph();
//get the cursor of the new paragraph
XmlCursor cursor = p.getCTP().newCursor();
//add the nested Table
XWPFTable nestedTable = p.getBody().insertNewTbl(cursor);
//add the first row to the nested table
XWPFTableRow rowOfNestedTable = nestedTable.createRow();
//add a cell to the first row
XWPFTableCell cellOfNestedTable = rowOfNestedTable.createCell();
//add a value
cellOfNestedTable.setText("Cell 0,0");
//add another cell
cellOfNestedTable = rowOfNestedTable.createCell();
cellOfNestedTable.setText("Cell 0,1");
//add another cell and rows
rowOfNestedTable = nestedTable.createRow();
cellOfNestedTable = rowOfNestedTable.getCell(0);
cellOfNestedTable.setText("Cell 1,0");
cellOfNestedTable = rowOfNestedTable.getCell(1);
cellOfNestedTable.setText("Cell 1,1");
cellOfOriginalTable.addParagraph();
这将在给定位置插入一个 table:
CTTbl inserted = doc.getDocument().getBody().insertNewTbl(position);
XWPFTable newTable = new XWPFTable(inserted, doc);
其中 doc
是 XWPFDocument 对象,position
是您在其他 table 中的位置。
我正在做一个项目,试图创建一个自动报告生成器。我需要找出几个特定的段落,删除已经存在的 table 并插入一个新的 table。
到目前为止一切正常。我什至设法在我想要的地方插入示例文本,但是......所有 tables 都放在文档的末尾,尽管我做了什么。
public class InsertText {
public static void main(String[] args) throws FileNotFoundException, IOException,
InvalidFormatException {
try {
FileInputStream fis = new FileInputStream("c:\Work\current\***.docx");
XWPFDocument document = new XWPFDocument(OPCPackage.open(fis));
fis.close();
System.out.println(document.getDocument().getBody().getPArray().length);
List<IBodyElement> elements = document.getBodyElements();
for (int n = 0; n < elements.size(); n++) {
IBodyElement element = elements.get(n);
if (element instanceof XWPFParagraph) {
XWPFParagraph p1 = (XWPFParagraph) element;
List<XWPFRun> runList = p1.getRuns();
StringBuilder sb = new StringBuilder();
for (XWPFRun run : runList)
sb.append(run.getText(0));
if (sb.toString().contains("????")) {
n++;
element = elements.get(n);
if (element instanceof XWPFTable) {
XWPFTable t = (XWPFTable) element;
XmlCursor cursor = t.getCTTbl().newCursor();
document.removeBodyElement(n);
XWPFParagraph p = document.insertNewParagraph(cursor);
XWPFRun run = p.createRun();
run.setText("GOAL!!!");
XWPFTable t2 = document.createTable(3,4);
XWPFTableCell cell = t2.getRow(0).getCell(0);
document.insertTable(n, t2);
cell.setText("GOAL!!!");
t2 = p.getBody().insertNewTbl(cursor);
}
}
}
}
FileOutputStream outStream = new FileOutputStream("C:/Work/Current/**.docx");
document.write(outStream);
outStream.close();
} catch (Exception e) {
e.printStackTrace(System.out);
}
}
}
事实证明,您不能将一个光标用于多种用途,所以我需要做的就是为我的未来创建一个新的光标 table。
run.setText("GOAL!!!");
cursor = p.getCTP().newCursor();//this is the key!
XWPFTable t2 = document.insertNewTbl(cursor);
XWPFTableCell cell = t2.getRow(0).getCell(0);
cell.setText("GOAL!!!");
//first row
XWPFTableRow rowOfOriginalTable = theOriginalTable.getRow(0);
//second cell of the first row
XWPFTableCell cellOfOriginalTable = rowOfOriginalTable.getCell(1);
//new paragraph in that cell
XWPFParagraph p = cellOfOriginalTable.addParagraph();
//get the cursor of the new paragraph
XmlCursor cursor = p.getCTP().newCursor();
//add the nested Table
XWPFTable nestedTable = p.getBody().insertNewTbl(cursor);
//add the first row to the nested table
XWPFTableRow rowOfNestedTable = nestedTable.createRow();
//add a cell to the first row
XWPFTableCell cellOfNestedTable = rowOfNestedTable.createCell();
//add a value
cellOfNestedTable.setText("Cell 0,0");
//add another cell
cellOfNestedTable = rowOfNestedTable.createCell();
cellOfNestedTable.setText("Cell 0,1");
//add another cell and rows
rowOfNestedTable = nestedTable.createRow();
cellOfNestedTable = rowOfNestedTable.getCell(0);
cellOfNestedTable.setText("Cell 1,0");
cellOfNestedTable = rowOfNestedTable.getCell(1);
cellOfNestedTable.setText("Cell 1,1");
cellOfOriginalTable.addParagraph();
这将在给定位置插入一个 table:
CTTbl inserted = doc.getDocument().getBody().insertNewTbl(position);
XWPFTable newTable = new XWPFTable(inserted, doc);
其中 doc
是 XWPFDocument 对象,position
是您在其他 table 中的位置。