跳過到頁腳內容
使用 IRONXL

在C#中匯入CSV | ASP.NET Core教程 | IronXL

在ASP.NET Core中使用 C# 匯入 CSV 檔案意味著需要讀取檔案流、解析分隔行,並將每筆記錄對應到類型化物件——所有這些操作都必須在對資料進行任何有用的操作之前完成。 IronXL透過一個 API 處理每個步驟,該 API 對 CSV、XLSX 和 TSV 檔案同樣適用,因此您可以將時間用於應用程式邏輯,而不是處理字串分割等特殊情況。

立即開始免費試用,即可跟隨教學並在您自己的環境中測試這些程式碼範例。

如何在.NET專案中安裝IronXL ?

在編寫任何解析程式碼之前,請將IronXL新增到您的專案中。 在 Visual Studio 中開啟套件管理器控制台,或在專案目錄中開啟終端,然後執行下列命令之一:

Install-Package IronXl.Excel
dotnet add package IronXl.Excel
Install-Package IronXl.Excel
dotnet add package IronXl.Excel
SHELL

此軟體包面向.NET 10、 .NET 6+、. .NET Framework 4.6.2+ 和.NET Standard 2.0,因此適用於任何現代專案類型。 伺服器上無需安裝微軟Office辦公室軟體。 軟體包恢復後,在任何調用該庫的文件的頂部添加 using IronXL;

有關詳細的設定選項,包括全域工具安裝和 CI/CD 管道配置,請造訪IronXL安裝指南

如何在ASP.NET Core中匯入 CSV 檔案?

在ASP.NET Core中匯入 CSV 檔案需要從伺服器讀取檔案流,解析每一行,並將值對應到模型類別。 雖然有些開發者會選擇手動實作或使用第三方軟體包,但IronXL提供了一種無需額外配置即可處理 CSV 檔案和 Excel 格式的單一方法。

以下程式碼顯示如何使用 IronXL 的 WorkBook.LoadCSV 方法載入 CSV 檔案:

using IronXL;

// Load the CSV file directly using the full file path
var csv = WorkBook.LoadCSV("products.csv");
WorkSheet worksheet = csv.DefaultWorkSheet;

// Access CSV data by iterating through rows
foreach (var row in worksheet.Rows)
{
    string productName = row.Columns[1].StringValue;
    decimal price = row.Columns[2].DecimalValue;
    Console.WriteLine($"Product: {productName}, Price: {price}");
}
using IronXL;

// Load the CSV file directly using the full file path
var csv = WorkBook.LoadCSV("products.csv");
WorkSheet worksheet = csv.DefaultWorkSheet;

// Access CSV data by iterating through rows
foreach (var row in worksheet.Rows)
{
    string productName = row.Columns[1].StringValue;
    decimal price = row.Columns[2].DecimalValue;
    Console.WriteLine($"Product: {productName}, Price: {price}");
}
$vbLabelText   $csharpLabel

了解 WorkBook.LoadCSV 方法

WorkBook.LoadCSV 方法讀取 CSV 檔案並建立一個工作表,其中每一行成為一行,每個分隔值成為一個儲存格。 IronXL會自動偵測分隔符號(逗號、分號或製表符),並處理值中包含逗號的引號的欄位。 對於標準 CSV 文件,無需手動配置分隔符號。

單元格值存取器如 IntValueDateTimeValue 處理類型轉換,因此您可以避免使用 @@--CODE@1364--@@@ 1364-- 處理類型轉換,因此您可以避免使用 @@--CODE@1364--@@@. 當儲存格為空或包含無法識別的值時,這些存取器會傳回類型的預設值,而不是拋出異常,從而防止在批次匯入操作期間出現未處理的錯誤。

這種方法消除了自訂實作中容易出錯的手動字串解析,特別是對於轉義引號、Windows 風格的換行符和多行單元格值等特殊情況。 有關支援的格式和分隔符號選項的更多詳細信息,請參閱IronXL CSV 文件

ASP 導入 CSV:C# 開發人員完整指南:圖 1 - 導入簡單的 CSV 檔案並在控制台中讀取輸出

如何為 CSV 資料建立模型類別?

