【问题标题】:How to color specific row in excel table?如何为excel表格中的特定行着色?
【发布时间】:2018-01-05 02:57:16
【问题描述】:

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

            }
        }
    }

这是我得到的结果:

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

我的问题是为什么我的所有行都被着色了?我怎样才能使特定的行有颜色?

【问题讨论】:

    标签: c# .net excel npoi


    【解决方案1】:

    我想我明白了。您已将相同的 XSSFCellStyle 实例应用于 (setBorderExcel) 中所有单元格的 Style 属性。所以,现在它们都有相同的实例,所以当您更改其中一个单元格的 CellStyle 属性时,它会更改与所有单元格关联的 CellStyle 实例。

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

    【讨论】:

      【解决方案2】:

      我试过了,虽然我不确定为什么你的方法行不通,但有一种更简单的方法,行数更少(只需声明另一个带有灰色背景的 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() 的代码,它应该可以按预期工作,将奇数行设置为灰色。

      【讨论】:

      • 感谢您的帖子。知道如何使表格的外边框成为另一种样式,例如让它更大胆吗?
      猜你喜欢
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多