admin 管理员组文章数量: 887017
这两天公司要求用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());
}
}
}
版权声明:本文标题:POI操作WORD表格系列--复制表格,填充数据 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1726312116h934595.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论