2012-08-30 64 views
0

我導入了一個非常大的使用POI事件的excel。我得到了所有的內容,但不是單元格背景色!在poi事件中獲取單元格背景顏色

我嘗試了ExtendedFormatRecords(如here所述),但我無法確定哪個是具有行號和列號信息的前一個單元!

在我的情況下,我需要NumberRecords的顏色!

以下是我嘗試:

switch (record.getSid()) { 
    case BOFRecord.sid: 
     break; 
    case BoundSheetRecord.sid: 
     BoundSheetRecord bsr = (BoundSheetRecord) record; 
     System.out.println("New sheet named: " + bsr.getSheetname()); 
     break; 
    case RowRecord.sid: 
     break; 
    case NumberRecord.sid: // Contains a numeric cell value 
     NumberRecord numrec = (NumberRecord) record; 
     row = numrec.getRow(); 
     col = numrec.getColumn(); 
     //Do something 
     break; 
    case ExtendedFormatRecord.sid: 
     ExtendedFormatRecord efr = (ExtendedFormatRecord) record; 
     if (previousSid == NumberRecord.sid) { 
      // row = previousRecord.getRow(); 
      // col = previousRecord.getColumn(); 
      // System.out.println("row: " + row + " column: " + col); 
      System.out.println("ExtendedFormat "+efr.getFillForeground() + ""); 
     } else { 
      System.out.println("ops! not that"); 
     } 
     break; 
     //other cases 
     ... 
    }//end switch 
    previousSid = record.getSid(); 
    if (previousRecord != record) { 
     previousRecord = null; 
    } 

誰能幫我!?

謝謝!

+0

http://stackoverflow.com/a/11981672/1211000 – swamy

+0

@swamy這並沒有工作,因爲我使用[POI事件API](http://poi.apache.org/spreadsheet/how- to.html#event_api),它不允許訪問CellStyle。 – licabl

回答

0

在我們深入細節之前,我認爲有兩點代碼應該看一看。第一個是Apache POI的一部分,並在處理Excel文件時處理跟蹤格式和樣式,作爲EventUserModel的一部分 - FormatTrackingHSSFListener。其次,Apache Tika的一部分是一個使用它在事件處理中對單元格進行即時格式化的例子 - ExcelExtractor

你想做的事應該是可能的,但它需要一點點工作。幸運的是,Excel中的格式和樣式信息是工作簿信息的一部分,而不是表單信息的一部分,所以它首先出現。您需要做的是在您首次訪問這些記錄時緩存這些記錄,以便在單元格過去時可以使用這些記錄。其次,你應該看看POI UserModel代碼,看看它如何處理記錄來處理顏色和格式。雖然你不能使用這些類,但你很可能會從他們那裏借用幾個關鍵代碼片段來爲你自己的類實現同樣的事情。

您要做的就是使用FormatTrackingHSSFListener獲取ExtendedFormatRecords,然後查找每個單元的記錄。在XFR上,你會發現各種顏色相關的細節。有填充前景和背景顏色,邊框和字體。接下來,當你得到PaletteRecord時,保留它,並將其包裝在一個UserModel HSSFPalette類中。然後,您可以使用它根據XFR中的索引獲取顏色。您還應該捕獲FontRecords,以便您可以從XFR上的索引中查找這些內容,並從FontRecord中獲取顏色索引,然後在HSSFPalette上查看並完成!

最後,如果你確實得到它的工作,請考慮發送它作爲Apache POI的增強來幫助下一個人!

+0

非常感謝!有效。訣竅是瞭解ExtendedFormatRecord是工作簿的一部分,以及如何將它鏈接到單元格後者!我無法訪問HSSFPalete構造函數,因此重新創建了具有不同名稱(ExcelPalette)但具有相同內容的類。 – licabl

+0

如果其他人需要它,我將之前的代碼更改爲: 'case PaletteRecord.sid:palette = new ExcelPalette((PaletteRecord)record); break; case ExtendedFormatRecord.sid: ExtendedFormatRecord xfr =(ExtendedFormatRecord)record; _xfRecords.add(xfr); 休息; case NumberRecord.sid://包含數值單元值 NumberRecord numrec =(NumberRecord)record; ExtendedFormatRecord xfr = _xfRecords.get(numrec。getXFIndex());如果(xfr!= null){ } HSSFColor color = palette.getColor(xfr.getFillForeground()); if(color!= null) short [] rgb = color.getTriplet(); \t ...' – licabl

相關問題