java - Apache POI 4.0 : XSSFColor from java. awt.Color

标签 java colors apache-poi apache-poi-4

org.apache.poi 4.0 删除了仅使用 java.awt.ColorXSSFColor 构造函数。在 org.apache.poi 3.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 处的文档显示了其他几个构造函数,但理想情况下我想更改尽可能少的行。

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


根据评论中的要求,这是我使用建议 style.setFillForegroundColor(new XSSFColor(java.awt.Color.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(new XSSFColor(Color.RED,null)); 正如 Alex Richter 在评论中所建议的那样是一个很好的解决方案,并将接受这个作为答案。

最佳答案

如果您将 FileOutputStream 包装在 BufferedOutputStream 中,但确实关闭了内部 FileOutputStream 而不是 BufferedOutputStream,那么 BufferedOutputStream 保持打开状态,文件中不会包含所有字节。

这就是文件损坏的原因。

因此,破坏与构造 XSSFColor 无关。构造函数 style.setFillForegroundColor(new XSSFColor(java.awt.Color.RED, null)); 有效。

改为:

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

它可能在以前的 apache poi 版本中有效,因为 XSSFWorkbook.write 在准备就绪时关闭了所有流。仅此而已。这是正确的,因为 write 不应该关闭流。

但由于 POIXMLDocument 实现了 java.io.Closeable 至少 workbook.close() 应该关闭所有流。但那也不是。因此在 apache poi 4.0.0 中显式关闭所有流是必要的。

关于java - Apache POI 4.0 : XSSFColor from java. awt.Color,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53227136/

相关文章:

java - 在 proguard android 中忽略警告是正确的

delphi - 定制德尔福颜色

wpf - WPF 字体中不可预测的不透明度行为

java - Apache POI setPrintArea 为 A4 页面大小

java - Jackson 使用泛型反序列化 JSON

java - 如何从 OpenStreetMap 离线创建 map 图 block ,在 Android 上显示?

java - 使用 OpenNTF POI 从 Excel 获取值,但 row.getCellType() 不再起作用

java - 在 Java 中使用 Apache POI XWPF 在同一个 Word 文档中横向和纵向页面

java - 尝试检查字符串是否包含特殊字符或小写java

linux - 将 h264 转换为原始 RGB 时 gstreamer 颜色错误