百度了半天没百度出来解决的问题,可能是poi技术就是不支持吧.所以我用了其他思想让他兼容.
先说点废话:
我们用的技术时poi框架 这个框架是有微软office兼容的,但是他对wps以及其他的工具还是有一定不兼容的,
而且poi对于生成word方面的能力确实不如他生成xsl那种表格好.其他的特点另行百度,很多文章介绍.
这也是我才解决的bug
首先这个模板里第一行是6个单元格 ,第二行第三行都是8个单元格
我们的业务是得到一个存放数据的列表,然后我拿到列表判断里面是有有值.
有的话我就在word最下面那行动态生成列表.,没有的话我就把最下面的那行合并单元格然后显示"无异常"
通过wps生成docx做一个模板
模板在标题的下面多出一行是因为poi技术生成行的时候这种情况我不能直接table.createRow()了.
因为他会跟着我表格的第一行的格数在表格末尾生成6行.
如果我想直接根据第二行在尾部生成行.
了解到poi的一些添加行api,发现不行.他的其他api是浅度复制行的.复制出来,添加数据 就乱了.原本想着数据在每一行的每一个单元格都附上去.用了它的api,成了一行每一个单元格在循环追加.反正就是数据乱了,用过就知道了.
所以我找了一个进行深度复制行的代码:
/**
* 深入拷贝
* @param table
* @param sourceRow
* @param rowIndex
*/
public static void copyRow(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());
}
}
}
直入主题:
首先对于上面的业务 ,那个列表没值表格下面一行显示无异常的功能.
我首先想到的是合并单元格
但是我在网上搜了一下合并单元格的代码之后确实有效
public static void mergeCellsHorizontal(XWPFTable table, int row, int fromCell, int toCell) {
//将第一列到第四列合并
for (int i = fromCell; i < toCell; i++) {
//对单元格进行合并的时候,要标志单元格是否为起点,或者是否为继续合并
XWPFTableCell cell = table.getRow(row).getCell(i);
if (i == fromCell)
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);//这是起点
else
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);//继续合并
}
}
,但那只是针对表格的格式不改变的情况:假如我第一行6个,那么我下面所有行都必须是6个单元格才行.
而我这种第一行6个,第二行8个的 合并单元格是不行的 ,出现的问题是在微软的office下打开合并单元格样式是正确的.
但是在wps,手机wps,以及其他浏览器,打开格式都是不对的.都是那种没有合并的样式.合并单元格没生效的样子.
我觉得可能是poi技术不支持可能,我也没深入研究
对这种困境我的解答是:
在模板多生成一行,如上图我的第三行在模板中进行了合并然后写上无异常
思路:
首先拿到数据集合列表,判断一下,是否有值,有值,我就生成8个单元格的列表,然后赋值.删除第三行
集合没值 ,我就删了表格的最后一行,那个无异常就直接出来了.这样页面就正常了.