需求及代码

比如我们要对已有的Excel文件<考勤.xlsx>进行修改,修改的内容:将A2单元格的背景色改为红色,使用NPOI操作Excel,代码如下:

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;

namespace NPOIExcelDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 打开Excel文件
            IWorkbook workbook = new XSSFWorkbook("考勤.xlsx");
            // 获得工作表
            ISheet sheet = workbook.GetSheetAt(0);
            // 获得A列
            IRow row = sheet.GetRow(1);
            // 获得A2单元格
            ICell cell = row.GetCell(0);
            // 设置A2单元格背景色为红色
            cell.CellStyle.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Red.Index; 
            
            // 保存文件
            using (FileStream file = new FileStream("考勤.xlsx", FileMode.OpenOrCreate))
            {
                workbook.Write(file);
            }
        }
    }
}

效果不符合预期

执行成功后会发现很多原本相同样式的单元格的背景色都变成了红色,这是因为NPOI默认会为相同的单元格创建相同的样式。所以会发现原本相同样式的单元格的背景色都变成了红色。

解决方案

在设置单元格样式之前,先复制一份单元格样式,然后再设置单元格样式。操作步骤如下:

  1. 获取A2单元格的样式CellStyle
  2. 克隆这个CellStyle,得到一个新的CellStyle给A2单元格专用
  3. 修改cloneStyle的背景色FillForegroundColor
  4. 将A2单元格的CellStyle设置为cloneStyle

修改后的核心代码如下:

// 获取A2单元格的CellStyle
ICellStyle cellStyle = cell.CellStyle;

// 克隆CellStyle
ICellStyle cloneStyle = workbook.CreateCellStyle();
cloneStyle.CloneStyleFrom(cellStyle);

// 设置cloneStyle的背景色为红色 
cloneStyle.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Red.Index;  

// 设置A2单元格的CellStyle
cell.CellStyle = cloneStyle;

这样就可以只设置A2一个单元格的样式,其他单元格的样式不会被改变了。