首页 文章

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

提问于
浏览
6

我正在尝试写一个巨大的excel文件,我的要求允许我写行并忘记,所以我使用SXSSF,它允许在内存中只保留少量行,其余都写入文档 . 这有助于克服大文件的outofmemory异常 .

但我还需要使用sxssf工作簿将样式设置为单元格 . 我无法在SXSSF中找到定义和使用自定义颜色的方法(比如在XSSF中,我们可以直接定义自定义颜色,在HSSF中我们可以用自定义颜色替换调色板中的条目)

我找不到从SXSSF workbook访问调色板的方法 .

由于构造函数受到保护,我无法创建新的HSSF palette .

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

有人可以建议一个解决方法(或者可能建议一个原始的rgb颜色匹配算法)

2 回答

  • 11

    因此,在通过网络搜索并阅读文档之后,我得到了一个提示,即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);
    
  • 4

    为了避免对cellStyles进行类型转换的需要,首先使用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();
    }
    

相关问题