当前位置: 首页 > 知识库问答 >
问题:

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

孙正业
2023-03-14

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

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

我找不到从SXSSF工作簿访问调色板的方法。

我不能创建一个新的HSSF调色板,因为构造函数是受保护的。

目前唯一可行的方法是从所有预定义颜色列表中找到一个相似的颜色并使用它,而不是原始颜色(但这需要有一个rgb颜色匹配algo,这将是另一项任务)

有人能建议一个变通方法吗(或者可能建议一个原始的rgb颜色匹配算法)

共有2个答案

栾弘新
2023-03-14

为了避免对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();
}
苏君昊
2023-03-14

所以,在通过web搜索和阅读文档之后,我得到了一个提示,即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);
 类似资料:
  • 我正在使用IText7从html字符串生成pdf。现在,我需要对段落应用自定义颜色和自定义字体或字体系列。 如何使用Itext7实现这一点? 谢谢

  • 跟着这个答案https://stackoverflow.com/a/55113171/324969这个答案https://stackoverflow.com/a/60686826/324969. 如果我按下Ctrl,逗号,在设置中搜索“颜色”,单击settings.json中的

  • 我正在努力修改MUI next(v1)中的按钮颜色。 我该如何设置muitheme,使其行为与bootstrap相似,这样我就可以用“btn危险”表示红色,“btn成功”表示绿色? 我尝试了自定义,但它不能正常工作(悬停颜色不会改变),而且似乎是重复的。我有什么选择?

  • 我需要找到一种更好的方法来从给定的自定义颜色生成阴影颜色用于主题目的。到目前为止,我找到了一种通过降低给定颜色的不透明度来做到这一点的方法,如下所示。所以我可以强调颜色颜色和给定颜色的褪色颜色到这个函数。 但由于我降低了颜色的不透明度,所以当使用时,它会显示小部件下面的内容。 是否有任何方法可以获得颜色的褪色值?

  • 我是材料设计新手。我想使用自定义配色方案,特别是原色和强调色。 我看过他们的主题生成器工具,但它只提供了一些颜色。 我该怎么做?我如何在使用Material Design Lite的网站中使用自定义(主色和强调色)(不包括在主题生成器工具中)颜色?

  • 我正在尝试为我的应用程序的主题定义自定义颜色。我是这样做的: 定义自定义属性: 定义应用程序样式: 在清单中设置样式: 在可绘制xml中使用此属性: 但出于某种原因,它不适用于我的颜色绘图。它应用了透明的颜色。 还有一件奇怪的事,如果我替换我的与,在,则应用正确的颜色。 最后一个问题是:你知道为什么它不起作用,以及如何修复它吗?