尝试使用NPOI在Excel电子表格中为整列单元格着色

时间:2016-08-19 11:51:06

标签: c# excel npoi

下面是一个C#程序,用于使用NPOI为Excel文件中的单元格着色:

string pathSource = @"C:\Users\mvmurthy\Downloads\VOExportTemplate (2).xlsx";
HSSFWorkbook templateWorkbook;
HSSFSheet sheet;
HSSFRow dataRow;

using (var fs = new FileStream(pathSource, FileMode.Open, FileAccess.ReadWrite))
{
    templateWorkbook = new HSSFWorkbook(fs, true);
    sheet = (HSSFSheet)templateWorkbook.GetSheet("ImportTemplate");
    int num = sheet.PhysicalNumberOfRows;
    for (int i=1; i<num; i++)
    {
            dataRow = (HSSFRow)sheet.GetRow(i);                   
            HSSFCellStyle hStyle = (HSSFCellStyle)templateWorkbook.CreateCellStyle();
            hStyle = (HSSFCellStyle)templateWorkbook.CreateCellStyle();
            hStyle.FillForegroundColor = IndexedColors.Red.Index;
            hStyle.FillPattern = FillPattern.SolidForeground;
            dataRow.Cells[9].CellStyle = hStyle;                   
    }
}

using (var fs = new FileStream(pathSource, FileMode.Open, FileAccess.ReadWrite))
{
    templateWorkbook.Write(fs);
}

当我运行上面的代码时,我得到以下输出,但我想只为列K着色:

enter image description here

我做错了什么?

1 个答案:

答案 0 :(得分:2)

问题在于这一行:

dataRow.Cells[9].CellStyle = hStyle;

Cells[n]忽略空单元格,因此这将获得第10个(基于0的)非空单元格。在屏幕截图中,第三行和第四行在Description列中有一个值,因此第10个非空单元格在列J中,而对于其余行,它在K列中。

如果您想按特定列获取单元格,则应使用GetCell(n)代替。但请注意,如果该列中没有单元格,默认情况下将返回空值。如果需要,您可以将第二个参数传递给此方法,以指定它应该在该情况下创建新单元格而不是返回null。

尝试将有问题的行更改为:

dataRow.GetCell(10, MissingCellPolicy.CREATE_NULL_AS_BLANK).CellStyle = hStyle;

另外,我注意到你正在为每个单元创建一个全新的样式对象,即使样式属性对于每个单元都是相同的。通常你不应该这样做,因为Excel只能处理有限数量的样式(根据Excel Specifications and Limits文档,最多可以处理64,000个样式)。相反,您应该只创建实际样式属性不同的新样式对象,然后在要具有相同样式的所有单元格中共享它们。

换句话说,将hStyle对象的创建移到循环之外,如下所示:

HSSFCellStyle hStyle = (HSSFCellStyle)templateWorkbook.CreateCellStyle();
hStyle.FillForegroundColor = IndexedColors.Red.Index;
hStyle.FillPattern = FillPattern.SolidForeground;

for (int i = 1; i < num; i++)
{
    dataRow = (HSSFRow)sheet.GetRow(i);
    dataRow.GetCell(10, MissingCellPolicy.CREATE_NULL_AS_BLANK).CellStyle = hStyle;
}