跳至頁尾內容
USING IRONXL

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

實施電子表格匯出功能是企業網路應用程式的一個常見需求,但生成和傳送這些文件的手動過程常常帶來重大的技術複雜性。 開發人員必須經常處理MemoryStream管理的細微差別,並配置精確的 HTTP內容配置標頭,以確保瀏覽器行為的一致性並防止資料損壞。

本文將介紹使用IronXL程式庫在ASP .NET C# MVC控制器中建立和下載Excel文件所需的一切。 我們將介紹如何導出資料到真正的XLSX格式Excel文件、串流CSV文件、轉換上傳以重新導出,並將文件下載返回到瀏覽器,所有這些不需要安裝Microsoft Office或依賴Excel Interop。安裝IronXL NuGet套件開始免費試用以依循原始碼範例。

NuGet 使用NuGet安裝

PM >  Install-Package IronXL.Excel

查看在NuGet上的https://www.nuget.org/packages/IronXL.Excel,快速安裝。超過1000萬次下載,正在用C#轉變PDF開發。 您也可以下載DLL

如何從控制器建立並下載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()返回方法設置內容配置標頭為附件,這告訴瀏覽器下載文件而不是嘗試渲染它。 第三個參數控制該文件在使用者的下載對話框中出現的文件名。

這種公共IActionResult模式適用於.NET Framework和ASP.NET Core項目,非常適合需要導出資料到Excel的網路應用程式。

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

大多數現實場景涉及從資料表匯出資料,而非硬編碼的值。 模式保持不變,查詢資料、填入工作表並返回文件。以下是一個模擬從資料庫提取記錄並將其寫入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文件的輸出

在生產中,orders陣列將來自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 aCSVfile 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 toCSVstream 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 aCSVfile 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 toCSVstream 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文件非常適合資料交換,但它們會去除任何格式、公式和多工作表結構。 當您需要這些功能時,請通過ToStream()或ToXlsxStream()保持使用XLSX文件格式。 欲深入了解格式轉換,請參閱電子表格轉換指南

如何以不同格式重新導出上傳?

常見的網路應用程式情境是接受使用者上傳的文件,並以另一種格式導出,例如,將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 asXLSXregardless 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 asXLSXregardless 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.Http
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()生成一個新的現代XLSX格式MemoryStream,每個位元組結構正確。 這對於在進一步處理或儲存之前正規化使用者提交非常有用。

可以導出哪些文件格式?

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

|格式|文件擴展名|流方法|最佳使用情境| |---|---|---|---| |XLSX|.xlsx|ToXlsxStream()|具備格式和公式的現代Excel電子表格| |XLS|.xls|ToXlsStream()|舊系統相容性| |CSV|.csv|ToCsvStream()|資料庫導入、資料管線、輕量級導出| |XML|.xml|ToXmlStream()|企業系統整合| |JSON|.json|SaveAsJson()|Web API響應和資料交換| |HTML|.html|ExportToHtml()|網頁顯示電子表格資料|

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

無論目標是在XLSX格式下載文件以供業務分析師使用、為資料工程師導出CSV文件,還是生成XML以進行企業整合,IronXL保持程式碼清晰並提供可靠輸出,適用於.NET Core和.NET Framework應用程式。 準備好在您的下一個專案中發佈電子表格導出了嗎? 獲取免費試用授權探索授權選項 以立即開始。 有關逐步的設置說明,請參閱IronXL入門指南

常見問題

如何在ASP.NET Core中使用C#下載Excel文件?

您可以通過使用IronXL在ASP.NET Core中使用C#下載Excel文件。IronXL允許您直接從MVC控制器導出資料到各種格式,如XLSX、CSV和XML。可以有效管理這個過程使用MemoryStream和File()方法。

使用IronXL導出Excel文件的好處是什麼?

IronXL通過有效管理MemoryStream及配置HTTP內容描述標頭簡化了Excel文件的導出過程。它能確保瀏覽器行為一致,並防止資料損壞,非常適合企業Web應用。

IronXL可以導出資料到哪些文件格式?

IronXL可以導出資料到多種文件格式,包括XLSX、CSV和XML。這種多樣性幫助開發者無縫處理不同的資料導出需求。

IronXL在導出Excel文件時幫助克服了哪些技術挑戰?

IronXL幫助克服了MemoryStream管理和精確配置HTTP內容描述標頭的挑戰。這些功能確保導出的Excel文件能被瀏覽器正確處理,並防止資料損壞。

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

是的,IronXL可以用於從MVC控制器導出資料。它提供了一種簡單的方法輸出Excel格式資料,這使它成為ASP.NET Core Web應用的實用選擇。

IronXL如何改善Excel文件生成的過程?

IronXL通過自動化複雜的任務,如MemoryStream和HTTP標頭管理,改善了過程,使開發者能專注於核心功能而非技術細節。

Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

除了開發,Curtis對物聯網(IoT)有濃厚的興趣,探索創新的方法來整合硬體和軟體。在空閒時間,他喜歡玩遊戲和建立Discord機器人,結合他對技術的熱愛與創造力。

Iron 支援團隊

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