跳過到頁腳內容
使用 IRONXL

在 ASP.NET C# 中下載 Excel 檔案:將資料匯出為 XLSX、CSV 等格式

對於企業級 Web 應用程式而言,實作電子表格匯出功能是一個常見的需求,然而手動產生和交付這些文件的過程往往會引入相當大的技術複雜性。 開發人員必須經常了解 MemoryStream 管理的細微差別,並配置精確的 HTTP 內容處置標頭,以確保瀏覽器行為的一致性並防止資料損壞。

本文將介紹如何使用IronXL函式庫在 ASP.NET C# MVC 控制器中建立和下載 Excel 檔案。 我們將介紹如何將資料匯出為 XLSX 格式的 Excel 檔案、如何串流 CSV 檔案、如何轉換上傳檔案以便重新匯出,以及如何將下載的檔案傳回瀏覽器,所有這些操作都無需安裝 Microsoft Office 或依賴 Excel Interop。安裝IronXL NuGet 套件開始免費試用,即可跟隨原始碼範例學習。

!{--010011000100100101000010010100100100000101010010010110010101111101001110010101010101010101010101010101010101010 0100010111110100100101001101010100010000010100110001001100010111110100001001001100010011110010101010

如何從控制器建立和下載 Excel 檔案?

在 ASP.NET Core 場景中,任何下載 Excel 檔案的核心模式都包含三個步驟:建立工作簿、將其寫入流,並將流程作為檔案回應傳回。 以下程式碼展示了一個完整的 MVC 控制器操作,該操作從頭開始建立 XLSX 檔案並將其推送到瀏覽器。

using IronXL;
using Microsoft.AspNetCore.Mvc;
public class ReportController : Controller
{
    // Export employee data as a downloadable Excel file
    public IActionResult DownloadExcel()
    {
        // Create a new workbook and worksheet
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var worksheet = workbook.CreateWorkSheet("Employees");
        // Add header row with column names
        worksheet["A1"].Value = "Name";
        worksheet["B1"].Value = "Department";
        worksheet["C1"].Value = "Salary";
        // Populate cells with data values
        worksheet["A2"].Value = "Alice Torres";
        worksheet["B2"].Value = "Engineering";
        worksheet["C2"].Value = 95000;
        worksheet["A3"].Value = "James Park";
        worksheet["B3"].Value = "Marketing";
        worksheet["C3"].Value = 78000;
        // Export workbook to a MemoryStream for download
        var stream = workbook.ToStream();
        string filename = "Employees.xlsx";
        var content = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        // Return file to the browser with content disposition attachment
        return File(stream, content, filename);
    }
}
using IronXL;
using Microsoft.AspNetCore.Mvc;
public class ReportController : Controller
{
    // Export employee data as a downloadable Excel file
    public IActionResult DownloadExcel()
    {
        // Create a new workbook and worksheet
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var worksheet = workbook.CreateWorkSheet("Employees");
        // Add header row with column names
        worksheet["A1"].Value = "Name";
        worksheet["B1"].Value = "Department";
        worksheet["C1"].Value = "Salary";
        // Populate cells with data values
        worksheet["A2"].Value = "Alice Torres";
        worksheet["B2"].Value = "Engineering";
        worksheet["C2"].Value = 95000;
        worksheet["A3"].Value = "James Park";
        worksheet["B3"].Value = "Marketing";
        worksheet["C3"].Value = 78000;
        // Export workbook to a MemoryStream for download
        var stream = workbook.ToStream();
        string filename = "Employees.xlsx";
        var content = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        // Return file to the browser with content disposition attachment
        return File(stream, content, filename);
    }
}
Imports IronXL
Imports Microsoft.AspNetCore.Mvc

Public Class ReportController
    Inherits Controller

    ' Export employee data as a downloadable Excel file
    Public Function DownloadExcel() As IActionResult
        ' Create a new workbook and worksheet
        Dim workbook = WorkBook.Create(ExcelFileFormat.XLSX)
        Dim worksheet = workbook.CreateWorkSheet("Employees")
        ' Add header row with column names
        worksheet("A1").Value = "Name"
        worksheet("B1").Value = "Department"
        worksheet("C1").Value = "Salary"
        ' Populate cells with data values
        worksheet("A2").Value = "Alice Torres"
        worksheet("B2").Value = "Engineering"
        worksheet("C2").Value = 95000
        worksheet("A3").Value = "James Park"
        worksheet("B3").Value = "Marketing"
        worksheet("C3").Value = 78000
        ' Export workbook to a MemoryStream for download
        Dim stream = workbook.ToStream()
        Dim filename As String = "Employees.xlsx"
        Dim content = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
        ' Return file to the browser with content disposition attachment
        Return File(stream, content, filename)
    End Function
End Class
$vbLabelText   $csharpLabel

輸出 Excel 文件

在 ASP.NET C# 中下載 Excel 檔案:將資料匯出為 XLSX、CSV 等格式:圖 1 - 在 ASP.NET C# 中下載 Excel 檔案的範例輸出

WorkBook.Create 方法產生一個新的 Excel 文檔,而 CreateWorkSheet 方法會向其中新增第一個工作表。 在以值填入儲存格後, ToStream方法會將整個工作簿轉換為 MemoryStream,不會在磁碟上建立臨時檔案。 控制器上的 File() 傳回方法會將內容處置標頭設為 attachment,這告訴瀏覽器下載檔案而不是嘗試渲染它。 第三個參數控製檔名在使用者下載對話方塊中的顯示方式。

這種公共 IActionResult 模式在 .NET Framework 和 ASP.NET Core 專案中都適用,因此對於需要將資料匯出到 Excel 的Web 應用程式來說,它是首選方法。

如何將資料庫資料匯出為可下載的電子表格?

大多數實際應用場景都涉及從資料庫表中匯出數據,而不是硬編碼的值。 流程相同:查詢資料、填入工作表、返回文件。以下範例模擬從資料庫中提取記錄並將其寫入 Excel 文件。

using IronXL;
using Microsoft.AspNetCore.Mvc;
public class DataExportController : Controller
{
    // Export database records to an xlsx file for download
    public IActionResult ExportDatabaseReport()
    {
        // Simulate a database query returning order records
        var orders = new[]
        {
            new { OrderId = 1001, Customer = "Acme Corp", Total = 4500.00m },
            new { OrderId = 1002, Customer = "Globex Inc", Total = 12300.50m },
            new { OrderId = 1003, Customer = "Initech LLC", Total = 890.75m },
        };
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var worksheet = workbook.CreateWorkSheet("Orders");
        // Write headers
        worksheet["A1"].Value = "Order ID";
        worksheet["B1"].Value = "Customer";
        worksheet["C1"].Value = "Total";
        // Write each row of data from the query results
        for (int i = 0; i < orders.Length; i++)
        {
            int row = i + 2;
            worksheet[$"A{row}"].Value = orders[i].OrderId;
            worksheet[$"B{row}"].Value = orders[i].Customer;
            worksheet[$"C{row}"].Value = orders[i].Total;
        }
        var stream = workbook.ToStream();
        string filename = $"OrderReport-{DateTime.Now:yyyyMMdd}.xlsx";
        return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename);
    }
}
using IronXL;
using Microsoft.AspNetCore.Mvc;
public class DataExportController : Controller
{
    // Export database records to an xlsx file for download
    public IActionResult ExportDatabaseReport()
    {
        // Simulate a database query returning order records
        var orders = new[]
        {
            new { OrderId = 1001, Customer = "Acme Corp", Total = 4500.00m },
            new { OrderId = 1002, Customer = "Globex Inc", Total = 12300.50m },
            new { OrderId = 1003, Customer = "Initech LLC", Total = 890.75m },
        };
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var worksheet = workbook.CreateWorkSheet("Orders");
        // Write headers
        worksheet["A1"].Value = "Order ID";
        worksheet["B1"].Value = "Customer";
        worksheet["C1"].Value = "Total";
        // Write each row of data from the query results
        for (int i = 0; i < orders.Length; i++)
        {
            int row = i + 2;
            worksheet[$"A{row}"].Value = orders[i].OrderId;
            worksheet[$"B{row}"].Value = orders[i].Customer;
            worksheet[$"C{row}"].Value = orders[i].Total;
        }
        var stream = workbook.ToStream();
        string filename = $"OrderReport-{DateTime.Now:yyyyMMdd}.xlsx";
        return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename);
    }
}
Imports IronXL
Imports Microsoft.AspNetCore.Mvc

