簡體   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