繁体   English   中英

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

[英]Get evaluated cell value of Excel with SAX-Parser of Apache POI

我读了带有Apache POI的EventUserModel的Excel工作表,该表与SAX-Parser一起运行。

问题是我有一些正常的单元格,其内容类似于“ 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总是返回此值而不是Data值。 否则,返回正常的“ 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;
    }
}

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

这是一个旧线程,但是我试图找出类似的问题,并认为我会发布此消息,以希望将来对某人有所帮助。 单元格中公式的标记结构与典型的单元格/值结构不同。

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

`<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> `

请注意, characters(...)方法将存储公式的值,然后将结论值存储在两个不同的标签之间。

因此,在评估分配的值时,您必须认识到公式标签对您的值的影响。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM