2015-08-05 3 views
0

Я работаю над проектом, где я пытаюсь создать автоматический генератор отчетов. Мне нужно определить несколько абзацев, устранить уже существующие таблицы и вставить новую таблицу.Вставьте таблицу в текстовый документ в определенном месте, используя apache poi

Все до этого момента отлично работает. Мне даже удается вставить образец текста в том месте, которое я хочу, но ... все таблицы помещаются в конце документа, несмотря на то, что я делаю.

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); 
     } 
    } 
} 

ответ

0

Как выясняется, вы не можете использовать один курсор для нескольких целей, так что все, что мне нужно сделать, это создать новый курсор для моей будущей таблицы.

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!!!"); 
4
//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(); 
+0

Я получил точный результат благодаря решению –

0

Это будет вставить таблицу в заданном положении:

CTTbl inserted = doc.getDocument().getBody().insertNewTbl(position);  
XWPFTable newTable = new XWPFTable(inserted, doc); 

Где doc является объектом XWPFDocument и position ваша позиция среди других таблиц.