Unable to set FillBackgroundColor

mitchellJ picture mitchellJ · Dec 5, 2014 · Viewed 9.9k times · Source

I'm using NPOI 2.0.6.0 in a C# project and I'm running into difficulty changing the styling. While I can affect font and cell borders I cannot change the background color.

private void buildSheet(HSSFWorkbook wb, DataTable data, string sheetName)
{
    var cHelp = wb.GetCreationHelper();
    var sheet = wb.CreateSheet(sheetName);

    HSSFFont hFont = (HSSFFont)wb.CreateFont();

    hFont.Boldweight = (short)FontBoldWeight.Bold;
    hFont.Color = HSSFColor.White.Index;
    hFont.FontHeightInPoints = 18;

    HSSFCellStyle hStyle = (HSSFCellStyle)wb.CreateCellStyle();
    hStyle.SetFont(hFont);
    hStyle.BorderBottom = BorderStyle.Medium;
    hStyle.FillBackgroundColor = HSSFColor.Black.Index;

    IRow headerRow = sheet.CreateRow(1);


    int cellCount = 1;
    foreach (string str in colHeaders)
    {
        HSSFCell cell = (HSSFCell)headerRow.CreateCell(cellCount);
        cell.SetCellValue(cHelp.CreateRichTextString((str)));
        cell.CellStyle = hStyle;

        cellCount += 1;
    }

    int rowCount = 2;
    foreach (DataRow dr in data.Rows)
    {
        var row = sheet.CreateRow(rowCount);
        for (int i = 1; i < data.Columns.Count + 1; i++)
        {
            row.CreateCell(i).SetCellValue(cHelp.CreateRichTextString((dr[i - 1]).ToString()));
        }
        rowCount += 1;
    }
}

After attaching a debugger I noticed that hStyle.FillBackgroundColor never changes from 0x0040 despite that the index of black is 8.

So essentially the question is:

  • Why would HSSFCellStyle.FillBackgroundColor not be modifiable?

Answer

mitchellJ picture mitchellJ · Dec 8, 2014

A FillBackgroundcolor cannot be applied without also specifying the FillPattern.

i.e.

        hStyle = (HSSFCellStyle)workBook.CreateCellStyle();
        hStyle.SetFont(xFont);
        hStyle.BorderBottom = BorderStyle.Medium;
        hStyle.FillForegroundColor = IndexedColors.Black.Index;
        hStyle.FillPattern = FillPattern.SolidForeground;