设置单元格样式不起作用

时间:2013-07-09 10:42:51

标签: apache-poi xssf

我正在使用apache poi和XLSX文件。我使用xssf类动态创建电子表格。 我想在for循环中设置单元格的样式,但它似乎不起作用......这是我的代码:

for(int i=1;i<=gc.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);i++,gc.add(GregorianCalendar.DATE, 1),righe++){
        Row r = foglio.createRow(righe);

        if(getDayOfWeek(gc)== 6 || getDayOfWeek(gc) == 7){
            XSSFCellStyle cs1 = wb.createCellStyle();
            cs1.setFillBackgroundColor(IndexedColors.YELLOW.getIndex());
            cs1.setFillPattern(CellStyle.SOLID_FOREGROUND);
            XSSFFont f = wb.createFont();
            f.setBold(true);
            f.setColor(IndexedColors.RED.getIndex());
            cs1.setFont(f);
            Cell c1 = r.createCell(0);
                 c1.setCellValue(cost.getGiorni().get(getDayOfWeek(gc)-1).getNomeGiorno());
                 c1.setCellStyle(cs1);
            Cell c2 = r.createCell(1);
                 c2.setCellValue(i);
                 c2.setCellStyle(cs1);
        }               
        r.createCell(0).setCellValue(cost.getGiorni().get(getDayOfWeek(gc)-1).getNomeGiorno());
        r.createCell(1).setCellValue(i);

...这只是代码的一部分...... 我不明白为什么不工作。看起来像是被忽略或者被淹没了。

任何线索?

3 个答案:

答案 0 :(得分:7)

您可以使用以下方法,这可能会解决您的问题。

public static void setCellColorAndFontColor(XSSFCell cell, IndexedColors FGcolor, IndexedColors FontColor ){
    XSSFWorkbook wb = cell.getRow().getSheet().getWorkbook();
    CellStyle style = wb.createCellStyle();
    XSSFFont font = wb.createFont();
    font.setBold(true);
    font.setColor(FontColor.getIndex());
    style.setFont(font);
    style.setFillForegroundColor(FGcolor.getIndex());
    style.setFillPattern(CellStyle.SOLID_FOREGROUND);
    cell.setCellStyle(style);
}

当您调用此方法时,方式应该是

setCellColorAndFontColor(cell, IndexedColors.BLACK, IndexedColors.WHITE);

将创建大胆的&amp;白色字体文字颜色与表格中的黑色单元格背景颜色。

答案 1 :(得分:4)

CellStyles是每个工作簿,并且Excel对允许文件的数字施加了硬限制,因此您需要确保在循环外部创建一个单元格样式。

您的代码将类似于:

XSSFCellStyle cs1 = wb.createCellStyle();
cs1.setFillBackgroundColor(IndexedColors.YELLOW.getIndex());
cs1.setFillPattern(CellStyle.SOLID_FOREGROUND);

XSSFFont f = wb.createFont();
f.setBold(true);
f.setColor(IndexedColors.RED.getIndex());
cs1.setFont(f);

for(int i=1;i<=gc.getActualMaximum(GregorianCalendar.DAY_OF_MONTH) i++,gc.add(GregorianCalendar.DATE, 1),righe++){
    Row r = foglio.createRow(righe);

    if(getDayOfWeek(gc)== 6 || getDayOfWeek(gc) == 7){
        Cell c1 = r.createCell(0);
        c1.setCellValue(cost.getGiorni().get(getDayOfWeek(gc)-1).getNomeGiorno());
        c1.setCellStyle(cs1);
        Cell c2 = r.createCell(1);
        c2.setCellValue(i);
        c2.setCellStyle(cs1);
    }
}

如果您的样式问题看起来不像您期望的那样,最好的选择是在Excel中为您想要的样式设置样式,保存文件,将其读入POI,并查看Excel的单元格样式中写道。有时候,Excel可以做一些需要习惯的奇怪的事情,所以检查一下它能做些什么才能解决你需要做的事情!

答案 2 :(得分:0)

我认为 .setFillPattern(CellStyle.SOLID_FOREGROUND);

更改为 .setFillPattern(FillPatternType.SOLID_FOREGROUND);

这对我有用:

//design settings for header row
    Font headerFont = wb.createFont();
    headerFont.setColor(IndexedColors.WHITE.getIndex());
    CellStyle headerCellStyle = wb.createCellStyle();
    headerCellStyle.setFont(headerFont);
    headerCellStyle.setAlignment(HorizontalAlignment.CENTER);
    headerCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
    headerCellStyle.setFillForegroundColor(IndexedColors.BLACK.getIndex());
    headerCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);