Apache POI 4.0:来自 java.awt.Color 的 XSSFColor
Apache POI 4.0: XSSFColor from java.awt.Color
org.apache.poi 4.0
删除了仅使用 java.awt.Color
的 XSSFColor
构造函数。在 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
.
中明确关闭所有流是必要的
org.apache.poi 4.0
删除了仅使用 java.awt.Color
的 XSSFColor
构造函数。在 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
.