java Apache POI Word现有表插入行的单元格样式和格式

时间:2017-09-15 08:46:13

标签: java ms-word apache-poi

我是Apache POI中的一个重要人物,并希望在单词tamplate文件中扩展一些存在的表。 如果我使用下面的代码,表格将使用行位扩展新行的单元格创建正常样式。

我的目标是细胞具有相同的表格细胞样式等(字体,有,高度......)

    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上。

2 个答案:

答案 0 :(得分:8)

以下代码获取文档中包含的第一个表中第二行的精确副本。然后它会更改此行中单元格的文本内容。然后在此表的第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();

 }
}

答案 1 :(得分:2)

我有类似的情况,我让它以更聪明的方式工作。

让我们说我们在word文件(模板)中有表格模板(如下图所示),我们想要动态填充表格行数据。要使此方法起作用,我们必须创建一个模板行,该行已经具有新行所需的格式。在添加所有相同格式的所需行数后,您将使用模板行创建新行并删除模板行。

table template

    XWPFTable table; //this is the table to be populated..needs to be initialized  as per your need.

   //the row ID of the empty row, which is our template row with all the formatting in it
    int tempateRowId = 1;

    // the empty row
    XWPFTableRow rowTemplate = table.getRow(tempateRowId);

    // iterate over the reportData
     Arrays.stream(reportData).forEach(data -> {
    // create a new row from the template, which would copy the format of previous row
     XWPFTableRow oldRow = rowTemplate;
     CTRow ctrow = null;
       try {
            ctrow = CTRow.Factory.parse(oldRow.getCtRow().newInputStream());
           } catch (XmlException e) {e.printStackTrace();
           } catch (IOException e) { e.printStackTrace();
           }

    XWPFTableRow newRow = new XWPFTableRow(ctrow, table);
         newRow.getCell(0).setText(data.getDataForColumn1());
         newRow.getCell(1).setText(data.getDataForColumn2());

   // adding the newly created row tot he table   
    table.addRow(newRow);
});

table.removeRow(tempateRowId); // removing the template row

}