数据去重:通过 C# 删除 Excel 中的重复行

[复制链接]
发表于 2026-5-18 02:23:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在一样寻常数据处理惩罚中,Excel 表格中的重复行是一个常见标题。无论是数据洗濯、报表天生照旧数据分析,去除重复纪录都是一项根本且关键的操纵。本文将具体先容怎样使用 Free Spire.XLS for .NET(一款免费、无需安装 Microsoft Office 的 Excel 操纵组件),通过 C# 代码以编程方式删除 Excel 工作表中的重复行。
实现思绪

删除重复行的焦点逻辑如下:

  • 指定关键列:确定用于判断重复的列(比方第一列 A 列)。
  • 分组辨认:遍历数据地区,根据关键列的值对每一行举行分组。
  • 标记重复行:在每个分组中,生存第一次出现的行(索引最小),将别的行的行号纪录下来。
  • 安全删除:按照行号从大到小的次序删除这些重复行,克制因删除操纵导致的索引错位。
具体步调剖析

1. 安装免费库

在编写代码之前,通过 NuGet 安装所需的免费库:
  1. Install-Package FreeSpire.XLS
复制代码
大概在 Visual Studio 的“管理 NuGet 步伐包”中搜索 FreeSpire.XLS 并安装。
注意:免费版提供了大部分根本功能,足以应对中小规模数据的处理惩罚需求。
2. 加载工作簿和工作表
  1. using Spire.Xls;
  2. using System.Linq;
  3. // 创建 Workbook 实例并加载文档
  4. Workbook workbook = new Workbook();
  5. workbook.LoadFromFile("Test.xlsx");
  6. // 获取第一个工作表
  7. Worksheet sheet = workbook.Worksheets[0];
复制代码
3. 确定命据范围

为了仅对现实存在数据的行举行操纵,我们使用工作表的 LastRow 属性获取末了有用行号,并构造一个从 A1 到 A 列末了一行的范围(比方 A1:A100)。现实使用时,可以根据必要调解起始行,比方跳过标题行。
  1. // 假设数据从第1行开始,以 A 列作为判重依据
  2. string rangeAddress = $"A1:A{sheet.LastRow}";
  3. var range = sheet.Range[rangeAddress];
复制代码
4. 找出必要删除的重复行号

使用 LINQ 对范围内的每一行举行分组。DisplayedText 属性返回单位格在 Excel 界面上的体现文本(会思量格式、公式盘算效果等),相比直接使用 Value 或 Text 更为可靠。
  1. var duplicatedRows = range.Rows
  2.     .GroupBy(row => row.Columns[0].DisplayedText)   // 按第一列的显示文本分组
  3.     .Where(group => group.Count() > 1)             // 只筛选存在重复的分组
  4.     .SelectMany(group => group.Skip(1))            // 跳过每组的第一行(保留行),取其余重复行
  5.     .Select(row => row.Columns[0].Row)             // 获取这些行的行号
  6.     .ToList();
复制代码

  • Range.Rows 返回范围内的全部行对象。
  • GroupBy 根据 A 列的体现文本对行举行分组。
  • Skip(1) 忽略每个分组中的第一行(即生存的那一行)。
  • 终极得到 List,此中包罗全部待删除行的行号(升序分列)。
5. 删除重复行

关键点:如果直接按照升序的行号次序删除,会导致后续行号发生偏移。精确的做法是从后往前删除,如许可以包管每次删除时行号仍然精确。
  1. // 将行号降序排列,然后逐个删除
  2. foreach (int rowNum in duplicatedRows.OrderByDescending(r => r))
  3. {
  4.     sheet.DeleteRow(rowNum);
  5. }
复制代码
也可以使用索引修正法:sheet.DeleteRow(duplicatedRows - i),两种方法效果雷同,但从后往前删除的逻辑更为直观。
6. 生存效果
  1. workbook.SaveToFile("RemoveDuplicateRows.xlsx", ExcelVersion.Version2016);
复制代码
默认生存为 .xlsx 格式,也可以指定为 .xls 或其他 Excel 版本。
完备代码示例

将以上步调解合为一个完备的控制台应用步伐(包罗资源开释发起):
  1. using Spire.Xls;
  2. using System.Linq;
  3. namespace RemoveDuplicateRows
  4. {
  5.     class Program
  6.     {
  7.         static void Main(string[] args)
  8.         {
  9.             // 使用 using 语句确保资源被正确释放
  10.             using (Workbook workbook = new Workbook())
  11.             {
  12.                 // 加载文档
  13.                 workbook.LoadFromFile("Test.xlsx");
  14.                 // 获取第一个工作表
  15.                 Worksheet sheet = workbook.Worksheets[0];
  16.                 // 定义判重范围(A列,从第1行到最后有效行)
  17.                 var range = sheet.Range[$"A1:A{sheet.LastRow}"];
  18.                 // 获取需要删除的重复行号
  19.                 var duplicatedRows = range.Rows
  20.                     .GroupBy(x => x.Columns[0].DisplayedText)
  21.                     .Where(x => x.Count() > 1)
  22.                     .SelectMany(x => x.Skip(1))
  23.                     .Select(x => x.Columns[0].Row)
  24.                     .ToList();
  25.                 // 从后向前删除重复行,避免索引错乱
  26.                 foreach (int rowNum in duplicatedRows.OrderByDescending(r => r))
  27.                 {
  28.                     sheet.DeleteRow(rowNum);
  29.                 }
  30.                 // 保存结果
  31.                 workbook.SaveToFile("RemoveDuplicateRows.xlsx");
  32.             }
  33.         }
  34.     }
  35. }
复制代码
关键点与注意事项

1. 判断重复的依据列

上面的代码仅基于 A 列举行判重。如果必要根据多列组合(比方 A 列和 B 列同时雷同才算重复),只需修改 GroupBy 的键:
  1. .GroupBy(row => new
  2. {
  3.     Col1 = row.Columns[0].DisplayedText,
  4.     Col2 = row.Columns[1].DisplayedText
  5. })
复制代码
2. 生存表头(标题行)

如果第一行是标题行,不应加入重复判断和删除。只需将范围的起始行改为第 2 行:
  1. var range = sheet.Range[$"A2:A{sheet.LastRow}"];
复制代码
同时,LastRow 属性会主动包罗末了一行数据,因此标题行不受影响。删除重复行后,表头行将保持稳定。
3. DisplayedText 与 Value 的区别

属性阐明保举场景DisplayedText返回单位格在 Excel 界面上体现的内容,思量了数字格式、日期格式、公式等业务上的重复判断(保举)Value返回原始值(公式盘算效果,但大概忽略体现格式)必要精确原始值的场景在简朴文本情况下两者效果同等,但保举使用 DisplayedText 以克制因格式差异导致的误判。
4. 内存与资源开释

Workbook 类实现了 IDisposable 接口,剧烈发起使用 using 语句或手动调用 Dispose() 方法,以克制内存走漏,尤其是在处理惩罚大型文件时。
本文演示了使用 C# 删除 Excel 重复行的完备流程,包罗加载文件、辨认重复行、删除行以及生存效果。该方法机动可定制,支持单列或多列判重,可以或许无缝集成到数据洗濯的主动化流程中。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表