关于JAVA POI解析WPS docx文档中的table(复杂表格包含单元格横向,纵向的合并)

本文档详细介绍了使用JAVA POI库解析WPS docx文档中包含横向合并的复杂表格所遇到的问题及解决方案。在解析过程中,发现WPS docx的xml格式与标准的docx格式存在差异,导致HMerge信息无法获取。通过分析XML结构,找到了替代方法,最终成功解析表格。文章展示了解析后的效果,并提供了关键代码,包括如何处理网格合并(gridSpan)导致的单元格缺失,以及纵向单元格合并的解析策略。
摘要由CSDN通过智能技术生成

关于JAVA POI解析WPS docx文档中的table(复杂表格包含单元格横向,纵向的合并)

首先,关于poi解析表格先阅读一篇他人的博客

使用poi读取word2007(.docx)中的复杂表格.
这篇博客提到了,如何用poi将单元格合并。

static void mergeCellHorizontally(XWPFTable table, int row, int fromCol, int toCol) {
   
        for(int colIndex = fromCol; colIndex <= toCol; colIndex++){
   
            CTHMerge hmerge = CTHMerge.Factory.newInstance();
            if(colIndex == fromCol){
   
                // The first merged cell is set with RESTART merge value
                hmerge.setVal(STMerge.RESTART);
            } else {
   
                // Cells which join (merge) the first one, are set with CONTINUE
                hmerge.setVal(STMerge.CONTINUE);
            }
            XWPFTableCell cell = table.getRow(row).getCell(colIndex);
            // Try getting the TcPr. Not simply setting an new one every time.
            CTTcPr tcPr = cell.getCTTc().getTcPr();
            if (tcPr != null) {
   
                tcPr.setHMerge(hmerge);
            } else {
   
                // only set an new TcPr if there is not one already
                tcPr = CTTcPr.Factory.newInstance();
                tcPr.setHMerge(hmerge);
                cell.getCTTc().setTcPr(tcPr);
            }
        }
    }

记住CTTcPr 这个类,他包装了单元格的格式信息
CTTcPr tcPr = cell.getCTTc().getTcPr();

但是,当我开始解析wps的docx后发现横向合并的单元格信息根本拿不到。就是HMerge这个对象。一直为空。VMerge倒是没问题。

打开docx文件的xml文件一看发现了问题

	<w:tc>
      <w:tcPr>
        <w:tcW w:w="1000" w:type="dxa"/>
        <w:hMerge w:val="restart"/>
      </w:tcPr>
      <w:p>
        <w:r>
          <w:t>row 1, col 2</w:t>
        </w:r>
      </w:p>
    </w:tc>

这是我们期望的格式

	<w:tc>
      <w:tcPr>
        <w:tcW w:w="1000" w:type="dxa"/>
        <w:gridSpan w:val="2"/>
      </w:tcPr>
      <w:p>
        <w:r>
          <w:t>row 1, col 2</w:t>
        </w:r>
      </w:p>
    </w:tc>

wps docx打开是这样的。区别在于hMerge 和gridSpan

hMerge不释放td对象。比如一行5列。1-2合并
那么在poi里得到5个cell对象。1的hMerge枚举为started。2为continue。
gridSpan反之。1-2合并,只能拿到4个cell。

虽然费了一般波折,总算可以解析出来了。废话不多
说。先看效果,再上代码

在这里插入图片描述
这是docx文档中的表格

在这里插入图片描述
这是解析,并用html生成的table

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.junit.Test;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
import org.openxmlformats.schemas
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值