.net winfrom 获取上传的Excel文件 单元格的背景色

需求:根据Excel某行标注了黄色高亮颜色,说明该行数据已被用户选中(Excel文件中并没有"已选中"这一列,纯粹用颜色表示),导入数据到数据库时标注此行已选中

直接上代码:

cs 复制代码
//选择Excel文件
 private void btnBrowse_Click(object sender, EventArgs e)
 {
     using (OpenFileDialog openFileDialog = new OpenFileDialog())
     {
         //openFileDialog.InitialDirectory = "c:\\";
         openFileDialog.Filter = "Excel Files|*.xls;*.xlsx;*.xlsm";
         openFileDialog.Title = "Select an Excel File";
         if (openFileDialog.ShowDialog() == DialogResult.OK)
         {
             txtFilePath.Text = openFileDialog.FileName;
         }
     }
 }

//上传Excel文件(判断单元格背景色)
private DataTable ReadExcelToDataTable(string filePath)
{
    DataTable dataTable = new DataTable();

    ExcelPackage.LicenseContext = LicenseContext.NonCommercial;

    using (ExcelPackage package = new ExcelPackage(new System.IO.FileInfo(filePath)))
    {
        // 获取第一个工作表
        ExcelWorksheet worksheet = package.Workbook.Worksheets[0];

        // 获取最大列数和行数
        int rowCount = worksheet.Dimension.Rows;
        int columnCount = worksheet.Dimension.Columns;

        // 创建列
        for (int col = 1; col <= columnCount; col++)
        {
            string columnName = worksheet.Cells[1, col].Value?.ToString() ?? $"Column{col}";
            dataTable.Columns.Add(columnName);
        }

        // 添加数据行(从第2行开始,第1行是标题)
        for (int row = 2; row <= rowCount; row++)
        {
            DataRow dataRow = dataTable.NewRow();

            for (int col = 1; col <= columnCount; col++)
            {
                var cell = worksheet.Cells[row, col];
                if ((col - 1) == 0)//第一列
                {
                    var BackgroundColor = cell.Style.Fill.BackgroundColor.LookupColor();//单元格背景颜色:#FFFFFF00黄色;#FFFFFF白色 
                    if (!string.IsNullOrWhiteSpace(BackgroundColor))
                    {
                        dataRow[col - 1] = BackgroundColor;//获取单元格背景颜色
                    }
                    else
                    {
                        dataRow[col - 1] = "#FFFFFF";//纯白色
                    }
                }
                else//第二列.....N列,Excel数据列
                {
                    dataRow[col - 1] = worksheet.Cells[row, col].Value?.ToString() ?? "";//数据
                }
            }

            dataTable.Rows.Add(dataRow);
        }
    }

    return dataTable;
}


//处理Excel的数据(节选)
private void btnImport_Click(object sender, EventArgs e)
{
    if (!string.IsNullOrWhiteSpace(txtFilePath.Text) && File.Exists(txtFilePath.Text))
    {
        System.Data.DataTable dt = ReadExcelToDataTable(txtFilePath.Text);//读取excel
        if (dt != null && dt.Rows.Count > 0)//有数据
        {
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                //...略...
                if (dt.Rows[i][0]?.ToString() == "#FFFFFF00")//判断颜色代码,黄色
                {
                    u.Winningbidder = dt.Rows[i][6]?.ToString();//添加选中行数据
                }
                else
                {
                    u.Winningbidder = null;//不添加数据
                }
                    u.WinningbidderColor = dt.Rows[i][0]?.ToString();//保存颜色代码
                //...略...
            }
                //...略...
        }
                //...略...
    }
}

//根据条件替换整行背景颜色 
private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
  if (e.RowIndex > -1)
  {
     string WinningbidderColor = this.dataGridView1.Rows[e.RowIndex].Cells["WinningbidderColor"].Value.ToString();//背景色代码 
     string ID = this.dataGridView1.Rows[e.RowIndex].Cells["ID"].Value.ToString();
     if (WinningbidderColor == "#FFFFFF00")
     {
         this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = ConvertToColor(WinningbidderColor);//整行颜色
     }
     else if (ID == "")//合计
     {
          this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = ConvertToColor("Red");//整行颜色
          this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.ForeColor = ConvertToColor("#FFFFFF");//字体颜色
     }
     else
     {
          this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = ConvertToColor("#FFFFFF");//#FFFFFF 白色
     }
   }
}

        // 通用方法:支持 "#RGB", "#RRGGBB", "#ARGB", "#AARRGGBB", "Red" 等格式 
        public static System.Drawing.Color ConvertToColor(string colorCode)
        {
            if (string.IsNullOrEmpty(colorCode))
                return System.Drawing.Color.Empty;

            // 处理 HTML 格式
            if (colorCode.StartsWith("#"))
            {
                try
                {
                    return System.Drawing.ColorTranslator.FromHtml(colorCode);
                }
                catch
                {
                    // 忽略异常,继续尝试其他格式
                }
            }

            // 处理 RGB 整数格式(如 "255,0,0")
            if (colorCode.Contains(","))
            {
                var parts = colorCode.Split(',');
                if (parts.Length == 3)
                {
                    return System.Drawing.Color.FromArgb(
                        int.Parse(parts[0]),
                        int.Parse(parts[1]),
                        int.Parse(parts[2]));
                }
                else if (parts.Length == 4)
                {
                    return System.Drawing.Color.FromArgb(
                        int.Parse(parts[0]),
                        int.Parse(parts[1]),
                        int.Parse(parts[2]),
                        int.Parse(parts[3]));
                }
            }

            // 处理颜色名称或其他格式
            return System.Drawing.Color.FromName(colorCode);
        }

核心代码:

var BackgroundColor = cell.Style.Fill.BackgroundColor.LookupColor();//返回单元格背景色


图例:

Excel导入前

Excel导入后

相关推荐
babe小鑫3 小时前
信息与计算科学专业应届生面试 怎么证明自己能解决业务问题
学习·r语言·excel
Data-Miner9 小时前
商品ABC分类分析怎么用AI做?脚本复用+图表可编辑的一次完整实操
人工智能·数据分析·excel
E-iceblue3 天前
Excel 列转行/行列转换全指南:从 4 种常见解法到 Python 批量自动化
python·excel·python库·spire.xls
Data-Miner3 天前
AI处理数据的脚本复用与逻辑复用有什么区别?哪种方式更能沉淀工作成果
数据分析·excel
福兮说3 天前
在浏览器里写一个“够用就好“的 Excel 公式求值器
前端·javascript·excel·编译原理
慧都小妮子4 天前
标签打印如何减少手工抄数?用Bartender 直连 Excel 批量打印
excel·bartender·条码打印·标签打印软件·数据驱动打印·工业打印机
SunnyDays10114 天前
Java 设置 Excel 数据验证:整数、日期、文本长度、下拉列表和时间
java·excel·数据验证·下拉列表
Metaphor6924 天前
使用 Python 设置 Excel 行列自适应 【代码示例】
python·excel
用户0332126663675 天前
使用 Python 设置 Excel 行列自适应 【代码示例】
python·excel
企业数字化笔记5 天前
固定资产Excel批量导入怎么防重复?资产编码、重复检查和错误回执
java·后端·excel