2017-09-15 113 views
0

我是Apache POI中的一個biginer,想要在單詞tamplate文件中使用某行存在的表進行擴展。 如果我在下面使用該代碼,表格將使用行位擴展新行的單元格創建正常樣式。java Apache POI Word現有表插入單元格樣式和格式的行

我的目標是細胞具有相同的表格單元格樣式等(字體,用,高度...)

XWPFDocument doc = new XWPFDocument(openFile(fileName)); 
    XWPFTable tbl = doc.getTableArray(tableIndex); 
    XWPFTableRow lastRow = tbl.getRows().get(tbl.getNumberOfRows() - 1); 
    cellCounter = lastRow.getTableICells().size(); 
    XWPFTableRow newRow = tbl.createRow(); 
    for (int i = 0; i < data.size() && cellCounter <= data.size(); i++) {   
    String text = data.get(i); 
     XWPFTableCell cell = newRow.getCell(i); 
     if (cell != null) { 
      cell.setText(text); 
     } 
    } 

謝謝您的回答。 R.

回答

3

以下代碼獲取文檔中第一個表中第二行的確切副本。然後它更改此行中單元格的文本內容。然後在此表的第2行和第3行之間插入此複製的行。

的改變必須table.addRow之前完成,因爲該行必須在List tableRows插入它並將它添加到CTTbl ctTblTrArray之前完成的內容。後來的更改不會寫入XML。我沒有真正明白爲什麼會出現這種情況。

然後代碼獲取最後一行的副本,並將該副本添加到表的末尾。這裏也要更改內容,必須在table.addRow之前完成。

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

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRow; 

public class WordInsertTableRow { 

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

    XWPFDocument doc = new XWPFDocument(new FileInputStream("source.docx")); 

    XWPFTable table = doc.getTableArray(0); 

//insert new row, which is a copy of row 2, as new row 3: 
    XWPFTableRow oldRow = table.getRow(1); 
    CTRow ctrow = CTRow.Factory.parse(oldRow.getCtRow().newInputStream()); 
    XWPFTableRow newRow = new XWPFTableRow(ctrow, table); 

    int i = 1; 
    for (XWPFTableCell cell : newRow.getTableCells()) { 
    for (XWPFParagraph paragraph : cell.getParagraphs()) { 
    for (XWPFRun run : paragraph.getRuns()) { 
    run.setText("New row 3 cell " + i++, 0); 
    } 
    } 
    } 

    table.addRow(newRow, 2); 

//insert new last row, which is a copy previous last row: 
    XWPFTableRow lastRow = table.getRows().get(table.getNumberOfRows() - 1); 
    ctrow = CTRow.Factory.parse(lastRow.getCtRow().newInputStream()); 
    newRow = new XWPFTableRow(ctrow, table); 

    i = 1; 
    for (XWPFTableCell cell : newRow.getTableCells()) { 
    for (XWPFParagraph paragraph : cell.getParagraphs()) { 
    for (XWPFRun run : paragraph.getRuns()) { 
    run.setText("New last row cell " + i++, 0); 
    } 
    } 
    } 

    table.addRow(newRow); 

    doc.write(new FileOutputStream("result.docx")); 
    doc.close(); 

} 
} 
+0

克隆前一行樣式是正確的,但不工作cell.setText(「something」);現在。我不知道爲什麼。我使用這個:XWPFTableCell cell = newRow.getCell(i); – Zaosz

+0

我已經更新了我的答案,因爲我已經得到了這個問題。 –

+0

哦,我明白了。感謝您的幫助。它工作正常。 – Zaosz