9

我正在使用 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);

...这只是代码的一部分...我不明白为什么不起作用。似乎单元格样式被忽略或覆盖....

有什么线索吗?

4

3 回答 3

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);

将在工作表中创建带有黑色单元格背景颜色的粗体和白色字体文本颜色。

于 2013-07-09T13:36:28.510 回答
5

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 会做一些奇怪的事情,需要一些时间来适应,所以请检查它的作用以确定您需要做什么!

于 2013-07-09T10:56:04.773 回答
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);
于 2019-11-20T15:03:29.387 回答