C#代码实现删除Excel中的重复行

 更新时间:2026年05月13日 11:38:28   作者:LAYONTHEGROUND  
在日常数据处理中,Excel 表格中的重复行是一个常见问题,本文将详细介绍如何使用 Free Spire.XLS for .NET,通过 C# 代码以编程方式删除 Excel 工作表中的重复行,有需要的小伙伴可以了解下

在日常数据处理中,Excel 表格中的重复行是一个常见问题。无论是数据清洗、报表生成还是数据分析,去除重复记录都是一项基础且关键的操作。本文将详细介绍如何使用 Free Spire.XLS for .NET(一款免费、无需安装 Microsoft Office 的 Excel 操作组件),通过 C# 代码以编程方式删除 Excel 工作表中的重复行。

实现思路

删除重复行的核心逻辑如下:

  1. 指定关键列:确定用于判断重复的列(例如第一列 A 列)。
  2. 分组识别:遍历数据区域,根据关键列的值对每一行进行分组。
  3. 标记重复行:在每个分组中,保留第一次出现的行(索引最小),将其余行的行号记录下来。
  4. 安全删除:按照行号从大到小的顺序删除这些重复行,避免因删除操作导致的索引错位。

详细步骤解析

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 界面上的显示文本(会考虑格式、公式计算结果等),相比直接使用 ValueText 更为可靠。

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<int>,其中包含所有待删除行的行号(升序排列)。

5. 删除重复行

关键点:如果直接按照升序的行号顺序删除,会导致后续行号发生偏移。正确的做法是从后往前删除,这样可以保证每次删除时行号仍然准确。

// 将行号降序排列,然后逐个删除
foreach (int rowNum in duplicatedRows.OrderByDescending(r => r))
{
    sheet.DeleteRow(rowNum);
}

也可以使用索引修正 法:sheet.DeleteRow(duplicatedRows[i] - 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 重复行的完整流程,包括加载文件、识别重复行、删除行以及保存结果。该方法灵活可定制,支持单列或多列判重,能够无缝集成到数据清洗的自动化流程中。

到此这篇关于C#代码实现删除Excel中的重复行的文章就介绍到这了,更多相关C#删除Excel重复行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用C#将Excel导出为DataTable的实战指南

    使用C#将Excel导出为DataTable的实战指南

    在当今的数据驱动时代,Excel作为一种普遍的数据存储和交换格式,几乎无处不在,对于C#开发者而言,如何高效、便捷地将Excel文件中的数据整合到应用程序中进行处理,常常是一个需要面对的挑战,本文将介绍一种强大而易用的解决方案轻松实现Excel到DataTable的转换
    2025-10-10
  • C#删除最后一个结尾逗号的方法

    C#删除最后一个结尾逗号的方法

    这篇文章主要介绍了C#删除最后一个结尾逗号的方法,涉及C#、操作字符串的技巧,简单实用,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • c#文档图片自动纠偏

    c#文档图片自动纠偏

    最近找到一个不错的文档图片自动纠偏的方法,现在跟大家分享一下,需要的朋友可以参考下
    2014-03-03
  • C#垃圾回收机制的详细介绍

    C#垃圾回收机制的详细介绍

    这篇文章详细介绍了C#垃圾回收机制,有需要的朋友可以参考一下
    2013-09-09
  • C#遍历List并删除某个元素的方法

    C#遍历List并删除某个元素的方法

    这篇文章主要介绍了C#遍历List并删除某个元素的方法,实例分析了正序与倒序遍历list及删除元素的使用技巧,需要的朋友可以参考下
    2015-02-02
  • C#程序启动项的设置方法

    C#程序启动项的设置方法

    这篇文章主要为大家详细介绍了C#程序启动项的设置方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • C#如何使用XmlDocument访问XML文件

    C#如何使用XmlDocument访问XML文件

    本文介绍了XML文件的特点、用途、格式、示例、解析和处理方式,以及在C#中使用XmlDocument类进行增删改查操作的方法,XML文件是一种灵活的数据描述和存储方式,适用于各种应用场景,在C#中,通过XmlDocument类可以方便地对XML文件进行操作
    2024-12-12
  • winform模拟鼠标按键的具体实现

    winform模拟鼠标按键的具体实现

    这篇文章介绍了winform模拟鼠标按键的具体实现,有需要的朋友可以参考一下
    2013-10-10
  • 自己编写sqlhelper类示例分享

    自己编写sqlhelper类示例分享

    这篇文章主要介绍了自己编写sqlhlper类示例,需要的朋友可以参考下
    2014-04-04
  • C#动态生成实体类的5种方法详解与实战演示

    C#动态生成实体类的5种方法详解与实战演示

    这篇文章主要为大家详细介绍了C#中动态生成实体类的5种实用方法,涵盖T4模板,CodeDOM,Roslyn,反射和Emit等技术,有需要的小伙伴可以跟随小编一起学习一下
    2025-04-04

最新评论