如何为excel表中的特定行着色?

时间:2018-01-05 02:57:17

标签: c# .net excel npoi

我使用NPOI dll创建excel文件。

我有这段代码从List<someObjects>创建excel表:

IWorkbook workbook = new XSSFWorkbook();
ISheet sheet1 = workbook.CreateSheet("Sheet 1");
IRow header = sheet1.CreateRow(0);

header.CreateCell(0).SetCellValue("Id");
header.CreateCell(1).SetCellValue("Name");
header.CreateCell(2).SetCellValue("E-Mail");
header.CreateCell(3).SetCellValue("PhoneNumber");

for (int i = 0; i < list.Count(); i++)
{
   IRow row = sheet1.CreateRow(i + 1);
   row.CreateCell(0).SetCellValue(list[i].id);
   row.CreateCell(1).SetCellValue(list[i].name);
   row.CreateCell(2).SetCellValue(list[i].email);
   row.CreateCell(3).SetCellValue(list[i].phoneNumber);
 }

然后我将每个单元格放在上面创建的表格中。

以下是代码:

    public void setBorderExcel()
    {

        XSSFCellStyle myStyle = (XSSFCellStyle)workbook.CreateCellStyle();
        myStyle.BorderBottom = BorderStyle.Medium;
        myStyle.BorderTop = BorderStyle.Medium;
        myStyle.BorderLeft = BorderStyle.Medium;
        myStyle.BorderRight = BorderStyle.Medium;

        for (int i = 0; i < 7; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                workbook.GetSheetAt(0).GetRow(i).GetCell(j).CellStyle = myStyle;
            }
        }
    }

然后我将上面创建的表中的每个奇数行都变为彩色。

以下是代码:

    public void setColorExcel()
    {
        for (int i = 0; i < 7; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                if (i % 2 == 0) continue;

                workbook.GetSheetAt(0).GetRow(i).GetCell(j).CellStyle.FillForegroundColor = HSSFColor.Grey25Percent.Index;
                workbook.GetSheetAt(0).GetRow(i).GetCell(j).CellStyle.FillPattern = FillPattern.SolidForeground;

            }
        }
    }

以下是我得到的结果:

enter image description here

正如您可以看到应用于表格中所有行的颜色,我想只为奇数行着色。

我的问题是为什么我会为所有行着色?我怎样才能制作有色的特定行?

2 个答案:

答案 0 :(得分:0)

我想我明白了。您已将相同的XSSFCellStyle实例应用于所有单元格&#39; (setBorderExcel)中的样式属性。因此,现在它们都具有相同的实例,因此当您更改其中一个单元格的CellStyle上的属性时,它会更改与所有单元格关联的CellStyle实例。

您很可能需要两个XSSFCellStyle实例。一个用于奇数行,另一个用于偶数行。

答案 1 :(得分:0)

我试了一下,虽然我不确定为什么你的方式不起作用,但是有一个更简单的方法用更少的线(简单地用灰色背景声明另一个CellStyle,并使用而不是myStyle):

XSSFCellStyle myStyle = (XSSFCellStyle)workbook.CreateCellStyle();
myStyle.BorderBottom = BorderStyle.Medium;
myStyle.BorderTop = BorderStyle.Medium;
myStyle.BorderLeft = BorderStyle.Medium;
myStyle.BorderRight = BorderStyle.Medium;

XSSFCellStyle myStyleGrey = (XSSFCellStyle)workbook.CreateCellStyle();
myStyleGrey.BorderBottom = BorderStyle.Medium;
myStyleGrey.BorderTop = BorderStyle.Medium;
myStyleGrey.BorderLeft = BorderStyle.Medium;
myStyleGrey.BorderRight = BorderStyle.Medium;
myStyleGrey.FillForegroundColor = HSSFColor.Grey25Percent.Index;
myStyleGrey.FillPattern = FillPattern.SolidForeground;

for (int i = 0; i < 7; i++)
{
    for (int j = 0; j < 4; j++)
    {
        if (i % 2 == 0)
            workbook.GetSheetAt(0).GetRow(i).GetCell(j).CellStyle = myStyle;
        else
            workbook.GetSheetAt(0).GetRow(i).GetCell(j).CellStyle = myStyleGrey;
    }
}

您可以移除setColorExcel()的代码,它应该按预期工作,将奇数行设置为灰色。