You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用ExcelDataReader获取Excel单元格背景色?求技术提示

如何使用ExcelDataReader获取Excel单元格的背景色?

我想要使用ExcelDataReader库获取Excel单元格的背景色,目前的代码只能读取单元格内容,不知道怎么获取背景色,能否给我一点提示?

我的现有代码如下:

DataRowCollection sheet;
string fileName = "....";
private void OpenExcel_and_CloseExcel(string articleNumber)
{
    if (sheet != null) sheet.Clear();
    var stream = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); // 可打开已处于打开状态的xls文件
    var reader = ExcelReaderFactory.CreateReader(stream); // 支持xls、xlsx格式
    var result = reader.AsDataSet(); // 每个工作表的结果存于result.Tables[...]中
    var dt = result.Tables[_tableName];
    sheet = dt.Rows;
    /* 调试代码:
    string text = sheet[42][6].ToString();
    int r = dt.Rows.Count;
    int c = dt.Columns.Count;
    MessageBox.Show("text: " + text +", "+ r +", "+c);
    */
}

感谢!


你好!问题出在你目前用的AsDataSet()方法——这个方法只会提取单元格的数据内容,并不会包含任何格式信息(比如背景色、字体样式这些)。要获取单元格的背景色,你需要直接使用IExcelDataReader的API来逐行逐列读取样式,而不是转成DataSet。

给你几个关键步骤和代码示例:

  • 区分Excel版本处理:ExcelDataReader针对.xls(BIFF格式)和.xlsx(OpenXML格式)的样式读取逻辑略有不同,需要分别处理
  • 逐行逐列读取样式:遍历工作表的行和列,通过reader的专属方法获取单元格样式,再从中提取背景色

改造后的代码示例

using System.Drawing;
using ExcelDataReader;
using ExcelDataReader.ExcelOpenXml;

DataRowCollection sheet;
string fileName = "....";
private void ReadExcelWithCellColors(string articleNumber)
{
    if (sheet != null) sheet.Clear();
    using var stream = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
    using var reader = ExcelReaderFactory.CreateReader(stream);

    // 切换到目标工作表
    while (reader.Name != _tableName && reader.NextResult()) { }

    // 跳过表头(如果你的表有表头的话)
    reader.Read();

    // 遍历所有数据行
    while (reader.Read())
    {
        int currentRow = reader.Depth;
        for (int colIndex = 0; colIndex < reader.FieldCount; colIndex++)
        {
            // 获取单元格内容
            var cellValue = reader.GetValue(colIndex);
            
            // 根据Excel格式获取背景色
            if (reader is ExcelBinaryReader xlsReader) // .xls文件处理
            {
                var cellColor = xlsReader.GetFillColor(currentRow, colIndex);
                if (cellColor.HasValue)
                {
                    Color color = cellColor.Value;
                    // 可以输出ARGB值或者其他格式
                    Console.WriteLine($"行{currentRow+1}列{colIndex+1}背景色:#{color.ToArgb():X8}");
                }
            }
            else if (reader is ExcelOpenXmlReader xlsxReader) // .xlsx文件处理
            {
                // 直接操作OpenXml对象获取填充样式
                var cell = xlsxReader.XlsxWorksheet.GetCell(currentRow + 1, colIndex + 1);
                var fill = cell?.Style?.Fill;
                if (fill?.PatternFill?.ForegroundColor?.Rgb != null)
                {
                    string rgbColor = fill.PatternFill.ForegroundColor.Rgb;
                    Console.WriteLine($"行{currentRow+1}列{colIndex+1}背景色:#{rgbColor}");
                }
            }
        }
    }
}

额外注意事项

  • 记得引用System.Drawing包来处理Color对象
  • 如果遇到合并单元格、条件格式等复杂样式,可能需要额外的逻辑处理,但基础的背景色读取可以用上面的代码实现
  • 操作完流和reader后一定要用using语句自动释放资源,避免内存泄漏

希望这些提示能帮到你!


内容的提问来源于stack exchange,提问作者user12445601

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:16:24