Public Class DataExportController
    Inherits Controller

    ' Export database records to an xlsx file for download
    Public Function ExportDatabaseReport() As IActionResult
        ' Simulate a database query returning order records
        Dim orders = New() {
            New With {.OrderId = 1001, .Customer = "Acme Corp", .Total = 4500.0D},
            New With {.OrderId = 1002, .Customer = "Globex Inc", .Total = 12300.5D},
            New With {.OrderId = 1003, .Customer = "Initech LLC", .Total = 890.75D}
        }
        Dim workbook = WorkBook.Create(ExcelFileFormat.XLSX)
        Dim worksheet = workbook.CreateWorkSheet("Orders")
        ' Write headers
        worksheet("A1").Value = "Order ID"
        worksheet("B1").Value = "Customer"
        worksheet("C1").Value = "Total"
        ' Write each row of data from the query results
        For i As Integer = 0 To orders.Length - 1
            Dim row As Integer = i + 2
            worksheet($"A{row}").Value = orders(i).OrderId
            worksheet($"B{row}").Value = orders(i).Customer
            worksheet($"C{row}").Value = orders(i).Total
        Next
        Dim stream = workbook.ToStream()
        Dim filename As String = $"OrderReport-{DateTime.Now:yyyyMMdd}.xlsx"
        Return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename)
    End Function
