使用Apache POI在XSSFCell中设置填充颜色不起作用

时间:2013-10-15 16:15:34

标签: java apache-poi

我试图执行以下测试(主要是从Apache POI homepage复制)以验证API是否正常工作。测试不会抛出异常,但是当我查看生成的Excel文件时,彩色单元格(0,0 = A1)实际上是纯白色。没有涂上颜色。单元格值已正确设置。

我正在使用POI 3.9-20121203 (stable)

我在这里缺少什么?为什么示例不能按预期工作?

@Test
public void test() throws FileNotFoundException, IOException
{
    XSSFWorkbook wb = new XSSFWorkbook();
    XSSFSheet sheet = wb.createSheet();
    XSSFRow row = sheet.createRow(0);
    XSSFCell cell = row.createCell( 0);
    cell.setCellValue("custom XSSF colors");

    XSSFCellStyle style1 = wb.createCellStyle();
    style1.setFillForegroundColor(new XSSFColor(new java.awt.Color(128, 0, 128)));
    style1.setFillPattern(CellStyle.SOLID_FOREGROUND);

    File f = new File("test.xlsx");     
    f.delete();

    FileOutputStream fos = new FileOutputStream(f);     
    wb.write(fos);      
    fos.close();        
}

3 个答案:

答案 0 :(得分:3)

您创建了XSSFCellStyle,但忘了使用Cell's setCellStyle方法将其分配到单元格。

cell.setCellStyle(style1);

答案 1 :(得分:0)

在对现有Excel文件进​​行操作时还有另一点需要注意,这可能会使设置单元格样式无法正常工作:您始终必须将从Cell获取的CellStyle与Sheet的默认CellStyle进行比较。如果两者相等,则需要从工作簿中创建新的CellStyle。

为默认的CellStyle指定新颜色不会在Excel工作表中产生任何可见的更改。

在不覆盖以前样式的情况下为单元格指定颜色的正确方法是:

// get cell style
XSSFCellStyle style = cell.getCellStyle();

// get default workbook style
XSSFCellStyle defaultStyle = workbook.getCellStyleAt((short) 0)

// if both are equals create new style in workbook
if(style.equals(defaultStyle)) {
    style = workbook.createCellStyle();     
}

// assign color
style.setFillForegroundColor(new XSSFColor(myColor));
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);

// set style
cell.setCellStyle(style);

答案 2 :(得分:0)

我遇到了XSSFCellStyle复制的问题。

在我的情况下,我有多个xlsx输入流对象创建单独的xlsx文件。但是我需要单个xlsx文件,所有xlsx输入流都是单个xlsx文件中的单个工作表。

我遇到了POI-3.11版本的两个挑战。 1)当重复的合并区域添加到单个工作表时,xlsx文件会生成一些问题。每当我尝试打开文件时,都会要求恢复文件。

仅通过添加合并区域一次解决了此问题。

2)背景色副本问题。 最终xlsx文件中的某些字段使用源文件中错误的背景颜色填充。

通过将源样式复制到每个单元格的目标来解决此问题。当我尝试合并源表中可用的不同样式列表并将源单元格样式与列表进行比较时,我遇到了问题。

希望这会有所帮助。