poi生成word特殊表格合并单元格,wps不兼容问题 您所在的位置:网站首页 wpsword两个表格合并 poi生成word特殊表格合并单元格,wps不兼容问题

poi生成word特殊表格合并单元格,wps不兼容问题

2023-07-06 19:21| 来源: 网络整理| 查看: 265

百度了半天没百度出来解决的问题,可能是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 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);//这是起点elsecell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);//继续合并} }

,但那只是针对表格的格式不改变的情况:假如我第一行6个,那么我下面所有行都必须是6个单元格才行.

而我这种第一行6个,第二行8个的 合并单元格是不行的 ,出现的问题是在微软的office下打开合并单元格样式是正确的.

但是在wps,手机wps,以及其他浏览器,打开格式都是不对的.都是那种没有合并的样式.合并单元格没生效的样子.

我觉得可能是poi技术不支持可能,我也没深入研究

 

对这种困境我的解答是:

 

在模板多生成一行,如上图我的第三行在模板中进行了合并然后写上无异常

 

 

思路:

首先拿到数据集合列表,判断一下,是否有值,有值,我就生成8个单元格的列表,然后赋值.删除第三行

集合没值 ,我就删了表格的最后一行,那个无异常就直接出来了.这样页面就正常了.

 

 

 

 

 

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有