使用Apache POI错误地将单元格的背景颜色从一个XLSX文件复制到另一个XLSX文件

时间:2016-06-08 13:26:50

标签: java excel apache-poi

当我尝试从一个XSLX文件获取单元格背景颜色并将此颜色设置为单元格的背景到另一个XSLX文件时,我遇到了问题。

输入和输出文件均采用2007(XLSX)格式(输入文件是使用MS Excel 2010创建的)。

对于使用XLSX文件,我使用的是Apache Poi 3.14:

    InputStream is = new FileInputStream("forRead.xlsx");
    Workbook wb_in = WorkbookFactory.create(is);

    XSSFCell cell_in = (XSSFCell) wb_in.getSheetAt(0).getRow(0).getCell(0);

    XSSFColor background_in = ((XSSFColor) cell_in.getCellStyle().getFillForegroundColorColor());

    XSSFColor background_out = new XSSFColor();

    background_out.setARGBHex(background_in.getARGBHex()); // this works wrong :(.

    XSSFWorkbook wb_out = new XSSFWorkbook();
    Sheet sheet_out = wb_out.createSheet();
    Row row_out = sheet_out.createRow((short) 2);

    XSSFCell cell_out = (XSSFCell)row_out.createCell((short)1);
    XSSFCellStyle style_out = wb_out.createCellStyle();
    style_out.setFillForegroundColor(background_out); //  if I use background_in, then the output color will be correct
    style_out.setFillPattern(CellStyle.SOLID_FOREGROUND);
    cell_out.setCellStyle(style_out);

    FileOutputStream fileOut = new FileOutputStream("forWrite.xlsx");
    wb_out.write(fileOut);
    fileOut.close();

输出文件中的结果颜色明显不同。它比较暗。 这是一个我不知道如何解决的问题。

除此之外,我注意到两件奇怪的事情:

1)background_in.getARGBHex()获得了我在Excel中看到的不同颜色。 #F79646 or rgb(247, 150, 70)代替#fde9d9 or rgb(253, 233, 217)

2)如果我style_out.setFillForegroundColor(background_in);输出文件中的颜色是正确的这使我认为我可以通过为XSSFColor对象设置一些额外属性(如alpha或其他东西来解决问题。

可以下载My Maven项目 from here。包含XLSX文件。

更新:已解决

除RGB之外,我应该设置色调。

1 个答案:

答案 0 :(得分:0)

除了RGB之外,我还应该添加色调属性的设置。 back_XSSFColor_out.setTint(back_XSSFColor_in.getTint());