最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#代碼實現(xiàn)刪除Excel中的重復(fù)行

 更新時間:2026年05月13日 11:38:28   作者:LAYONTHEGROUND  
在日常數(shù)據(jù)處理中,Excel?表格中的重復(fù)行是一個常見問題,本文將詳細(xì)介紹如何使用?Free?Spire.XLS?for?.NET,通過?C#?代碼以編程方式刪除?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ù)行的核心邏輯如下:

  1. 指定關(guān)鍵列:確定用于判斷重復(fù)的列(例如第一列 A 列)。
  2. 分組識別:遍歷數(shù)據(jù)區(qū)域,根據(jù)關(guān)鍵列的值對每一行進(jìn)行分組。
  3. 標(biāo)記重復(fù)行:在每個分組中,保留第一次出現(xiàn)的行(索引最?。?,將其余行的行號記錄下來。
  4. 安全刪除:按照行號從大到小的順序刪除這些重復(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é)果等),相比直接使用 ValueText 更為可靠。

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)文章

最新評論

江北区| 婺源县| 松潘县| 高州市| 大石桥市| 桐乡市| 弥勒县| 剑川县| 诸暨市| 安仁县| 宁津县| 汝州市| 婺源县| 宁安市| 宜宾县| 广元市| 平江县| 鄄城县| 福清市| 盘锦市| 图片| 尼木县| 元谋县| 嵊泗县| 叶城县| 东乡| 兴文县| 响水县| 永昌县| 邵武市| 巨鹿县| 龙州县| 高雄县| 永定县| 高密市| 襄汾县| 兴业县| 华宁县| 亳州市| 信阳市| 沅陵县|