2013-12-13 48 views
5

我想寫一個巨大的Excel文件,我的要求允許我寫行和忘記,所以我使用SXSSF它允許保持只有少數行的內存其餘全部寫入文件。這有助於克服大文件的內存異常。使用自定義顏色與SXSSF(Apache POI)

但我還需要使用sxssf工作簿將樣式設置爲單元格。我無法找到在SXSSF中定義和使用自定義顏色的方法(如在XSSF中,我們可以直接定義自定義顏色,並且在HSSF中我們可以用自定義顏色替換調色板中的條目)

i無法訪問SXSSF workbook中的調色板。

由於構造函數受保護,我無法創建新的HSSF palette

現在看起來可行的唯一方法是以某種方式從所有預定義顏色列表中找到類似的顏色並使用它,而不是原始顏色(但需要具有rgb顏色匹配算法,這將是另一種顏色任務)

有人建議解決方法(或者提出一個基本的RGB色彩匹配算法)

回答

11

所以,有些通過網絡搜索和閱讀文檔後,我得到了一個暗示,SXSSF居然是因此我將由SXSSF工作簿返回的CellStyle類型化爲XSSF,並能夠直接使用XSSFColor生成顏色。

SXSSFWorkbook workbook = new SXSSFWorkbook(50); 
Sheet sheet = workbook.createSheet("Image Data"); 
.... 
Cell cell = row.createCell(j); 
cell.setCellValue(j); 
XSSFCellStyle cs1 = (XSSFCellStyle) workbook.createCellStyle(); 
cs1.setFillForegroundColor(new XSSFColor(new java.awt.Color(red,green,blue)));   
cs1.setFillPattern(CellStyle.SOLID_FOREGROUND); 
cell.setCellStyle(cs1); 
+0

否則我曾嘗試將RGB轉換爲實驗室格式,然後使用歐幾里得距離來查找相似的顏色,但在這種情況下不起作用,因爲只能從48個預定義的可用HSSFColors中找到類似的顏色。所以在所有256 * 256 * 256種顏色被映射到只有48。 – gaurav5430

3

爲了避免強制轉換爲cellStyles的需要,首先創建與cellStyles一個XSSFWorkbook(XSSFCellStyle)將所述自定義顏色,然後用SXSSFWorkbook構造包裹它像以下示例:

/** 
* Sample based on POI <a href="http://poi.apache.org/spreadsheet/how-to.html#sxssf">Spreadsheet How-To</a>. 
* 
* @see <a href="https://poi.apache.org/apidocs/org/apache/poi/xssf/streaming/SXSSFWorkbook.html">SXSSFWorkbook</a> 
*/ 
public static void main(String[] args) throws Throwable { 

    XSSFWorkbook xssfWorkbook = new XSSFWorkbook(); 

    XSSFColor colorGrey = new XSSFColor(new Color(210, 210, 210)); 
    XSSFCellStyle cellStyleGrey = xssfWorkbook.createCellStyle(); 
    cellStyleGrey.setFillPattern(CellStyle.SOLID_FOREGROUND); 
    cellStyleGrey.setFillForegroundColor(colorGrey); 

    // keep 100 rows in memory, exceeding rows will be flushed to disk 
    SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(xssfWorkbook, 100); 
    Sheet sheet = sxssfWorkbook.createSheet(); 

    for (int rownum = 0; rownum < 1000; rownum++) { 
     Row row = sheet.createRow(rownum); 
     for (int cellnum = 0; cellnum < 10; cellnum++) { 
      Cell cell = row.createCell(cellnum); 
      String address = new CellReference(cell).formatAsString(); 
      cell.setCellValue(address); 

      // for even rows apply the grey cellStyle 
      if (rownum % 2 == 0) { 
       cell.setCellStyle(cellStyleGrey); 
      } 
     } 

    } 

    // Omitted asserts block from original sample... 

    FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx"); 
    sxssfWorkbook.write(out); 
    out.close(); 

    // dispose of temporary files backing this workbook on disk 
    sxssfWorkbook.dispose(); 
}