马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
在一样寻常数据处理惩罚中,Excel 表格中的重复行是一个常见标题。无论是数据洗濯、报表天生照旧数据分析,去除重复纪录都是一项根本且关键的操纵。本文将具体先容怎样使用 Free Spire.XLS for .NET(一款免费、无需安装 Microsoft Office 的 Excel 操纵组件),通过 C# 代码以编程方式删除 Excel 工作表中的重复行。
实现思绪
删除重复行的焦点逻辑如下:
- 指定关键列:确定用于判断重复的列(比方第一列 A 列)。
- 分组辨认:遍历数据地区,根据关键列的值对每一行举行分组。
- 标记重复行:在每个分组中,生存第一次出现的行(索引最小),将别的行的行号纪录下来。
- 安全删除:按照行号从大到小的次序删除这些重复行,克制因删除操纵导致的索引错位。
具体步调剖析
1. 安装免费库
在编写代码之前,通过 NuGet 安装所需的免费库:- Install-Package FreeSpire.XLS
复制代码 大概在 Visual Studio 的“管理 NuGet 步伐包”中搜索 FreeSpire.XLS 并安装。
注意:免费版提供了大部分根本功能,足以应对中小规模数据的处理惩罚需求。
2. 加载工作簿和工作表
- using Spire.Xls;
- using System.Linq;
- // 创建 Workbook 实例并加载文档
- Workbook workbook = new Workbook();
- workbook.LoadFromFile("Test.xlsx");
- // 获取第一个工作表
- Worksheet sheet = workbook.Worksheets[0];
复制代码 3. 确定命据范围
为了仅对现实存在数据的行举行操纵,我们使用工作表的 LastRow 属性获取末了有用行号,并构造一个从 A1 到 A 列末了一行的范围(比方 A1:A100)。现实使用时,可以根据必要调解起始行,比方跳过标题行。- // 假设数据从第1行开始,以 A 列作为判重依据
- string rangeAddress = $"A1:A{sheet.LastRow}";
- var range = sheet.Range[rangeAddress];
复制代码 4. 找出必要删除的重复行号
使用 LINQ 对范围内的每一行举行分组。DisplayedText 属性返回单位格在 Excel 界面上的体现文本(会思量格式、公式盘算效果等),相比直接使用 Value 或 Text 更为可靠。- var duplicatedRows = range.Rows
- .GroupBy(row => row.Columns[0].DisplayedText) // 按第一列的显示文本分组
- .Where(group => group.Count() > 1) // 只筛选存在重复的分组
- .SelectMany(group => group.Skip(1)) // 跳过每组的第一行(保留行),取其余重复行
- .Select(row => row.Columns[0].Row) // 获取这些行的行号
- .ToList();
复制代码
- Range.Rows 返回范围内的全部行对象。
- GroupBy 根据 A 列的体现文本对行举行分组。
- Skip(1) 忽略每个分组中的第一行(即生存的那一行)。
- 终极得到 List,此中包罗全部待删除行的行号(升序分列)。
5. 删除重复行
关键点:如果直接按照升序的行号次序删除,会导致后续行号发生偏移。精确的做法是从后往前删除,如许可以包管每次删除时行号仍然精确。- // 将行号降序排列,然后逐个删除
- foreach (int rowNum in duplicatedRows.OrderByDescending(r => r))
- {
- sheet.DeleteRow(rowNum);
- }
复制代码也可以使用索引修正法:sheet.DeleteRow(duplicatedRows - i),两种方法效果雷同,但从后往前删除的逻辑更为直观。
6. 生存效果
- workbook.SaveToFile("RemoveDuplicateRows.xlsx", ExcelVersion.Version2016);
复制代码 默认生存为 .xlsx 格式,也可以指定为 .xls 或其他 Excel 版本。
完备代码示例
将以上步调解合为一个完备的控制台应用步伐(包罗资源开释发起):- using Spire.Xls;
- using System.Linq;
- namespace RemoveDuplicateRows
- {
- class Program
- {
- static void Main(string[] args)
- {
- // 使用 using 语句确保资源被正确释放
- using (Workbook workbook = new Workbook())
- {
- // 加载文档
- workbook.LoadFromFile("Test.xlsx");
- // 获取第一个工作表
- Worksheet sheet = workbook.Worksheets[0];
- // 定义判重范围(A列,从第1行到最后有效行)
- var range = sheet.Range[$"A1:A{sheet.LastRow}"];
- // 获取需要删除的重复行号
- var duplicatedRows = range.Rows
- .GroupBy(x => x.Columns[0].DisplayedText)
- .Where(x => x.Count() > 1)
- .SelectMany(x => x.Skip(1))
- .Select(x => x.Columns[0].Row)
- .ToList();
- // 从后向前删除重复行,避免索引错乱
- foreach (int rowNum in duplicatedRows.OrderByDescending(r => r))
- {
- sheet.DeleteRow(rowNum);
- }
- // 保存结果
- workbook.SaveToFile("RemoveDuplicateRows.xlsx");
- }
- }
- }
- }
复制代码 关键点与注意事项
1. 判断重复的依据列
上面的代码仅基于 A 列举行判重。如果必要根据多列组合(比方 A 列和 B 列同时雷同才算重复),只需修改 GroupBy 的键:- .GroupBy(row => new
- {
- Col1 = row.Columns[0].DisplayedText,
- Col2 = row.Columns[1].DisplayedText
- })
复制代码 2. 生存表头(标题行)
如果第一行是标题行,不应加入重复判断和删除。只需将范围的起始行改为第 2 行:- var range = sheet.Range[$"A2:A{sheet.LastRow}"];
复制代码 同时,LastRow 属性会主动包罗末了一行数据,因此标题行不受影响。删除重复行后,表头行将保持稳定。
3. DisplayedText 与 Value 的区别
属性阐明保举场景DisplayedText返回单位格在 Excel 界面上体现的内容,思量了数字格式、日期格式、公式等业务上的重复判断(保举)Value返回原始值(公式盘算效果,但大概忽略体现格式)必要精确原始值的场景在简朴文本情况下两者效果同等,但保举使用 DisplayedText 以克制因格式差异导致的误判。
4. 内存与资源开释
Workbook 类实现了 IDisposable 接口,剧烈发起使用 using 语句或手动调用 Dispose() 方法,以克制内存走漏,尤其是在处理惩罚大型文件时。
本文演示了使用 C# 删除 Excel 重复行的完备流程,包罗加载文件、辨认重复行、删除行以及生存效果。该方法机动可定制,支持单列或多列判重,可以或许无缝集成到数据洗濯的主动化流程中。
|