POI word 合并表格的行和列,merge table row and colume,亲测有效

需求描述:

对已经生成的word进行处理,要对表格中的进行合并。
参考:https://stackoverflow.com/questions/15984896/how-to-merge-cells-or-apply-colspan-using-xwpftable-in-poi-in-java/data.stackexchange.com?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

效果图:

这里写图片描述

代码:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.List;

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTVMerge;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;

/*
 * 使用POI库对word进行处理的工具类
 */
public class WordPOIUtils {
    public static void mergeColumeAndRow(String sourceFile, String targetFile) {
        try {
//          String fileName = "D:/案件报告.docx"; 
//          String fileName = "E:/nctcFile/模板/测试合并列.docx";
            XWPFDocument doc = new XWPFDocument(new FileInputStream(sourceFile));

            List<XWPFTable> XWPFtables = doc.getTables();
            for (XWPFTable table : XWPFtables) {
                //合并列:如果表格的第一列的上下两个单元格相同,进行合并。
                for(int row =0 ;row < table.getRows().size(); row++) {//每一行
                    if (row == table.getRows().size() -1) continue; //最后一行跨过去

                    XWPFTableCell cell0 = table.getRow(row).getCell(0);
                    XWPFTableCell cell1 = table.getRow(row + 1).getCell(0);
                    if(cell0.getText().equals(cell1.getText())) {
//                      System.out.println("这两个列一样");
                        // First Row, 设置合并的开始点
                        CTVMerge vmerge = CTVMerge.Factory.newInstance();
                        vmerge.setVal(STMerge.RESTART);
                        cell0.getCTTc().getTcPr().setVMerge(vmerge);
                        cell1.getCTTc().getTcPr().setVMerge(vmerge);

                         // Second Row cell will be merged ,设置合并的结束点
                        CTVMerge vmerge1 = CTVMerge.Factory.newInstance();
                        vmerge1.setVal(STMerge.CONTINUE);
                        cell0.getCTTc().getTcPr().setVMerge(vmerge1);
                        cell1.getCTTc().getTcPr().setVMerge(vmerge1);
                    }
                }
                //合并行:如果一行中最后面的单元格全是空行,则合并它们
                for(XWPFTableRow currentRow : table.getRows()) {
                    int cellHasText = 0;//记录从第几个单元格以后开始为空的
                    for(int i = currentRow.getTableCells().size() -1; i>= 0 ;i--) {
                        if( !currentRow.getCell(i).getText().equals("")) {
                            cellHasText = i;
                            break;
                        }
                    }
                    if(cellHasText > 0) {//开始合并
                        for(int i = cellHasText; i < currentRow.getTableCells().size() ;i++) {
//                          System.out.println("开始合并行了");
                            if (i == cellHasText){
                                currentRow.getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);    
                            } else {
                                currentRow.getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
                            }
                        }
                    }
                }
            }

            FileOutputStream fos = new FileOutputStream(targetFile);  
            doc.write(fos);  
            fos.close();  
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) throws Exception {  
        String sourceFile = "E:/nctcFile/报告/temp.docx";
        String targetFile = "E:/nctcFile/报告/temp-result.docx";
        mergeColumeAndRow(sourceFile, targetFile);
    }  
}
  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值