將 CSV 資料對應到強型別物件需要一個反映檔案結構的模型類別。 您可以將原始字串資料轉換為特定類型,例如整數、小數和日期時間值。 對於產品庫存數據,建立一個類,其屬性與每個 CSV 列相符:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; } = string.Empty;
    public decimal Price { get; set; }
    public int Quantity { get; set; }
}
public class Product
{
    public int Id { get; set; }
    public string Name { get; set; } = string.Empty;
    public decimal Price { get; set; }
    public int Quantity { get; set; }
}
$vbLabelText   $csharpLabel

將 CSV 行解析為類型化集合

定義好模型類別後,就可以將 CSV 記錄解析為類型化集合。 以下範例使用循環索引跳過標題行,並將後續每一行對應到 Product 物件:

using IronXL;

WorkBook workbook = WorkBook.LoadCSV("inventory.csv");
WorkSheet ws = workbook.DefaultWorkSheet;
var records = new List<Product>();

// Skip header row (index 0), iterate through data rows
for (int i = 1; i < ws.Rows.Count(); i++)
{
    var row = ws.Rows[i];
    var product = new Product
    {
        Id = row.Columns[0].IntValue,
        Name = row.Columns[1].StringValue,
        Price = row.Columns[2].DecimalValue,
        Quantity = row.Columns[3].IntValue
    };
    records.Add(product);
}

Console.WriteLine($"Loaded {records.Count} products.");
using IronXL;

WorkBook workbook = WorkBook.LoadCSV("inventory.csv");
WorkSheet ws = workbook.DefaultWorkSheet;
var records = new List<Product>();

// Skip header row (index 0), iterate through data rows
for (int i = 1; i < ws.Rows.Count(); i++)
{
    var row = ws.Rows[i];
    var product = new Product
    {
        Id = row.Columns[0].IntValue,
        Name = row.Columns[1].StringValue,
        Price = row.Columns[2].DecimalValue,
        Quantity = row.Columns[3].IntValue
    };
    records.Add(product);
}

Console.WriteLine($"Loaded {records.Count} products.");
$vbLabelText   $csharpLabel

records 集合現在包含類型化的 Product 對象,可用於資料庫操作、JSON 序列化或進一步的業務邏輯。 IronXL 的儲存格值存取器會自動處理類型轉換,包括可選欄位的空值處理。

處理可選字段和可為空字段

實際的 CSV 檔案經常包含空白儲存格或可選列。 IronXL 的值存取器在儲存格為空時傳回預設值,而不是拋出異常。 對於可為空的類型,您可以使用條件檢查:

// Reading an optional DateTime field
DateTime? lastUpdated = string.IsNullOrEmpty(row.Columns[4].StringValue)
    ? null
    : row.Columns[4].DateTimeValue;
// Reading an optional DateTime field
DateTime? lastUpdated = string.IsNullOrEmpty(row.Columns[4].StringValue)
    ? null
    : row.Columns[4].DateTimeValue;
$vbLabelText   $csharpLabel

這種模式可以保護你的匯入程式碼,而無需將每個儲存格存取都包裝在 try-catch 區塊中。 有關處理複雜資料類型和大型檔案的指導,請造訪IronXL WorkSheet 文件

如何在 Web API 中處理 CSV 檔案上傳?

建立一個接受瀏覽器上傳 CSV 檔案的 API 端點需要將ASP.NET Core 的 IFormFile 與 IronXL 的解析功能結合。 以下程式碼示範了一個完整的控制器實現,該控制器解析上傳的檔案並傳回 JSON 回應:

using IronXL;
using Microsoft.AspNetCore.Mvc;

[Route("api/[controller]")]
[ApiController]
public class CsvController : ControllerBase
{
    [HttpPost("upload")]
    public async Task<IActionResult> UploadCsv(IFormFile file)
    {
        if (file == null || file.Length == 0)
            return BadRequest("Please upload a valid CSV file.");

        try
        {
            using var stream = new MemoryStream();
            await file.CopyToAsync(stream);
            stream.Position = 0;

            WorkBook workbook = WorkBook.Load(stream, "csv");
            WorkSheet ws = workbook.DefaultWorkSheet;
            var records = new List<Product>();

            // Skip header row, iterate through data rows
            for (int i = 1; i < ws.Rows.Count(); i++)
            {
                var row = ws.Rows[i];
                records.Add(new Product
                {
                    Id = row.Columns[0].IntValue,
                    Name = row.Columns[1].StringValue,
                    Price = row.Columns[2].DecimalValue,
                    Quantity = row.Columns[3].IntValue
                });
            }

            return Ok(new
            {
                message = "Import successful",
                count = records.Count,
                data = records
            });
        }
        catch (Exception ex)
        {
            return BadRequest($"Error processing file: {ex.Message}");
        }
    }
}
using IronXL;
using Microsoft.AspNetCore.Mvc;

