财神机器人

番摊机器人,顶尖机器人,数聊机器人,粮草机器人

财神机器人 使用Spire.XLS for .NET快速去重

在数据处理过程中,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文件时,两种库的性能表现相近,都能高效处理十万级别的数据行。

无论选择哪种方案,都建议在处理前备份原始数据,避免因代码逻辑问题导致数据丢失。同时,可根据实际需求添加数据预处理步骤,如去除空格、统一大小写等,确保去重结果的准确性。 

Powered By Z-BlogPHP 1.7.3

财神机器人,顶尖机器人,数聊机器人,粮草机器人