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來復制表格,所以需要通過自己寫代碼復制指定行的樣式和數據。

public void copy(XWPFTable table,XWPFTableRow sourceRow,int rowIndex){
//在表格指定位置新增一行
XWPFTableRow targetRow = table.insertNewTableRow(rowIndex);
//復制行屬性
targetRow.getCtRow().setTrPr(sourceRow.getCtRow().getTrPr());
List<XWPFTableCell> cellList = sourceRow.getTableCells();
if (null == cellList) {
return;
}
//復制列及其屬性和內容
XWPFTableCell targetCell = null;
for (XWPFTableCell sourceCell : cellList) {
targetCell = targetRow.addNewTableCell();
//列屬性
targetCell.getCTTc().setTcPr(sourceCell.getCTTc().getTcPr());
//段落屬性
if(sourceCell.getParagraphs()!=null&&sourceCell.getParagraphs().size()>0){
targetCell.getParagraphs().get(0).getCTP().setPPr(sourceCell.getParagraphs().get(0).getCTP().getPPr());
if(sourceCell.getParagraphs().get(0).getRuns()!=null&&sourceCell.getParagraphs().get(0).getRuns().size()>0){
XWPFRun cellR = targetCell.getParagraphs().get(0).createRun();
cellR.setText(sourceCell.getText());
cellR.setBold(sourceCell.getParagraphs().get(0).getRuns().get(0).isBold());
}else{
targetCell.setText(sourceCell.getText());
}
}else{
targetCell.setText(sourceCell.getText());
}
}
}
 
————————————————
版權聲明:本文為CSDN博主「流年輕描淡寫的傷」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/lexuansweet/article/details/81288262


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM