C#代碼實現(xiàn)刪除Excel中的重復(fù)行
在日常數(shù)據(jù)處理中,Excel 表格中的重復(fù)行是一個常見問題。無論是數(shù)據(jù)清洗、報表生成還是數(shù)據(jù)分析,去除重復(fù)記錄都是一項基礎(chǔ)且關(guān)鍵的操作。本文將詳細(xì)介紹如何使用 Free Spire.XLS for .NET(一款免費、無需安裝 Microsoft Office 的 Excel 操作組件),通過 C# 代碼以編程方式刪除 Excel 工作表中的重復(fù)行。
實現(xiàn)思路
刪除重復(fù)行的核心邏輯如下:
- 指定關(guān)鍵列:確定用于判斷重復(fù)的列(例如第一列 A 列)。
- 分組識別:遍歷數(shù)據(jù)區(qū)域,根據(jù)關(guān)鍵列的值對每一行進(jìn)行分組。
- 標(biāo)記重復(fù)行:在每個分組中,保留第一次出現(xiàn)的行(索引最?。?,將其余行的行號記錄下來。
- 安全刪除:按照行號從大到小的順序刪除這些重復(fù)行,避免因刪除操作導(dǎo)致的索引錯位。
詳細(xì)步驟解析
1. 安裝免費庫
在編寫代碼之前,通過 NuGet 安裝所需的免費庫:
Install-Package FreeSpire.XLS
或者在 Visual Studio 的“管理 NuGet 程序包”中搜索 FreeSpire.XLS 并安裝。
注意:免費版提供了大部分基礎(chǔ)功能,足以應(yīng)對中小規(guī)模數(shù)據(jù)的處理需求。
2. 加載工作簿和工作表
using Spire.Xls;
using System.Linq;
// 創(chuàng)建 Workbook 實例并加載文檔
Workbook workbook = new Workbook();
workbook.LoadFromFile("Test.xlsx");
// 獲取第一個工作表
Worksheet sheet = workbook.Worksheets[0];
3. 確定數(shù)據(jù)范圍
為了僅對實際存在數(shù)據(jù)的行進(jìn)行操作,我們使用工作表的 LastRow 屬性獲取最后有效行號,并構(gòu)造一個從 A1 到 A 列最后一行的范圍(例如 A1:A100)。實際使用時,可以根據(jù)需要調(diào)整起始行,例如跳過標(biāo)題行。
// 假設(shè)數(shù)據(jù)從第1行開始,以 A 列作為判重依據(jù)
string rangeAddress = $"A1:A{sheet.LastRow}";
var range = sheet.Range[rangeAddress];
4. 找出需要刪除的重復(fù)行號
利用 LINQ 對范圍內(nèi)的每一行進(jìn)行分組。DisplayedText 屬性返回單元格在 Excel 界面上的顯示文本(會考慮格式、公式計算結(jié)果等),相比直接使用 Value 或 Text 更為可靠。
var duplicatedRows = range.Rows
.GroupBy(row => row.Columns[0].DisplayedText) // 按第一列的顯示文本分組
.Where(group => group.Count() > 1) // 只篩選存在重復(fù)的分組
.SelectMany(group => group.Skip(1)) // 跳過每組的第一行(保留行),取其余重復(fù)行
.Select(row => row.Columns[0].Row) // 獲取這些行的行號
.ToList();
Range.Rows返回范圍內(nèi)的所有行對象。GroupBy根據(jù) A 列的顯示文本對行進(jìn)行分組。Skip(1)忽略每個分組中的第一行(即保留的那一行)。- 最終得到
List<int>,其中包含所有待刪除行的行號(升序排列)。
5. 刪除重復(fù)行
關(guān)鍵點:如果直接按照升序的行號順序刪除,會導(dǎo)致后續(xù)行號發(fā)生偏移。正確的做法是從后往前刪除,這樣可以保證每次刪除時行號仍然準(zhǔn)確。
// 將行號降序排列,然后逐個刪除
foreach (int rowNum in duplicatedRows.OrderByDescending(r => r))
{
sheet.DeleteRow(rowNum);
}
也可以使用索引修正 法:sheet.DeleteRow(duplicatedRows[i] - i),兩種方法效果相同,但從后往前刪除的邏輯更為直觀。
6. 保存結(jié)果
workbook.SaveToFile("RemoveDuplicateRows.xlsx", ExcelVersion.Version2016);
默認(rèn)保存為 .xlsx 格式,也可以指定為 .xls 或其他 Excel 版本。
完整代碼示例
將以上步驟整合為一個完整的控制臺應(yīng)用程序(包含資源釋放建議):
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}"];
// 獲取需要刪除的重復(fù)行號
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();
// 從后向前刪除重復(fù)行,避免索引錯亂
foreach (int rowNum in duplicatedRows.OrderByDescending(r => r))
{
sheet.DeleteRow(rowNum);
}
// 保存結(jié)果
workbook.SaveToFile("RemoveDuplicateRows.xlsx");
}
}
}
}
關(guān)鍵點與注意事項
1. 判斷重復(fù)的依據(jù)列
上面的代碼僅基于 A 列進(jìn)行判重。如果需要根據(jù)多列組合(例如 A 列和 B 列同時相同才算重復(fù)),只需修改 GroupBy 的鍵:
.GroupBy(row => new
{
Col1 = row.Columns[0].DisplayedText,
Col2 = row.Columns[1].DisplayedText
})
2. 保留表頭(標(biāo)題行)
如果第一行是標(biāo)題行,不應(yīng)參與重復(fù)判斷和刪除。只需將范圍的起始行改為第 2 行:
var range = sheet.Range[$"A2:A{sheet.LastRow}"];
同時,LastRow 屬性會自動包含最后一行數(shù)據(jù),因此標(biāo)題行不受影響。刪除重復(fù)行后,表頭行將保持不變。
3.DisplayedText與Value的區(qū)別
| 屬性 | 說明 | 推薦場景 |
|---|---|---|
DisplayedText | 返回單元格在 Excel 界面上顯示的內(nèi)容,考慮了數(shù)字格式、日期格式、公式等 | 業(yè)務(wù)上的重復(fù)判斷(推薦) |
Value | 返回原始值(公式計算結(jié)果,但可能忽略顯示格式) | 需要精確原始值的場景 |
在簡單文本情況下兩者結(jié)果一致,但推薦使用 DisplayedText 以避免因格式差異導(dǎo)致的誤判。
4. 內(nèi)存與資源釋放
Workbook 類實現(xiàn)了 IDisposable 接口,強(qiáng)烈建議使用 using 語句或手動調(diào)用 Dispose() 方法,以避免內(nèi)存泄漏,尤其是在處理大型文件時。
本文演示了使用 C# 刪除 Excel 重復(fù)行的完整流程,包括加載文件、識別重復(fù)行、刪除行以及保存結(jié)果。該方法靈活可定制,支持單列或多列判重,能夠無縫集成到數(shù)據(jù)清洗的自動化流程中。
到此這篇關(guān)于C#代碼實現(xiàn)刪除Excel中的重復(fù)行的文章就介紹到這了,更多相關(guān)C#刪除Excel重復(fù)行內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Unity學(xué)習(xí)之FSM有限狀態(tài)機(jī)
這篇文章主要介紹了Unity學(xué)習(xí)之FSM有限狀態(tài)機(jī),通過詳細(xì)的代碼案例來進(jìn)行解析說明,希望這篇文章對你有所幫助2021-06-06
C#學(xué)習(xí)筆記整理_深入剖析構(gòu)造函數(shù)、析構(gòu)函數(shù)
下面小編就為大家?guī)硪黄狢#學(xué)習(xí)筆記整理_深入剖析構(gòu)造函數(shù)、析構(gòu)函數(shù)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-09-09
WinForm之BindingSource基礎(chǔ)操作實例教程
這篇文章主要介紹了WinForm之BindingSource基礎(chǔ)操作,對BindingSource組建的用法進(jìn)行較為深入的實例分析,需要的朋友可以參考下2014-08-08