End Class
$vbLabelText   $csharpLabel

輸出

在 ASP.NET C# 中下載 Excel 檔案:將資料匯出為 XLSX、CSV 等格式:圖 2 - 將資料庫資料匯出到 Excel 檔案的輸出範例

在生產環境中,訂單數組將來自 Entity Framework Core 查詢、 Dapper呼叫或任何透過連接字串連接到資料庫的資料存取層。 循環遍歷結果,並將每個值寫入工作表中的正確儲存格。 請注意字串檔案名稱中包含日期戳,這個小細節可以避免用戶重複下載檔案時出現麻煩。

IronXL 的單元格尋址系統(worksheet[$"A{row}"])保持了內容的可讀性,而WorkBook API則在內部處理了構建有效 XLSX 檔案的所有繁重工作。 對於涉及公式、樣式或多工作表工作簿的更複雜場景,同樣的方法也能很好地擴展。

如何將資料下載為 CSV 檔案而不是 XLSX 檔案?

有時,輕量級的 CSV 檔案是更好的選擇,尤其是在將資料匯入其他系統、資料庫或工具時,這些系統、資料庫或工具並不需要 Excel 檔案那樣豐富的功能。 IronXL 讓格式切換變得輕而易舉。

using IronXL;
using Microsoft.AspNetCore.Mvc;
public class CsvController : Controller
{
    // Export data as a CSV file download
    public IActionResult ExportCsv()
    {
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var worksheet = workbook.CreateWorkSheet("Products");
        worksheet["A1"].Value = "SKU";
        worksheet["B1"].Value = "Product";
        worksheet["C1"].Value = "Price";
        worksheet["A2"].Value = "WDG-001";
        worksheet["B2"].Value = "Widget Pro";
        worksheet["C2"].Value = 29.99;
        // Convert to CSV stream instead of XLSX
        var stream = workbook.ToCsvStream();
        string filename = "Products.csv";
        return File(stream, "text/csv", filename);
    }
}
using IronXL;
using Microsoft.AspNetCore.Mvc;
public class CsvController : Controller
{
    // Export data as a CSV file download
    public IActionResult ExportCsv()
    {
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var worksheet = workbook.CreateWorkSheet("Products");
        worksheet["A1"].Value = "SKU";
        worksheet["B1"].Value = "Product";
        worksheet["C1"].Value = "Price";
        worksheet["A2"].Value = "WDG-001";
        worksheet["B2"].Value = "Widget Pro";
        worksheet["C2"].Value = 29.99;
        // Convert to CSV stream instead of XLSX
        var stream = workbook.ToCsvStream();
        string filename = "Products.csv";
        return File(stream, "text/csv", filename);
    }
}
Imports IronXL
Imports Microsoft.AspNetCore.Mvc

