.NET Core项目中如何为Excel导出的DataTable单元格着色
问题描述
在.NET Core项目中已创建并填充好DataTable,代码如下:
DataTable dt = new(); dt.Columns.Add("Status"); dt.Columns.Add("Base"); dt.Columns.Add("First Date"); dt.Columns.Add("Second Date"); dt.Columns.Add("Failure Mode"); dataAll.ForEach(row => { dt.Rows.Add( row.status, row.partBase, row.pcaDate, row.icaDate, row.failureMode ); });
当前使用XLWorkbook将DataTable导出为Excel,代码如下:
using XLWorkbook wb = new(); // create data table DataTable dt = MapDataToExcel(response.Result.ToList()); // add as worksheet wb.Worksheets.Add(dt, "Rapor"); // save it as a file then stream it to the user using MemoryStream stream = new MemoryStream(); wb.SaveAs(stream); return File(stream.ToArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Rapor.xlsx");
需要实现:当Status列的值为R时,将对应单元格设置为红色背景。
解决方案
可以通过以下步骤实现单元格着色:
- 获取目标工作表:添加DataTable到工作簿后,获取名为"Rapor"的工作表。
- 定位Status列:动态找到Status列的位置(Excel行列索引为1-based)。
- 创建红色背景样式:定义统一的红色填充样式,避免重复创建提升性能。
- 遍历数据行应用样式:跳过表头行,逐行判断Status单元格的值,符合条件则应用样式。
修改后的完整代码如下:
using XLWorkbook wb = new(); DataTable dt = MapDataToExcel(response.Result.ToList()); var worksheet = wb.Worksheets.Add(dt, "Rapor"); // 定位Status列的索引 int statusColumnIndex = worksheet.Row(1).Cells(c => c.Value.ToString() == "Status").First().Address.ColumnNumber; // 创建红色背景样式 var redBackgroundStyle = wb.Style; redBackgroundStyle.Fill.BackgroundColor = XLColor.Red; // 遍历数据行(跳过第一行表头) for (int rowIndex = 2; rowIndex <= worksheet.LastRowUsed().RowNumber; rowIndex++) { var statusCell = worksheet.Cell(rowIndex, statusColumnIndex); if (statusCell.Value.ToString() == "R") { statusCell.Style = redBackgroundStyle; } } using MemoryStream stream = new MemoryStream(); wb.SaveAs(stream); return File(stream.ToArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Rapor.xlsx");
补充说明
- Excel采用1-based索引,因此表头行是第1行,数据行从第2行开始遍历。
- 动态定位列索引的方式,避免了硬编码列位置导致的维护问题。
- 复用样式对象可以减少内存开销,适合数据量较大的场景。
内容的提问来源于stack exchange,提问作者brt
相关产品推荐
相关产品推荐

