当前位置:  开发笔记 > 编程语言 > 正文

Apache POI 4.0:来自java.awt.Color的XSSFColor

如何解决《ApachePOI4.0:来自java.awt.Color的XSSFColor》经验,为你挑选了1个好方法。

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

所以,我的问题是,XSSFColorjava.awt.Color现在开始创建最佳方法是什么(在Apache POI 4.0中)?


根据注释中的要求,这是我使用建议的测试代码。使用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在评论中所建议的那样,这是一个很好的解决方案,并将接受此答案。



1> Axel 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

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有