Public Class CsvController
    Inherits Controller

    ' Export data as a CSV file download
    Public Function ExportCsv() As IActionResult
        Dim workbook = WorkBook.Create(ExcelFileFormat.XLSX)
        Dim worksheet = workbook.CreateWorkSheet("Products")
        worksheet("A1").Value = "SKU"
        worksheet("B1").Value = "Product"
        worksheet("C1").Value = "Price"
        worksheet("A2").Value = "WDG-001"
        worksheet("B2").Value = "Widget Pro"
        worksheet("C2").Value = 29.99
        ' Convert to CSV stream instead of XLSX
        Dim stream = workbook.ToCsvStream()
        Dim filename As String = "Products.csv"
        Return File(stream, "text/csv", filename)
    End Function
End Class
$vbLabelText   $csharpLabel

輸出 CSV 檔案

在 ASP.NET C# 中下載 Excel 檔案:將資料匯出為 XLSX、CSV 等格式:圖 3 - 資料下載為 CSV 檔案而非 Excel 文件

ToCsvStream 方法將第一個工作表匯出為 CSV 格式的MemoryStream 。 CSV 檔案非常適合資料交換,但它們會移除所有格式、公式和多工作表結構。 當您需要這些功能時,請使用 XLSX 檔案格式,並透過 ToStream() 或 ToXlsxStream() 進行轉換。 若要深入了解格式轉換,請參閱電子表格轉換指南

如何將上傳的文件重新匯出為其他格式?

常見的 Web 應用程式場景包括接受使用者上傳的文件並將其匯出為另一種格式,例如將 XLS 上傳文件轉換為 XLSX 文件,或從最初以舊格式儲存的工作簿產生 CSV 檔案。

public IActionResult ConvertUpload(IFormFile upload)
{
    using var memoryStream = new MemoryStream();
    upload.CopyTo(memoryStream);
    memoryStream.Position = 0;
    // Load uploaded Excel file from the stream
    var workbook = WorkBook.Load(memoryStream);
    // Re-export as XLSX regardless of the original file extension or file type
    var stream = workbook.ToXlsxStream();
    string filename = Path.GetFileNameWithoutExtension(upload.FileName) + ".xlsx";
    return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename);
}
public IActionResult ConvertUpload(IFormFile upload)
{
    using var memoryStream = new MemoryStream();
    upload.CopyTo(memoryStream);
    memoryStream.Position = 0;
    // Load uploaded Excel file from the stream
    var workbook = WorkBook.Load(memoryStream);
    // Re-export as XLSX regardless of the original file extension or file type
    var stream = workbook.ToXlsxStream();
    string filename = Path.GetFileNameWithoutExtension(upload.FileName) + ".xlsx";
    return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename);
}
Imports Microsoft.AspNetCore.Mvc
Imports System.IO

Public Function ConvertUpload(upload As IFormFile) As IActionResult
    Using memoryStream As New MemoryStream()
        upload.CopyTo(memoryStream)
        memoryStream.Position = 0
        ' Load uploaded Excel file from the stream
        Dim workbook = WorkBook.Load(memoryStream)
        ' Re-export as XLSX regardless of the original file extension or file type
        Dim stream = workbook.ToXlsxStream()
        Dim filename As String = Path.GetFileNameWithoutExtension(upload.FileName) & ".xlsx"
        Return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename)
    End Using
End Function
$vbLabelText   $csharpLabel

輸出:將 CSV 轉換為 XLSX 格式

