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

百度了半天没百度出来解决的问题,可能是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个单元格的列表,然后赋值.删除第三行

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

 

 

 

 

 

 

要获取Word Doc中表格合并单元格,可以使用Apache POI库中的XWPFTable类和XWPFTableCell类。 以下是一个示例代码,可以通过它来获取表格中的合并单元格: ```java import org.apache.poi.xwpf.usermodel.*; import java.util.List; public class WordTableMergeCellsExample { public static void main(String[] args) throws Exception { // Load the document XWPFDocument doc = new XWPFDocument(new FileInputStream("example.docx")); // Get the first table in the document XWPFTable table = doc.getTables().get(0); // Iterate through the rows in the table for (XWPFTableRow row : table.getRows()) { // Iterate through the cells in the row for (XWPFTableCell cell : row.getTableCells()) { // Get the list of merged cells List<XWPFTableCell> mergedCells = table.getTableCellsBeingMerged(cell); // If the current cell is merged with other cells if (mergedCells.size() > 1) { System.out.println("Cell at row " + row.getRowNum() + ", column " + cell.getColumnIndex() + " is merged with:"); // Print the merged cells for (XWPFTableCell mergedCell : mergedCells) { System.out.println(" Row " + table.getRow(mergedCell).getRowNum() + ", column " + mergedCell.getColumnIndex()); } } } } // Close the document doc.close(); } } ``` 该代码将遍历表格中的所有单元格,并检查每个单元格是否与其他单元格合并。如果单元格合并,则该代码将打印出该单元格合并单元格的位置信息。 请注意,该代码假定文档中至少有一个表格。如果您的文档中没有表格,或者您想获取其他表格中的合并单元格,请相应地修改代码。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值