2013-06-26 74 views
1

我正在使用POI的事件API來處理大量的記錄而沒有任何內存足跡問題。 Here是它的推薦。POI XSSF和SAX(事件API)的日期格式問題

當我處理XLSX表,我得到不同的格式的日期值比Excel表中的指定格式。 excel表格中列的日期格式爲'dd-mm-yyyy',其中以'mm/dd/yy'格式獲取值。

有人可以告訴我如何獲得在Excel表中給出的實際格式。代碼片段的參考如下。

ContentHandler handler = new XSSFSheetXMLHandler(styles, strings, 
      new SheetContentsHandler() { 
      public void startRow(int rowNum) { 
      } 
      public void endRow() { 
      } 
      public void cell(String cellReference, String formattedValue) { 
        System.out.println(formattedValue); 
       } catch (IOException e) { 
        System.out.println(
         "Exception during file writing"); 
       } 
       } 

獲取formmatedValue在細胞的方法對於日期列就像是「MM/DD/YY」,因此我不能能夠正確執行的驗證在我的PL/SQL程序。

回答

2

Excel使用區域設置存儲一些日期。例如,在Excel中的數字格式對話框中,您將看到如下警告:

根據您指定的類型和區域設置(位置),將日期和時間序列號顯示爲日期值。以星號(*)開頭的日期格式響應「控制面板」中指定的區域日期和時間設置中的更改。沒有星號的格式不受控制面板設置的影響。

您正在閱讀的Excel文件可能正在使用其中一個*日期。在這種情況下,POI可能使用美國默認值。

您可能需要添加一些變通辦法代碼來將日期格式字符串映射爲所需的格式。

關於regional date settings in Excel的討論,另請參閱以下內容。

+0

那麼;這是絕對好的。當我手動將語言環境更改爲英國時,獲得預期的價值(dd-mm-yyyy)。不過,我想用宏替換區域設置,因爲我的工作表正在使用另一個宏表生成。有什麼想法? – hemanth

4

我有同樣的問題。經過幾天的搜索和研究,我想出了一個解決方案。不幸的是,它不好,但它的工作原理:

  1. 在您的項目中複製org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler類。
  2. 查找類中的接口SheetContentsHandler
  3. 添加新的方法定義:String overriddenFormat(String cellRef, int formatIndex, String formatString);
  4. 在該類中查找此方法:public void endElement(String uri, String localName, String name) throws SAXException
  5. 它有一個很長的切換單元格類型。
  6. 在這種情況下NUMBER有一個,如果這樣的語句:if (this.formatString != null) {...
  7. 在此之前,粘貼此代碼:

    String overriddenFormat = output.overriddenFormat(cellRef, formatIndex, formatString); 
    if (overriddenFormat != null) { 
        this.formatIndex = -1; 
        this.formatString = overriddenFormat; 
    } 
    
  8. 按照本文/回答:https://stackoverflow.com/a/11345859但使用新的類和接口。

  9. 現在,如果需要,您可以使用唯一的日期格式。

我的使用情況是: 在一個給定的表我有G,H日期值,和我列,所以我實施SheetContentsHandler.overriddenFormat是:

@Override 
public String overriddenFormat(String cellRef, int formatIndex, String formatString) { 
    if (cellRef.matches("(G|H|I)\\d+")) { //matches all cells in G, H, and I columns 
     return "yyyy-mm-dd;@"; //this is the hungarian date format in excel 
    } 
    return null; 
} 

正如你所看到的,在endElement方法我已經重寫了formatIndex和formatString。格式索引的可能值在org.apache.poi.ss.usermodel.DateUtil.isInternalDateFormat(int format)中描述。如果給定的值不適合這些(並且-1不適合),那麼將通過格式化時間戳值來使用formatString。 (時間戳值從約1900.01.01開始計算並且具有日分辨率。)