当前位置: 首页 > 知识库问答 >
问题:

如何使用ApachePOI的事件API获取合并区域?

封飞
2023-03-14

如何使用Apache POI提供的事件API获取excel工作表的合并区域(合并单元格)?

使用“传统的”类似DOM的解析样式,有一些方法称为Sheet。getNumMergedRegions()工作表。getMergedRegion(int)。不幸的是,我需要处理巨大的Excel文件,在这些文件中,即使使用了允许使用的最高Xmx值,也会出现内存不足的错误(在这个项目中)。所以我想使用事件API,但无法找到如何获取有关合并区域的信息,我需要知道这些信息才能正确“理解”内容。。。

使用这里给出的示例:http://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api我得到合并区域的每个单元格的事件(尽管只有第一个单元格包含任何文本内容)。所以,如果没有更直接的方法,知道这些合并的单元格如何(安全地)与其他(空)单元格区分开来可能会有所帮助...

共有3个答案

逄兴昌
2023-03-14

您需要打开流并对其进行两次解析。

第一次-提取合并的单元格。它们出现在工作表中。。。xml文件

...
< /sheetData >
< mergeCells count="2" >
    < mergeCell ref="A2:C2"/ >
    < mergeCell ref="A3:A7"/ >
 </mergeCells >

提取并保存在一些列表中。

然后再次重新打开流并像往常一样解析它,以提取行和单元格。在endElement(…) 方法完成每一行时,检查该行是否(部分或全部)出现在合并区域中。

乐正宏深
2023-03-14

扩展迈克的答案。您可以创建一个ContentHandler来定位合并区域,例如:

import java.util.ArrayList;
import java.util.List;

import org.apache.poi.ss.util.CellRangeAddress;

import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;

public class MergedRegionLocator extends DefaultHandler {
    private final List<CellRangeAddress> mergedRegions = new ArrayList<>();

    @Override
    public void startElement (String uri, String localName, String name, Attributes attributes) {
        if ("mergeCell".equals(name) && attributes.getValue("ref") != null) {
            mergedRegions.add(CellRangeAddress.valueOf(attributes.getValue("ref")));
        }
    }

    public CellRangeAddress getMergedRegion (int index) {
        return mergedRegions.get(index);
    }

    public List<CellRangeAddress> getMergedRegions () {
        return mergedRegions;
    }
}

与POIs基于事件的解析一起使用它的示例:

OPCPackage pkg = OPCPackage.open(new FileInputStream("test.xlsx"));
XSSFReader reader = new XSSFReader(pkg);
InputStream sheetData = reader.getSheetsData().next();

MergedRegionLocator mergedRegionLocator = new MergedRegionLocator();
XMLReader parser = XMLReaderFactory.createXMLReader();
parser.setContentHandler(mergedRegionLocator);
parser.parse(new InputSource(sheetData));

mergedRegionLocator.getMergedRegions();
索和璧
2023-03-14

我不确定合并的单元格信息存储在哪里,但我相当肯定它不会与单元格数据本身一起存储,因为这不是Excel的方式。

我建议您创建一个没有合并单元格的简单文件。然后,复制一份,并添加一个合并的单元格。解压这两个文件(.xlsx是xmlhtml" target="_blank">文件的压缩文件),并将它们区分开来。这将很快向您显示设置为将单元格标记为合并的内容。(我的直觉是,它将在工作表设置中的某个位置,靠近开始,但不靠近单元格值,BICBW)

一旦您知道合并单元格的详细信息在哪里,您就可以查看XSSF UserModel代码,以了解合并单元格的工作方式、操作方式、选项等。考虑到这一点,您可以查看文件格式文档以了解完整的详细信息,但这些文档可能有点繁重和详细。最后,一旦您知道从何处获取信息,就可以添加代码以使用合并的信息详细信息!

 类似资料:
  • 我有一个巨大的excel文件,其中包含大量列,如下所示:- 当我打印excel中的所有值时,我的代码生成的输出是:- 所以,如果我们看看上面的输出,我们可以注意到我留下空白值的单元格没有被POI库拾取。有没有一种方法可以让这些值为空?还是一种识别所呈现的值跳过空白单元格的方法? 请注意:我使用的不是usermodel(org.apache.poi.ss.usermodel),而是一个事件API来处

  • 问题内容: 我有一个API,它为我提供了Webpack处理的react组件,如下所示: 在react组件内部,我想获取此组件并显示它。到目前为止,这是我尝试过的方法,但不幸的是它没有用。api提取有效,但仅将组件显示为字符串。 我该如何在代码中的api获取的组件中使用它? 问题答案: 通过使用最新的Chrome,您可以执行以下操作: ProfilePage将是一个惰性组件。提取完成后将加载它。等待

  • 我如何合并和消除列表的重复,以便得到的列表应该是包含“a”,“b”,“c”,“d”的MyObjects? 注意:这是对我们实际需要进行重复数据删除的方法的简化,这些方法实际上是hibernate加载的实体的复杂DTO,但是这个示例应该充分展示了目标。

  • 我想使用@RunFor(Parameterized.class)和 实际的测试数据应由业务人员通过Excel创建。 是否有一种简单/通用的方法可以将Apache POI XSSFSheet获取到指定的字符串数组集合? 如果是:有人能提供一个例子吗? 我发现了这个问题:使用Apache POI在TestNG中进行Datadriven测试---但我希望是一种3线测试;-)

  • 我将JRE7与Apache POI3.7一起使用。有人能帮我用事件API获得特定的行吗?

  • 我在jsf中学习一个网络共享项目。在这个项目中,用户可以上传文档,如. doc、. pdf、. ppt等。我想将该文档的第一页显示为缩略图。经过一番谷歌搜索,我找到了Apache POI。有人对我的问题有什么建议吗?我如何返回word doc第一页的缩略图图像?我尝试了这段代码。这段代码只得到word doc包含的第一张图片: