2014-01-25 15 views
1

我正在閱讀具有多張工作表的大型XLSX工作簿。在其中一張表中,我只想要A1中的值。該表可能包含大量的其他數據。在獲得我想要的一個值之後,是否有可能中止處理表格的其餘部分(以便考慮時間)?您可以放棄POI中的處理表eventmodel

這裏就是我想打破處理:

private static class shValidationsHandler extends DefaultHandler { 
     //The first cell (A1) holds the only value I want 
     private static String lastVal = ""; 
     public void startElement(String uri, String localName, String name, 
      Attributes attributes) throws SAXException { 
      lastVal = ""; 
     } 
     public void endElement(String uri, String localName, String name) 
      throws SAXException { 
      if (name.equals("v") && sCutOff.length() < 1) { 
       sCutOff = lastVal; //<<==Can stop processing now==>> 
       //<<=========This is what I added 
       SAXException oFin = new SAXException("Finished"); 
       StackTraceElement[] oStack = new StackTraceElement[1]; 
       oStack[0] = new StackTraceElement("","","",0); 
       oFin.setStackTrace(oStack); 
       throw oFin; 
       //<<==========End of what I added 

      } 
     } 
     public void characters(char[] ch, int start, int length) 
      throws SAXException { 
      lastVal += new String(ch, start, length); 
     } 
    } 

有誰知道這是否可能?

回答

1

你可以做到這一點,你會停止在一個正常的SAX解析器解析以同樣的方式 - 創建的SAXException一個子類(即,像HaltProcessingException),然後扔它,只要你完成處理 - 例如,sCutOff = lastVal;後。

然後,調用該處理程序的代碼(可能類似於parser.parse())應該捕獲該特定異常並記錄完成處理並禁止該異常。

+0

我做了一些與你所建議的不同的東西,儘管我會假設你作爲正確的方式來做到這一點,而我所做的只是一種破解。獲得該值後,我建立了一個SAXException對象,其中包含一個'Finished'的消息,其中一個堆棧跟蹤元素是所有空間並拋出該消息。我只是用try catch封裝瞭解析器調用並查找了該消息。如果該消息不是導致該異常的原因,我會照常處理它。如果這是我的「成品」例外,我會照常繼續。 –

相關問題