2015-06-22 314 views
0

我使用SAX解析器运行的Apache POI的EventUserModel读取Excel表格。用Apache POI的SAX解析器获取Excel的计算单元值

的问题是,我有一些正常细胞与像 内容“你好” 和细胞像这样的内容: =IF(SUM(P254;R254;N254)=0;V254;VLOOKUP(Z254;Cirteria!$Y$2:$Z$4;2;TRUE))

我不希望这些公式,但其评估值如“你好”。我知道它保存在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; 
    } 
} 

我得到我所需要的只是通过公式产生的数据的数据。

+0

使用SAX解析,您可以获取所有XML数据。你是否做了一些简单的事情,比如忘记捕获它们过去的数据元素? – Gagravarr

+0

你的解析代码是什么样的? –

+0

我添加了我的代码,应该立即完成。我可以捕获公式,如果我接受cellType“str”但我不想要这些,我只想要评估值。这不是关于遗忘,而是关于如何访问这些数据,如果它的访问方式不同于没有公式的数据。 – Don

回答

0

这是一个古老的线索,但我试图找出一个类似的问题,并认为我会张贴这个希望它会帮助未来的人。单元内公式的标签结构与典型的单元/值结构不同。

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

`<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(...)方法将存储式的值,则在之间的缔结值两个不同的标签。

因此,在评估指定值时,您必须了解公式标记对您的价值的影响。