[Route("api/[controller]")]
[ApiController]
public class CsvController : ControllerBase
{
    [HttpPost("upload")]
    public async Task<IActionResult> UploadCsv(IFormFile file)
    {
        if (file == null || file.Length == 0)
            return BadRequest("Please upload a valid CSV file.");

        try
        {
            using var stream = new MemoryStream();
            await file.CopyToAsync(stream);
            stream.Position = 0;

            WorkBook workbook = WorkBook.Load(stream, "csv");
            WorkSheet ws = workbook.DefaultWorkSheet;
            var records = new List<Product>();

            // Skip header row, iterate through data rows
            for (int i = 1; i < ws.Rows.Count(); i++)
            {
                var row = ws.Rows[i];
                records.Add(new Product
                {
                    Id = row.Columns[0].IntValue,
                    Name = row.Columns[1].StringValue,
                    Price = row.Columns[2].DecimalValue,
                    Quantity = row.Columns[3].IntValue
                });
            }

            return Ok(new
            {
                message = "Import successful",
                count = records.Count,
                data = records
            });
        }
        catch (Exception ex)
        {
            return BadRequest($"Error processing file: {ex.Message}");
        }
    }
}
$vbLabelText   $csharpLabel

配置端點和多部分錶單

要使 [HttpPost("upload")] 操作接受檔案上傳,專案必須支援 multipart 表單資料。 在 Program.cs 中,為了實現最小的 API 設置,請確保您已調用 builder.Services.AddControllers()app.MapControllers()。 端點可透過 /api/csv/upload 存取。

從瀏覽器表單進行測試時,將表單的 enctype 屬性設為 multipart/form-data,並使用檔案輸入元素。 對於Postman等 API 用戶端,請在請求體中選擇"form-data",新增一個名為 file 的鍵,並附加 CSV 檔案。控制器將傳回一個包含記錄數和已解析資料數組的 JSON 對象,客戶端JavaScript可以立即使用該對象。

ASP 導入 CSV:C# 開發人員完整指南:圖 2 - 成功輸出從導入的 CSV 檔案讀取的資料

解析前驗證文件類型

在將資料流傳遞給IronXL之前,請先驗證檔案副檔名,拒絕非 CSV 格式的上傳檔案:

var extension = Path.GetExtension(file.FileName).ToLowerInvariant();
if (extension != ".csv" && extension != ".txt")
    return BadRequest("Only CSV files are accepted.");
var extension = Path.GetExtension(file.FileName).ToLowerInvariant();
if (extension != ".csv" && extension != ".txt")
    return BadRequest("Only CSV files are accepted.");
$vbLabelText   $csharpLabel

此檢查可防止格式錯誤的二進位資料到達解析器,並向 API 用戶提供清晰的錯誤訊息。 您可以擴展此驗證,使用 file.ContentType 檢查 MIME 類型,以實現更嚴格的強制執行。

如何將CSV資料保存到資料庫?

將 CSV 檔案解析為類型化物件後,通常會將記錄持久化到資料庫中。 以下範例透過使用 Entity Framework Core 的 AddRangeAsync 進行批次插入來擴展服務層模式:

using IronXL;

public class CsvImportService
{
    private readonly AppDbContext _context;

    public CsvImportService(AppDbContext context)
    {
        _context = context;
    }

    public async Task<int> ImportProductsAsync(Stream csvStream)
    {
        WorkBook workbook = WorkBook.LoadCSV(csvStream);
        WorkSheet ws = workbook.DefaultWorkSheet;
        var products = new List<Product>();

        foreach (var row in ws.Rows.Skip(1))
        {
            products.Add(new Product
            {
                Id = row.Columns[0].IntValue,
                Name = row.Columns[1].StringValue,
                Price = row.Columns[2].DecimalValue,
                Quantity = row.Columns[3].IntValue
            });
        }

        await _context.Products.AddRangeAsync(products);
        return await _context.SaveChangesAsync();
    }
}
using IronXL;

public class CsvImportService
{
    private readonly AppDbContext _context;

    public CsvImportService(AppDbContext context)
    {
        _context = context;
    }

