POI XWPF: Как скопировать таблицу внутри таблицы? - PullRequest
0 голосов
/ 29 августа 2018

У меня есть .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);, это может работать хорошо.

Итак, есть ли предложения, как это исправить?

Примечание: Я получил ссылку поставить курсор после таблицы и скопировать таблицу из этих ссылок.

...