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

使用Apache POI的SAX-Parser获取Excel的评估单元格值

林昱
2023-03-14

我阅读了一份excel表格,其中包含ApachePOI的EventUserModel,它使用SAX解析器进行操作。

问题是我有一些普通的单元格,内容像“hello”,而单元格的内容像这样:=IF(SUM(P254;R254;N254)=0;V254;VLOOKUP(Z254;Cirteria!$Y$2:$Z$4;2;TRUE))

我不需要这些公式,但需要它们的评估值,例如“hello”。我知道它保存在XML中,但我不知道如何访问它。

<Cell ss:StyleID="s168"
    ss:Formula="=IF(SUM(RC[-11],RC[-9],RC[-13])=0,RC[-5],VLOOKUP(RC[-1],Kriterien!R2C25:R4C26,2,TRUE))">
    <Data ss:Type="String">hello</Data>
</Cell>
<Cell ss:StyleID="s167"><Data ss:Type="String">hello</Data></Cell>

似乎有一个“公式”标记,SAX总是返回这个值而不是数据值。否则将返回正常的“hello”。

我的代码如下所示:

public void startElement(String uri, String localName, String name,
        Attributes attributes) throws SAXException {
    if (name.equals("c")) {
        String cellType = attributes.getValue("t");
        if (cellType != null && cellType.equals("s")) {
            nextIsString = true;
        } else {
            nextIsString = false;
        }
    }
    lastContents = "";
}
public void characters(char[] ch, int start, int length)
        throws SAXException {
    lastContents = new String(ch, start, length);
}
public void endElement(String uri, String localName, String name)
        throws SAXException {
    if (nextIsString) {
        int idx = Integer.parseInt(lastContents);
        lastContents = new XSSFRichTextString(sst.getEntryAt(idx))
                .toString();
        System.out.println(lastContents);
        nextIsString = false;
    }
}

我得到了所有我需要的数据,除了公式产生的数据。

共有1个答案

霍锦
2023-03-14

这是一个旧的线程,但我试图找出一个类似的问题,并认为我会张贴在希望这将有助于未来的人。单元格中公式的标记结构与典型的单元格/值结构不同。

因此,您必须了解公式标记在单元格内何时打开和关闭,以及值在单元格内何时打开和关闭。标记结构类似于(当然没有属性,为了简单起见,行中只有一个单元格)。。。

`<row> <c> <f> IF(SUM(RC[-11],RC[-9],RC[-13])=0,RC[-5],VLOOKUP(RC[-1],Kriterien!R2C25:R4C26,2,TRUE))</f> <v> hello </v> </c> </row> `

请注意,字符(…)方法将存储公式的值,然后在两个不同的标记之间存储得出的值。

因此,在计算指定的值时,必须了解公式标记对值的影响。

 类似资料:
  • 由于内存问题,我们使用ApachePOI的Sax解析器方法来读取大量数据。xlsx excel文件。然而,这种方法在公式单元格中似乎有局限性。它似乎从“缓存的公式值”中读取值。我找不到触发重新计算以更新值的最佳解决方案。有人面临同样的问题吗?谢谢

  • 问题内容: 我正在使用Android从Web解析XML。下面的代码显示了XML的示例。我遇到的问题是我无法获得item标签的字符串值。当我使用它时,它输出的是名称,而不是属性的值。 问题答案: 用 代替 因为正如文档所说: getQName : 返回属性的限定名称(前缀)。 getValue : 通过限定(前缀)名称查找属性的值。 请参阅此示例以获取属性名称和值

  • null 如您所料,A3将导致。现在将A2的格式更改为会计,使用小数点后2位。A2现在读,但是基础值仍然是,所以A3仍然是。 VBA 制作一个新模块并添加以下函数: null 和具有相同的基础值,但和没有,尽管它们都是使用和的方法计算的。 ()中的表达式正在访问和的实际基础值。如何在VBA中访问这些值?

  • 在Java中,我应该得到的输出是

  • SAX(Simple API for XML)是一种基于事件的XML文档解析器。 与DOM解析器不同,SAX解析器不会创建解析树。 SAX是XML的流式接口,这意味着使用SAX的应用程序接收有关正在处理的XML文档的事件通知元素和属性,从文档顶部开始按顺序排列,然后关闭ROOT元素。 从上到下读取XML文档,识别构成格式良好的XML文档的标记。 令牌的处理顺序与它们在文档中出现的顺序相同。 向应用

  • SAX(Simple API for XML)是一个基于事件的xml文档解析器。 与DOM解析器不同,SAX解析器不会创建解析树。 SAX是XML的流式接口,这意味着使用SAX的应用程序接收有关正在处理的XML文档的事件通知 - 元素和属性,从文档顶部开始按顺序排列,并以关闭为止ROOT元素。 从上到下读取XML文档,识别构成格式良好的XML文档的标记。 令牌的处理顺序与文档中出现的顺序相同。 报