通过SXSSF(Apache POI)使用自定义颜色

我试图写一个巨大的Excel文件,我的要求允许我写行和忘记,所以我使用SXSSF ,它允许保持在内存中只有less数几行,并rest所有写入文件。 这有助于克服大文件的内存exception。

但我也需要使用sxssf工作簿将样式设置为单元格。 我无法find在SXSSF中定义和使用自定义颜色的方法(就像在XSSF中,我们可以直接定义自定义颜色,而在HSSF中,我们可以使用自定义颜色replace调色板中的条目)

我无法从SXSSF工作簿中find调色板。

由于构造函数受保护,我无法创build新的HSSF调色板 。

现在看起来可行的唯一方法是以某种方式从所有预定义的颜色列表中find一个类似的颜色并使用它,而不是原始颜色(但是需要有一个rgb颜色匹配algorithm,这将是另一个任务)

有人可以提出一个解决方法(或者可能build议一个原始RGB颜色匹配algorithm)

所以,在通过networkingsearch和阅读文档之后,我得到了一个提示:SXSSF实际上是XSSF的包装,所以我将SXSSF工作簿返回的CellStyletypes化为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); 

为了避免需要使用types为cellStyles的types,首先创build一个XSSFWorkbook,其中应用了自定义颜色的cellStyles(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(); }