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

9
我正在尝试编写一个巨大的Excel文件,我的要求是可以编写一行并忘记它,所以我正在使用SXSSF,它允许在内存中仅保存少量行数据,其余数据则写入文档。这有助于解决大文件内存不足异常问题。
但是我还需要使用sxssf工作簿为单元格设置样式。我无法找到在SXSSF中定义和使用自定义颜色的方法(就像在XSSF中我们可以直接定义自定义颜色,在HSSF中我们可以用自定义颜色替换调色板中的条目)。
我找不到一种从SXSSF工作簿中访问调色板的方法。
我不能创建新的HSSF调色板,因为构造函数是受保护的。
目前唯一可行的方法似乎是从所有预定义颜色列表中找到类似的颜色并使用它,而不是使用原始颜色(但这将需要具有rgb颜色匹配算法,这将是另一个任务)。
有人能提供一种解决方法(或者建议一个原始的rgb颜色匹配算法)吗?
3个回答

16

经过一番在网上搜索和阅读文档后,我得到了一个提示:SXSSF 实际上是 XSSF 的包装器。因此,我将 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);

我曾尝试将RGB转换为Lab格式,然后使用欧几里得距离来查找相似的颜色,但在这种情况下并没有奏效,因为必须从仅有48个预定义的可用HSSFColors中找到相似的颜色。因此,所有256256256种颜色都被映射到了仅有48种颜色。 - gaurav5430

5
为了避免对单元格样式进行类型转换,首先创建一个带有自定义颜色的cellStyles(XSSFCellStyle)的XSSFWorkbook,然后使用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();
}

1
CellStyle style = workbook.createCellStyle(); // workbook is of SXSSF type
byte orange[] = new byte[] { (byte) 248, (byte) 203, (byte) 173 };
byte thick_shade_blue[] = new byte[] { (byte) 142, (byte) 169, (byte) 219 };
byte blue[] = new byte[] { (byte) 180, (byte) 198, (byte) 231 };

((XSSFCellStyle) style).setFillForegroundColor(new XSSFColor(thick_shade_blue, null));
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接