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