Apache POI 4.0: XSSFColor от java.awt.Color

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 показывает несколько других конструкторов, но в идеале я хочу изменить как можно меньше строк.

Итак, мой вопрос, каков наилучший способ создания XSSFColor из java.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)); как предложено в комментариях Алекса Рихтера, является хорошим решением и примет это как ответ.

1 ответ

Решение

Если вы оборачиваете 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,

Другие вопросы по тегам