在 ASP.NET C# 中下載 Excel 檔案:將資料匯出為 XLSX、CSV 等格式
實施電子表格匯出功能是企業網路應用程式的一個常見需求,但生成和傳送這些文件的手動過程常常帶來重大的技術複雜性。 開發人員必須經常處理MemoryStream管理的細微差別,並配置精確的 HTTP內容配置標頭,以確保瀏覽器行為的一致性並防止資料損壞。
本文將介紹使用IronXL程式庫在ASP .NET C# MVC控制器中建立和下載Excel文件所需的一切。 我們將介紹如何導出資料到真正的XLSX格式Excel文件、串流CSV文件、轉換上傳以重新導出,並將文件下載返回到瀏覽器,所有這些不需要安裝Microsoft Office或依賴Excel Interop。安裝IronXL NuGet套件並開始免費試用以依循原始碼範例。
如何從控制器建立並下載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
輸出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
輸出

在生產中,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
輸出CSV文件

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
輸出:將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標頭管理,改善了過程,使開發者能專注於核心功能而非技術細節。




