如何使用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
相关产品推荐
相关产品推荐

