У меня есть .docx с таблицей в качестве содержимого. Внутри этой таблицы я проверяю каждую ячейку, содержит ли она (instanceof) XWPFParagraph или XWPFTable. Затем я выполняю условия: если ячейка содержит XWPFParagraph, я что-то делаю (в этом случае я нахожу и заменяю текст), а если ячейка содержит XWPFTable, то я копирую таблицу и помещаю ее после существующей таблицы.
Итак, у меня есть этот код.
public class JavaApplication1 {
public static void main(String[] args) {
try {
FileInputStream filename = new FileInputStream("D:\\document300718\\NetBeansProjects\\JavaApplication1\\src\\docx\\template.docx");
XWPFDocument doc = new XWPFDocument(filename);
for (XWPFTable tbl : doc.getTables()) {
for (XWPFTableRow row : tbl.getRows()) {
for(int c = 0; c < row.getTableCells().size(); c++){
XWPFTableCell cell = row.getTableCells().get(c);
for(int p =0; p < cell.getBodyElements().size(); p++){
IBodyElement cellElem = cell.getBodyElements().get(p);
//Check if cell contains XWPFParagraph or XWPFTable
if(cellElem instanceof XWPFParagraph){
List<XWPFParagraph> paragraphs = cell.getParagraphs();
for(XWPFParagraph par : paragraphs){
List<XWPFRun> runs = par.getRuns();
String find = "EMPLOYEE_NM";
TextSegement found = par.searchText(find, new PositionInParagraph());
if(found!=null){
XWPFRun run = runs.get(found.getBeginRun());
String runText = run.getText(run.getTextPosition());
String replace = runText.replace(find, "Bruce");
run.setText(replace, 0);
}
}
}
else if (cellElem instanceof XWPFTable)
{
XWPFTable tabel = (XWPFTable) cellElem;
CTTbl ctTabel = tabel.getCTTbl();
XmlCursor tblCursor = ctTabel.newCursor();
tblCursor.toEndToken();// to put cursor after table
while(tblCursor.toNextToken() != org.apache.xmlbeans.XmlCursor.TokenType.START);
//Main Problem
XWPFTable newTable = cell.insertNewTbl(tblCursor);//causing infinite loop
CTTbl ctTbl = newTable.getCTTbl();
CTTbl copyCT = CTTbl.Factory.newInstance();
copyCT.set(tabel.getCTTbl());
ctTbl.set(copyCT);
}
}
}
}
}
}
doc.write(new FileOutputStream("D:\\document300718\\NetBeansProjects\\JavaApplication1\\src\\docx\\template1.docx"));
} catch (Exception e) {
e.printStackTrace();
}
}}
Я получил бесконечный цикл (даже пространство кучи Java), когда положил
XWPFTable newTable = cell.insertNewTbl(tblCursor);
Но если я вставлю новый абзац, чтобы поместить текст после таблицы с XWPFParagraph para = cell.insertNewParagraph(tblCursor);
, это может работать хорошо.
Итак, есть ли предложения, как это исправить?
Примечание:
Я получил ссылку
поставить курсор после таблицы и скопировать таблицу из этих ссылок.