    public async Task<int> ImportProductsAsync(Stream csvStream)
    {
        WorkBook workbook = WorkBook.LoadCSV(csvStream);
        WorkSheet ws = workbook.DefaultWorkSheet;
        var products = new List<Product>();

        foreach (var row in ws.Rows.Skip(1))
        {
            products.Add(new Product
            {
                Id = row.Columns[0].IntValue,
                Name = row.Columns[1].StringValue,
                Price = row.Columns[2].DecimalValue,
                Quantity = row.Columns[3].IntValue
            });
        }

        await _context.Products.AddRangeAsync(products);
        return await _context.SaveChangesAsync();
    }
}
$vbLabelText   $csharpLabel

將服務整合到依賴注入中

Program.cs 中註冊 CsvImportService,以便控制器可以透過建構函數注入來請求它:

builder.Services.AddScoped<CsvImportService>();
builder.Services.AddScoped<CsvImportService>();
$vbLabelText   $csharpLabel

然後更新控制器建構函數,使其接受服務並呼叫 ImportProductsAsync,而不是內聯建置清單。這種分離可以保持控制器操作簡潔,並將資料存取邏輯移至可測試的服務類別中。 Entity Framework Core 將 AddRangeAsync 呼叫批次處理成每個批次的單一 INSERT 語句,這對於包含數千行的 CSV 檔案來說表現良好。

對於非常大的匯入(數萬行),請考慮使用EF Core 的批次擴充或原始 SQL 語句來減少與資料庫的往返次數。

如何使用IronXL將資料匯出回 CSV 檔案?

IronXL不僅限於讀取 CSV 文件,它還可以寫入 CSV 文件。 SaveAsCsv 方法可以將任何工作表匯出為 CSV 文件,這對於產生報告或將資料傳送到下游系統非常有用:

using IronXL;

WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLS);
WorkSheet ws = workbook.DefaultWorkSheet;

// Write headers
ws["A1"].Value = "Id";
ws["B1"].Value = "Name";
ws["C1"].Value = "Price";

// Write data rows
ws["A2"].Value = 1;
ws["B2"].Value = "Widget A";
ws["C2"].Value = 9.99;

ws["A3"].Value = 2;
ws["B3"].Value = "Widget B";
ws["C3"].Value = 14.49;

// Save as CSV
workbook.SaveAsCsv("export.csv");
Console.WriteLine("CSV export complete.");
using IronXL;

WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLS);
WorkSheet ws = workbook.DefaultWorkSheet;

// Write headers
ws["A1"].Value = "Id";
ws["B1"].Value = "Name";
ws["C1"].Value = "Price";

// Write data rows
ws["A2"].Value = 1;
ws["B2"].Value = "Widget A";
ws["C2"].Value = 9.99;

ws["A3"].Value = 2;
ws["B3"].Value = "Widget B";
ws["C3"].Value = 14.49;

// Save as CSV
workbook.SaveAsCsv("export.csv");
Console.WriteLine("CSV export complete.");
$vbLabelText   $csharpLabel

匯出的檔案預設使用逗號分隔符號。 對於歐洲地區常見的以分號分隔的文件,請使用明確分隔符號參數呼叫 SaveAsCsv("export.csv", ";")。 您也可以儲存到 MemoryStream,並使用 File(stream, "text/csv", "export.csv") 從 API 端點以檔案下載方式傳回結果。

有關匯出選項的完整參考,請造訪IronXL儲存和匯出文件

為什麼IronXL比手動解析 CSV 檔案更好?

手動解析 CSV 檔案看起來很簡單,直到你遇到一些特殊情況:例如,包含用引號括起來的逗號的值、嵌入在單元格中的換行符、轉義的引號以及 UTF-8 文件開頭的字節順序標記。 在自訂循環中正確處理所有這些需要大量的測試和持續的維護。

IronXL在內部解決了所有這些問題。 對比兩種方法,可以明顯看出它們的優點:

IronXL與手動 StreamReader 在 C# 中解析 CSV 檔案的比較
能力 IronXL 手動 StreamReader
自動分隔符號檢測 是的 否——必須手動配置
引用字段處理 內建 需要自訂邏輯
類型轉換(整數、十進制、日期時間) 內建配件 需要呼叫 Parse/TryParse 函數
多行單元格值 自動處理 難以正確實施
物料清單處理 自動的 需要 StreamReader 配置
Excel格式支援(XLSX、XLS) 相同的 API 需要單獨的庫
匯出為 CSV SaveAsCsv 方法 需要單獨的寫入邏輯

