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

ApachePOI4.0:XSSFColor来自java.awt.Color

赵同
2023-03-14

org.apache.poi 4.0删除了仅使用java.awt.ColorXSSFColor构造函数。在org.apache.poi3.7中,只需编写

Color inputColor = Color.RED;
XSSFColor test = new XSSFColor(inputColor);

但是,该构造函数在4.0中不再有效。文档位于https://poi.apache.org/apidocs/dev/org/apache/poi/xssf/usermodel/XSSFColor.html 显示了其他几个构造函数,但理想情况下我希望更改尽可能少的行。

所以,我的问题是,现在(在ApachePOI4.0中)从java.awt.Color创建XSSFColor的最佳方法是什么?

根据注释中的要求,这里是我的测试代码,使用建议style.setFillForeground Color(new XSSFColor(java.awt.颜色。RED, null);用LibreOffice 6.1打开它会产生一个错误(尝试修复,然后失败)。评论了POI 3.7版本,正常工作。

@Test
public void testPOI40() throws FileNotFoundException, IOException {
    Workbook workbook = new XSSFWorkbook();
    XSSFSheet fSheet = (XSSFSheet) workbook.createSheet("new Sheet");
    XSSFRow hRow = fSheet.createRow((short) 0);
    //header
    String[] astrHeaders = new String[]{"Header1", "Header2", "Header3", "Header4"};
    for (int col = 0; col < astrHeaders.length; col++) {
        XSSFCell cell = hRow.createCell((short) col);
        XSSFCellStyle tempHeaderStyle = (XSSFCellStyle) workbook.createCellStyle();
        tempHeaderStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        tempHeaderStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        cell.setCellValue(astrHeaders[col]);
        cell.setCellStyle(tempHeaderStyle);
    }        
    //body
    Double[] astrContent = new Double[]{1.3, 0.3, 0.87, 1.0};     
    Color[] colors = new Color[] {Color.RED,Color.BLUE,Color.WHITE,Color.GREEN};        
    XSSFRow fRow = fSheet.createRow((short) 1);
    for (int iCol = 0; iCol < 4; iCol++) {
        XSSFCell cell = fRow.createCell((short) iCol);
        XSSFCellStyle tempBodyStyle = (XSSFCellStyle) workbook.createCellStyle();
        cell.setCellValue(astrContent[iCol]);
        //working with POI 3.17
        //tempBodyStyle.setFillForegroundColor(new XSSFColor(colors[iCol]));
        tempBodyStyle.setFillForegroundColor(new XSSFColor(colors[iCol],null));
        tempBodyStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        cell.setCellStyle(tempBodyStyle);
    }        
    FileOutputStream fileOut = new FileOutputStream(new File("testfile.xlsx"));
    BufferedOutputStream bos = new BufferedOutputStream(fileOut);
    workbook.write(bos);
    fileOut.close();
}

解决方案:
替换了fileout.close() 带有bos.close() 并且它可以工作。所以tempBodyStyle.setFillForegroundColor(新的XSSFColor(Color.RED,null))是一个很好的解决方案


共有1个答案

徐绪
2023-03-14

如果你包装的文件输出流在一个BufferedOutputStream,但做关闭,然后只有内部文件输出流,而不是BufferedOutputStream,然后BufferedOutputStream保持打开,文件将没有所有字节。

这就是文件损坏的原因。

因此,破坏性与构建XSSFColor有关。构造函数style.setFillForeground Color(new XSSFColor(java.awt.的颜色。RED, null));工作。

取而代之:

...
FileOutputStream fileOut = new FileOutputStream(new File("testfile.xlsx"));
BufferedOutputStream bos = new BufferedOutputStream(fileOut);
workbook.write(bos); 
bos.close();
workbook.close();
...

它可能在以前的apache poi版本中工作,因为xssf工作簿.write在准备就绪时关闭了所有流。这并没有更多。这是正确的,因为write不应该关闭流。

但是由于poimmldocument实现了java.io.Closeable至少workbook.close()应该关闭所有流。但事实并非如此。因此,在ApachePOI4.0.0中,显式关闭所有流是必要的。

 类似资料:
  • 我想用十六进制代码将单元格的前景色设置为给定的颜色。例如,当我尝试将其设置为红色时: 无论我在decode函数的参数中设置了什么十六进制值,getIndexed函数都将始终返回黑色。 难道我可能做错了什么?我认为这是一个错误,但我不确定...

  • 我试图使用下面的XSSFColor方法设置RGB颜色值 我正在传递短值,但是不管RGB值是多少,我的前景都会被设置为黑色。我还没有发现这是为什么——有什么想法吗?

  • 问题内容: 我想将单元格的前景色设置为十六进制代码中的给定颜色。例如,当我尝试将其设置为红色时: 无论我在解码函数的参数中设置了什么十六进制值,getIndexed函数都将始终返回黑色。 可能是我做错了什么吗?我认为这是一个错误,但我不确定… 问题答案: 好消息是,如果您使用的是XSSF,而不是HSSF,那么解决问题的方法就很简单。您只需将样式变量转换为XSSFCellStyle。如果这样做,则存

  • 我得到了一个例外: 在[source:(String)“{”product_id“:”1420-131617-82“,”sku“:”1420-131617“,”display_sku“:”8dd 355 100-411“,”genart_number“:82,”name“:”bremscheibe“,”description“:null,”additional_info_text“:null,”p

  • 问题内容: 使用的我可以将任意的数据到数据的URL。有没有办法使用内置的浏览器API 将数据URL转换回实例? 问题答案: 用户Matt一年前提出了以下代码如何在javascript中将dataURL转换为文件对象?,这可能对您有帮助 编辑:正如一些评论者所报道的,BlobBuilder已被弃用了一段时间。这是更新的代码:

  • 问题内容: 这是我认为的Java纯粹主义者之一。最近,我遇到了一种将字符串值自定义解析为布尔值的方法的问题。一个足够简单的任务,但是由于某种原因,以下方法在空情况下抛出NullPointerException…… 该方法的返回类型为布尔值,那么为什么或如何引发NullPointerException?从调试开始,似乎在嵌套的嵌入式条件语句评估为null并向外部嵌入式条件语句返回null的时候抛出了