在 ASP.NET C# 中下載 Excel 檔案:將資料匯出為 XLSX、CSV 等格式:圖 4 - 將 CSV 檔案轉換為 XLSX 格式的範例輸出

WorkBook.Load方法接受 MemoryStream 類型參數,因此無需先將上傳的檔案儲存到磁碟。它會自動偵測來源檔案是 XLS、XLSX 還是 CSV 文件,並進行相應的解析。 從那裡,ToXlsxStream() 產生一個乾淨的新 MemoryStream,採用現代 XLSX 格式,每個位元組都結構正確。 這有助於在進一步處理或儲存之前對用戶提交的內容進行標準化處理。

支援匯出哪些文件格式?

IronXL 支援將資料匯出為多種電子表格和資料交換格式。 下表總結了可用的輸出選項及其最佳用途。

| 格式 | 檔案副檔名 | 流方法 | 最佳用例 | |---|---|---|---| | XLSX | .xlsx | ToXlsxStream() | 具有格式和公式的現代Excel電子表格 | | XLS | .xls | ToXlsStream() | 舊系統相容性 | | CSV | .csv | ToCsvStream() | 資料庫匯入、資料管道、輕量級匯出 | | XML | .xml | ToXmlStream() | 企業系統集成 | | JSON | .json | SaveAsJson() | Web API 回應和資料交換 | | HTML | .html | ExportToHtml() | 網頁上顯示電子表格數據 |

每個流方法都會傳回一個 MemoryStream,該 MemoryStream 可以直接插入 ASP.NET Core 的 File() 傳回輔助函數。 在某些情況下,例如儲存到 blob 資料庫或附加到電子郵件回應流時,byte[] 更方便,也可以使用位元組陣列替代方案 (ToByteArray())。 安裝 IronXL NuGet 套件後,所有這些方法都可以立即使用。 有關每種匯出格式的完整說明,請參閱匯出至 Excel 文件

無論目標是為業務分析師下載 XLSX 格式的文件,為資料工程師匯出 CSV 文件,還是為企業整合產生 XML,IronXL 都能在 .NET Core 和 .NET Framework 應用程式中保持程式碼的簡潔性和輸出的可靠性。 準備好在下一個專案中匯出電子表格檔案了嗎? 立即取得免費試用許可證了解授權選項,開始使用。 有關逐步設定說明,請參閱IronXL 入門指南

常見問題解答

如何在 .NET Core 中使用 C# 下載 Excel 檔案?

您可以透過 IronXL,使用 C# 在 ASP.NET Core 中下載 Excel 檔案。IronXL 允許您直接從 MVC 控制器將資料匯出為 XLSX、CSV 和 XML 等多種格式。這可透過 MemoryStream 和 File() 方法進行高效管理。

使用 IronXL 匯出 Excel 檔案有哪些好處?

IronXL 透過有效管理 MemoryStream 並設定 HTTP content-disposition 標頭,簡化了 Excel 檔案的匯出流程。它能確保瀏覽器行為的一致性並防止資料損毀,因此非常適合用於 Enterprise 網頁應用程式。

IronXL 能匯出資料到哪些文件格式?

IronXL 可將資料匯出為多種檔案格式,包括 XLSX、CSV 和 XML。這種多樣性有助於開發人員無縫處理各種資料匯出需求。

在匯出 Excel 檔案時,IronXL 能協助克服哪些技術挑戰?

IronXL 有助於克服諸如 MemoryStream 管理以及精確設定 HTTP Content-Disposition 標頭等挑戰。這些功能可確保瀏覽器能正確處理匯出的 Excel 檔案,並防止資料損毀。

IronXL 可用於從 MVC 控制器匯出資料嗎?

是的,IronXL 可用於從 MVC 控制器匯出資料。它提供了一種簡便的方式來輸出 Excel 格式的資料,使其成為 ASP.NET Core 網頁應用的實用選擇。

IronXL 如何改善 Excel 檔案的生成流程?

IronXL 透過自動化處理 MemoryStream 和 HTTP 標頭管理等複雜任務來優化流程,讓開發人員能專注於核心功能,而非技術細節。

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

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我