跨格式一致性

IronXL 的一個實際優勢是,相同的 WorkBook.Load 和工作表迭代模式適用於 XLSX、XLS、ODS 和 CSV 檔案。 如果您的應用程式需要接受使用者提供的多種電子表格格式,您可以在不變更解析邏輯的情況下切換格式。 將檔案流傳遞給 WorkBook.Load, IronXL會根據檔案簽章自動偵測格式。

這種跨格式 API 意味著您只需編寫和測試一條程式碼路徑,而無需為 CSV 和 Excel 分別維護單獨的實作。 有關支援的格式的完整列表,請參閱IronXL支援的檔案格式頁面。

大檔案的性能考慮因素

對於小於 100 MB 的 CSV 文件, IronXL無需任何調整即可運作良好。 對於較大的文件,請考慮以下策略:

  • 從路徑載入文件,而不是將其複製到 MemoryStream,以減少記憶體分配。
  • 將資料插入資料庫時,分批處理行,而不是在第一次插入之前收集所有記錄。
  • 使用 LINQ 避免將標題行物化為 ws.Rows.Skip(1) 物件。

IronXL效能指南涵蓋了針對大批量匯入場景的額外最佳化,包括平行處理和串流模式。

下一步計劃是什麼?

現在,您已經擁有了ASP.NET Core中 CSV 匯入每個階段的工作模式:安裝庫、從磁碟或上傳的流加載檔案、將行映射到類型化模型物件、使用 Entity Framework Core 將記錄持久化到資料庫,以及在需要時將資料匯出回 CSV。

在此基礎上,您可以探索以下資源:

如果您的專案中使用了IronXL ,除了 CSV 之外,添加對 XLSX 上傳的支援無需額外的程式碼變更——同一個 WorkBook.Load 呼叫即可處理兩者。 這種一致性意味著您可以隨著應用程式需求的成長,逐步擴展匯入端點的功能集。

常見問題解答

如何在 ASP.NET Core 應用程式中匯入 CSV 檔案?

您可以在 ASP.NET Core 應用程式中使用 IronXL 匯入 CSV 檔案,方法是處理檔案上傳、解析 CSV 資料,並將其映射至模型類別物件。IronXL 提供 API 以高效完成這些任務。

在 C# 中使用 IronXL 進行 CSV 匯入有哪些優勢?

IronXL 提供了一組 API,可簡化 CSV 檔案的匯入流程。它讓您能輕鬆解析資料、將資料映射至模型,並將記錄轉換為 JSON,使其成為資料驅動型應用的理想選擇。

IronXL 能否將 CSV 資料解析為模型類別物件?

是的,IronXL 能夠將 CSV 資料解析為模型類別物件,讓您能在 .NET 應用程式中高效地處理結構化資料。

在匯入 CSV 檔案時,IronXL 如何協助進行資料庫整合?

IronXL 透過解析 CSV 資料並將其映射至模型物件,協助您進行資料庫整合,這些物件可輕鬆插入或更新至您的資料庫中。

是否可以使用 IronXL 將 CSV 記錄轉換為 JSON 格式?

是的,透過 IronXL,您可以將 CSV 記錄轉換為 JSON 格式,這對於建立 Web API 或與前端應用程式整合非常有用。

除了 CSV 之外,IronXL 還能處理哪些檔案格式?

除了 CSV 之外,IronXL 還能處理各種 Excel 檔案格式,例如 XLSX、XLS 等,為不同的試算表需求提供多樣化的支援。

IronXL 是否支援大型 CSV 檔案匯入?

IronXL 旨在高效處理大型 CSV 檔案匯入,確保在資料驅動型應用程式中具備卓越的效能與可靠性。

Jordi Bardia
軟體工程師
Jordi 在 Python、C# 和 C++ 上最得心應手,當他不在 Iron Software 展現技術時,便在做遊戲編程。在分担產品测测试,產品開發和研究的责任時,Jordi 為持续的產品改進增值。他说这种多样化的经验使他受到挑战并保持参与, 而这也是他与 Iron Software 中工作一大乐趣。Jordi 在佛罗里达州迈阿密长大,曾在佛罗里达大学学习计算机科学和统计学。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me