在数据处理过程中,Excel表格中的重复行是常见问题,不仅会增加数据体积,还可能干扰数据分析结果。
使用C#结合专业的Excel处理库,能够高效、精准地完成重复行删除操作。本文将详细介绍两种主流实现
方案,帮助您根据实际需求选择合适的方法。
方案一:使用Spire.XLS for .NET快速去重
Spire.XLS for .NET是一款功能强大的Excel处理库,无需依赖Microsoft Excel即可完成各类Excel操作,其
中内置的去重方法能够大幅简化开发流程。
1. 环境准备
首先通过NuGet包管理器安装Spire.XLS库,在Package Manager Console中执行以下命令:
Install-Package Spire.XLS
2. 三种去重场景实现
(1)删除整个工作表的重复行
当需要对整个工作表进行去重时,可使用RemoveDuplicates()方法,该方法会逐行比较所有单元格内容,
仅保留首次出现的行。
using Spire.Xls;
namespace RemoveDuplicatesFromWorksheet
{
internal class Program
{
static void Main(string[] args)
{
// 打开Excel文件
Workbook workbook = new Workbook();
workbook.LoadFromFile("测试.xlsx");
// 获取第一个工作表(索引从0开始)
Worksheet sheet = workbook.Worksheets;
// 删除工作表中所有重复行
sheet.RemoveDuplicates();
// 保存处理后的文件
workbook.SaveToFile("删除工作表重复行.xlsx", ExcelVersion.Version2016);
workbook.Dispose();
}
}
}
(2)删除指定单元格区域的重复行
如果只需清理特定区域的重复数据,可使用带参数的RemoveDuplicates()方法,指定需要检查的单元格范围(行列索引从1开始)。
using Spire.Xls;
namespace RemoveDuplicateRowsFromRange
{
internal class Program
{
static void Main(string[] args)
{
Workbook workbook = new Workbook();
workbook.LoadFromFile("测试.xlsx");
Worksheet sheet = workbook.Worksheets;
// 删除第2行到第9行、第1列到第4列区域内的重复行
sheet.RemoveDuplicates(2, 1, 9, 4);
workbook.SaveToFile("删除指定区域重复行.xlsx", ExcelVersion.Version2016);
workbook.Dispose();
}
}
}
(3)基于特定列删除重复行
在某些业务场景中,只需根据关键列判断重复行,可通过LINQ查询结合行删除方法实现。
using Spire.Xls;
using System.Linq;
namespace RemoveDuplicatesByColumn
{
class Program
{
static void Main(string[] args)
{
Workbook workbook = new Workbook();
workbook.LoadFromFile("测试.xlsx");
Worksheet sheet = workbook.Worksheets;
// 指定用于判断重复的列(示例为A列)
var range = sheet.Range["A1:A" + sheet.LastRow];
// 获取重复行的行号(跳过首次出现的行)
var duplicatedRows = range.Rows
.GroupBy(x => x.Columns.DisplayedText)
.Where(x => x.Count() > 1)
.SelectMany(x => x.Skip(1))
.Select(x => x.Columns.Row)
.ToList();
// 从后往前删除重复行,避免索引混乱
for (int i = duplicatedRows.Count - 1; i >= 0; i--)
{
sheet.DeleteRow(duplicatedRows[i]);
}
workbook.SaveToFile("按列去重结果.xlsx");
}
}
}
方案二:使用EPPlus自定义去重逻辑
EPPlus是另一款流行的开源Excel处理库,适合需要高度自定义去重逻辑的场景。
1. 环境准备
通过NuGet安装EPPlus库:
Install-Package EPPlus
2. 实现自定义去重
以下示例展示如何删除完全重复的行,支持处理非连续的重复行:
using OfficeOpenXml;
using System;
using System.Collections.Generic;
using System.IO;
namespace EPPlusRemoveDuplicates
{
class Program
{
static void Main(string[] args)
{
// 设置EPPlus许可证上下文
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
FileInfo file = new FileInfo("测试.xlsx");
using (ExcelPackage package = new ExcelPackage(file))
{
ExcelWorksheet worksheet = package.Workbook.Worksheets;
int rowCount = worksheet.Dimension.End.Row;
int colCount = worksheet.Dimension.End.Column;
HashSet<string> uniqueRows = new HashSet<string>();
List<int> rowsToDelete = new List<int>();
// 遍历所有行,生成行特征字符串
for (int row = 1; row <= rowCount; row++)
{
string rowKey = "";
for (int col = 1; col <= colCount; col++)
{
rowKey += worksheet.Cells[row, col].Text + "|";
}
// 如果行特征已存在,标记为待删除
if (!uniqueRows.Add(rowKey))
{
rowsToDelete.Add(row);
}
}
// 从后往前删除重复行
for (int i = rowsToDelete.Count - 1; i >= 0; i--)
{
worksheet.DeleteRow(rowsToDelete[i]);
}
// 保存文件
package.SaveAs(new FileInfo("EPPlus去重结果.xlsx"));
}
}
}
}
方案选择建议
Spire.XLS:适合快速开发,内置方法能够满足大多数常规去重需求,代码简洁易维护。
EPPlus:适合需要复杂自定义逻辑的场景,完全开源免费,灵活性更高。
性能对比:在处理大型Excel文件时,两种库的性能表现相近,都能高效处理十万级别的数据行。
无论选择哪种方案,都建议在处理前备份原始数据,避免因代码逻辑问题导致数据丢失。同时,可根据实际需求添加数据预处理步骤,如去除空格、统一大小写等,确保去重结果的准确性。