下面是一个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着色:
我做错了什么?
答案 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;
}