POI操作WORD表格系列--复制表格,填充数据

这两天公司要求用POI生成word模板数据,基本上就是利用WORD书签往指定位置填充数据和表格。按理来说,用freemark会更容易和简单一些,因为POI对WORD的写入实在是不敢恭维。

言归正传,好歹也按要求将报告按模板生成出来了。

首先,归纳几点注意事项:

1.table.addNewRowBetween(int start, int end):在指定范围内插入一行,看上去很美好的方法,实际上是没有实现的,我的poi版本是3.9,如果需要使用这个方法插入行,最好是看一下源码,XWPFTable是否实现了这个方法。

2.table.addRow()和table.addRow(XWPFTableRow row, int pos):前面一个不用说,就是在表格最后一行插入一行,并没有返回值;后一个方法让我栽了大跟头,我起先的理解是在pos的位置插入指定行,这样看来这个方法尤其的实用,特别是在复制行的时候,我想的是直接把表格中要复制的行传入即可,问题就来了,在后面的填充数据时,复制的4行,数据始终填充不进数据。究其原因:还是对象的拷贝问题,addRow中的row是浅拷贝,所以复制出来的行其实都是传入的row对象。

然后,再说复制WORD表格的实现:

上述注意事项已解释为什么不能直接使用addRow来复制表格,所以需要通过自己写代码复制指定行的样式和数据。

  1.  
    public void copy(XWPFTable table,XWPFTableRow sourceRow,int rowIndex){
  2.  
    //在表格指定位置新增一行
  3.  
    XWPFTableRow targetRow = table.insertNewTableRow(rowIndex);
  4.  
    //复制行属性
  5.  
    targetRow.getCtRow().setTrPr(sourceRow.getCtRow().getTrPr());
  6.  
    List<XWPFTableCell> cellList = sourceRow.getTableCells();
  7.  
    if (null == cellList) {
  8.  
    return;
  9.  
    }
  10.  
    //复制列及其属性和内容
  11.  
    XWPFTableCell targetCell = null;
  12.  
    for (XWPFTableCell sourceCell : cellList) {
  13.  
    targetCell = targetRow.addNewTableCell();
  14.  
    //列属性
  15.  
    targetCell.getCTTc().setTcPr(sourceCell.getCTTc().getTcPr());
  16.  
    //段落属性
  17.  
    if(sourceCell.getParagraphs()!=null&&sourceCell.getParagraphs().size()>0){
  18.  
    targetCell.getParagraphs().get(0).getCTP().setPPr(sourceCell.getParagraphs().get(0).getCTP().getPPr());
  19.  
    if(sourceCell.getParagraphs().get(0).getRuns()!=null&&sourceCell.getParagraphs().get(0).getRuns().size()>0){
  20.  
    XWPFRun cellR = targetCell.getParagraphs().get(0).createRun();
  21.  
    cellR.setText(sourceCell.getText());
  22.  
    cellR.setBold(sourceCell.getParagraphs().get(0).getRuns().get(0).isBold());
  23.  
    }else{
  24.  
    targetCell.setText(sourceCell.getText());
  25.  
    }
  26.  
    }else{
  27.  
    targetCell.setText(sourceCell.getText());
  28.  
    }
  29.  
    }
  30.  
    }
     
     
     
     
    有个缺点,生成的行的样式不一样。我加了一行,设置了下cell里的段落里的run的样式
    1.  
      targetCell.getParagraphs().get(0).getCTP().setPPr(sourceCell.getParagraphs().get(0).getCTP().getPPr());
    2.  
      if(sourceCell.getParagraphs().get(0).getRuns()!=null&&sourceCell.getParagraphs().get(0).getRuns().size()>0){
    3.  
      XWPFRun cellR = targetCell.getParagraphs().get(0).createRun();
    4.  
      cellR.setText(sourceCell.getText());
    5.  
      cellR.setBold(sourceCell.getParagraphs().get(0).getRuns().get(0).isBold());
    6.  
      //新加的一行代码,设置run的样式
    7.  
      cellR.getCTR().setRPr(sourceCell.getParagraphs().get(0).getRuns().get(0).getCTR().getRPr());
    8.  
      }else{
    9.  
      targetCell.setText(sourceCell.getText());
    10.  
      }

 

posted @ 2021-01-13 23:21  天涯海角路  阅读(1234)  评论(0)    收藏  举报