Apache POI 4.0:来自java.awt.Color

时间:2018-11-09 14:00:02

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

org.apache.poi 4.0删除了仅使用XSSFColor的{​​{1}}构造函数。在java.awt.Color中,只需编写即可很容易地创建对象

org.apache.poi 3.7

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

因此,我的问题是,现在(在Apache POI 4.0中)从Color inputColor = Color.RED; XSSFColor test = new XSSFColor(inputColor); 创建XSSFColor的最佳方法是什么?


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

style.setFillForegroundColor(new XSSFColor(java.awt.Color.RED, null));

解决方案:
@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();,它可以正常工作。因此,Alex Richter的评论中建议的bos.close();是一个很好的解决方案,并将其作为答案。

1 个答案:

答案 0 :(得分:5)

如果将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中明确关闭所有流。