使用 IRONXL C# DataGridView 匯出至 Excel:完整格式設定指南 | IronXL Jordi Bardia 更新:2026年3月1日 下載 IronXL NuGet 下載 DLL 下載 開始免費試用 LLM副本 LLM副本 將頁面複製為 Markdown 格式,用於 LLMs 在 ChatGPT 中打開 請向 ChatGPT 諮詢此頁面 在雙子座打開 請向 Gemini 詢問此頁面 在 Grok 中打開 向 Grok 詢問此頁面 打開困惑 向 Perplexity 詢問有關此頁面的信息 分享 在 Facebook 上分享 分享到 X(Twitter) 在 LinkedIn 上分享 複製連結 電子郵件文章 將 DataGridView 資料匯出至 Excel 檔案是 Windows Forms 開發中最常見的任務之一。 在建立顯示表格資料的商業應用程式(無論是銷售報表、庫存記錄或客戶清單)時,使用者希望點擊一個按鈕,就能收到一個格式正確的 Excel 文件,以便他們可以分享或進一步分析。 挑戰在於如何乾淨俐落地完成這項工作,既不依賴在每個最終用戶的電腦上安裝 Microsoft Excel,也不與會洩漏記憶體或靜默崩潰的 COM 互通清理程式碼作鬥爭。 本指南將引導您完成使用IronXL將 DataGridView 匯出至 Excel 的 C# 完整流程,涵蓋從專案設定到進階儲存格格式設定的所有步驟,最終產生可用於生產環境的程式碼。 立即開始在您的項目中使用 IronXL 並免費試用。 第一步: 免費啟動 如何設定用於匯出 DataGridView 的 Windows 窗體專案? 傳統的匯出資料的方法依賴 Microsoft Interop——您需要打開"添加引用",導航到 COM 選項卡,選擇 Microsoft Excel 物件庫,並編寫脆弱的程式碼來呼叫 Marshal.ReleaseComObject 以避免記憶體洩漏。 此模式要求在執行該應用程式的每台電腦上安裝 Microsoft Excel,處理大型資料集時效能緩慢,並且在缺少 Office 授權的部署環境中經常產生 COMException 錯誤。 微軟本身關於 Office 自動化的指南明確建議在伺服器端和自動化場景中使用第三方程式庫。 IronXL移除了所有這些依賴項。 這是一個純.NET庫,無需 Microsoft Office 或任何 COM 註冊即可讀取和寫入 .csv 和 .ods 文件。 您可以透過NuGet安裝它,然後立即開始編寫程式碼。 透過NuGet安裝IronXL 首先在 Visual Studio 中建立一個面向.NET 10 的新 Windows 窗體應用程式專案。在窗體表面新增一個 DataGridView 控制項和一個 Button 控制項。 將按鈕命名為 btnExport,並為其新增標籤"匯出至 Excel"。 然後開啟NuGet套件管理器控制台並執行: Install-Package IronXl.Excel Install-Package IronXl.Excel SHELL 在表單檔案的頂部新增所需的命名空間: using IronXL; using System.Data; using IronXL; using System.Data; $vbLabelText $csharpLabel 這兩個命名空間涵蓋了讀取和寫入 Excel 工作簿所需的所有IronXL類型,以及用於處理連接您的 System.Data 物件和 DataTable 匯出管道的標準 DataGridView 類型。 如何將範例資料載入到 DataGridView 控制項中? 在建立匯出邏輯之前,請用代表性資料填充您的 DataGridView。 Form1_Load 事件是綁定 DataTable 作為資料來源的正確位置。 在實際應用中,你會查詢資料庫或呼叫服務;這裡硬編碼的 DataTable 清楚地說明了結構。 Microsoft Docs 上的 DataGridView 控制項概述提供了有關該控制項如何管理資料來源的更多上下文資訊。 將 DataTable 綁定到 DataGridView void Form1_Load(object sender, EventArgs e) { DataTable dt = new DataTable(); dt.Columns.Add("ProductID", typeof(int)); dt.Columns.Add("ProductName", typeof(string)); dt.Columns.Add("Price", typeof(decimal)); dt.Columns.Add("Stock", typeof(int)); dt.Rows.Add(1, "Laptop", 999.99m, 50); dt.Rows.Add(2, "Mouse", 29.99m, 200); dt.Rows.Add(3, "Keyboard", 79.99m, 150); dt.Rows.Add(4, "Monitor", 349.99m, 75); dt.Rows.Add(5, "Webcam", 89.99m, 120); dataGridView1.DataSource = dt; } void Form1_Load(object sender, EventArgs e) { DataTable dt = new DataTable(); dt.Columns.Add("ProductID", typeof(int)); dt.Columns.Add("ProductName", typeof(string)); dt.Columns.Add("Price", typeof(decimal)); dt.Columns.Add("Stock", typeof(int)); dt.Rows.Add(1, "Laptop", 999.99m, 50); dt.Rows.Add(2, "Mouse", 29.99m, 200); dt.Rows.Add(3, "Keyboard", 79.99m, 150); dt.Rows.Add(4, "Monitor", 349.99m, 75); dt.Rows.Add(5, "Webcam", 89.99m, 120); dataGridView1.DataSource = dt; } $vbLabelText $csharpLabel 此程式碼使用頂級語句風格的事件處理程序簽署。 DataTable 有四列類型—整數、字串、十進位和整數IronXL在寫入 Excel 工作簿時會保留這些類型。 類型化的列很重要,因為IronXL將數值列寫入數值單元格而不是文本,這使得用戶無需重新格式化即可在 Excel 中對值進行排序和求和。 DataGridView 根據 DataTable 列名自動渲染列標題行。 匯出時,您希望在 Excel 文件中保留標題行,這意味著您的匯出程式碼必須將標題與資料行分開處理——下一節將詳細介紹這一點。 對於生產環境,無論 DataTable 來自 Entity Framework、Dapper、 .NET或任何其他資料存取層,都適用相同的模式。 DataGridView 綁定與導出程式碼解耦,因此您可以切換資料來源而無需修改導出邏輯。 如何將DataGridView資料匯出到Excel檔案? 核心導出邏輯在按鈕點擊事件處理程序中運行。 IronXL在 LoadFromDataTable 上提供了一個 WorkSheet 方法,可以自動處理列到儲存格的對應。 最簡潔的方法是從 DataGridView 中提取 DataTable 並直接傳遞。 Open XML SDK 是 .xlsx 格式的基礎,微軟對此進行了文件說明,並證實了為什麼像IronXL這樣的純.NET解決方案在程式化產生方面比 Interop 更勝一籌。 按鈕點擊匯出處理程序 void btnExport_Click(object sender, EventArgs e) { try { DataTable dt = new DataTable(); foreach (DataGridViewColumn column in dataGridView1.Columns) dt.Columns.Add(column.HeaderText); foreach (DataGridViewRow row in dataGridView1.Rows) { if (row.IsNewRow) continue; DataRow dataRow = dt.NewRow(); for (int i = 0; i < dataGridView1.Columns.Count; i++) dataRow[i] = row.Cells[i].Value ?? DBNull.Value; dt.Rows.Add(dataRow); } WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX); WorkSheet worksheet = workbook.DefaultWorkSheet; worksheet.Name = "Product Data"; worksheet.LoadFromDataTable(dt, true); string outputPath = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "DataGridViewExport.xlsx" ); workbook.SaveAs(outputPath); MessageBox.Show($"Exported successfully to:\n{outputPath}", "Export Complete", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { MessageBox.Show($"Export failed: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } void btnExport_Click(object sender, EventArgs e) { try { DataTable dt = new DataTable(); foreach (DataGridViewColumn column in dataGridView1.Columns) dt.Columns.Add(column.HeaderText); foreach (DataGridViewRow row in dataGridView1.Rows) { if (row.IsNewRow) continue; DataRow dataRow = dt.NewRow(); for (int i = 0; i < dataGridView1.Columns.Count; i++) dataRow[i] = row.Cells[i].Value ?? DBNull.Value; dt.Rows.Add(dataRow); } WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX); WorkSheet worksheet = workbook.DefaultWorkSheet; worksheet.Name = "Product Data"; worksheet.LoadFromDataTable(dt, true); string outputPath = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "DataGridViewExport.xlsx" ); workbook.SaveAs(outputPath); MessageBox.Show($"Exported successfully to:\n{outputPath}", "Export Complete", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { MessageBox.Show($"Export failed: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } $vbLabelText $csharpLabel LoadFromDataTable(dt, true) 呼叫接受 DataTable 和一個布林標誌,該標誌告訴IronXL將列名寫入 Excel 的第一行-這些列名將成為你的標題單元格。 工作簿使用 Environment.SpecialFolder.Desktop 而不是硬編碼路徑保存到使用者的桌面,這使得程式碼可以在使用者帳戶之間移植。 null 檢查(?? 當儲存格不包含值時,會拋出 DBNull.Value) prevents a NullReferenceException 例外。 這對於現實世界的資料來說很重要,因為可選欄位可能為空。 IronXL將DBNull` 寫入空單元格,而不是字串"DBNull",因此輸出保持乾淨。 有關將資料從 Excel 文件讀回 DataGridView 的更多詳細信息,請參閱IronXL DataTable 文檔,其中涵蓋了反向操作以及如何將 Excel 轉換為多工作表工作簿的 DataSet 。 如何將專業格式套用至匯出的Excel檔案? Excel 檔案中的純資料雖然功能齊全,但專業格式的輸出(粗體標題、與內容相符的列寬、交替的行背景顏色)決定了使用者信任的工具和他們匯出後立即手動重新格式化的工具之間的區別。 IronXL公開了豐富的儲存格樣式 API ,涵蓋字型、顏色、邊框、數位格式和對齊方式。 OOXML 電子表格樣式規格定義了IronXL寫入的底層格式,讓您確信輸出可以在任何相容的應用程式中正確開啟。 套用標題樣式和交替行顏色 void ExportWithFormatting(object sender, EventArgs e) { WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX); WorkSheet worksheet = workbook.DefaultWorkSheet; worksheet.Name = "Formatted Export"; string[] headers = { "ID", "Product Name", "Price", "Stock" }; // Write and style header row for (int col = 0; col < headers.Length; col++) { char colLetter = (char)('A' + col); string cellAddress = $"{colLetter}1"; worksheet.SetCellValue(0, col, headers[col]); worksheet[cellAddress].Style.Font.Bold = true; worksheet[cellAddress].Style.Font.Height = 12; worksheet[cellAddress].Style.SetBackgroundColor("#4472C4"); worksheet[cellAddress].Style.Font.Color = "#FFFFFF"; worksheet[cellAddress].Style.HorizontalAlignment = IronXl.Styles.HorizontalAlignment.Center; } // Write data rows with alternating background colors int rowIndex = 1; foreach (DataGridViewRow row in dataGridView1.Rows) { if (row.IsNewRow) continue; for (int col = 0; col < dataGridView1.Columns.Count; col++) { worksheet.SetCellValue(rowIndex, col, row.Cells[col].Value?.ToString() ?? string.Empty); } if (rowIndex % 2 == 0) { string rangeAddress = $"A{rowIndex + 1}:D{rowIndex + 1}"; worksheet[rangeAddress].Style.SetBackgroundColor("#D6DCE5"); } rowIndex++; } // Format the Price column as currency worksheet["C2:C100"].Style.Format = "$#,##0.00"; // Auto-fit column widths worksheet.AutoSizeColumn(0); worksheet.AutoSizeColumn(1); worksheet.AutoSizeColumn(2); worksheet.AutoSizeColumn(3); string outputPath = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "FormattedExport.xlsx" ); workbook.SaveAs(outputPath); MessageBox.Show("Formatted export complete.", "Done", MessageBoxButtons.OK, MessageBoxIcon.Information); } void ExportWithFormatting(object sender, EventArgs e) { WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX); WorkSheet worksheet = workbook.DefaultWorkSheet; worksheet.Name = "Formatted Export"; string[] headers = { "ID", "Product Name", "Price", "Stock" }; // Write and style header row for (int col = 0; col < headers.Length; col++) { char colLetter = (char)('A' + col); string cellAddress = $"{colLetter}1"; worksheet.SetCellValue(0, col, headers[col]); worksheet[cellAddress].Style.Font.Bold = true; worksheet[cellAddress].Style.Font.Height = 12; worksheet[cellAddress].Style.SetBackgroundColor("#4472C4"); worksheet[cellAddress].Style.Font.Color = "#FFFFFF"; worksheet[cellAddress].Style.HorizontalAlignment = IronXl.Styles.HorizontalAlignment.Center; } // Write data rows with alternating background colors int rowIndex = 1; foreach (DataGridViewRow row in dataGridView1.Rows) { if (row.IsNewRow) continue; for (int col = 0; col < dataGridView1.Columns.Count; col++) { worksheet.SetCellValue(rowIndex, col, row.Cells[col].Value?.ToString() ?? string.Empty); } if (rowIndex % 2 == 0) { string rangeAddress = $"A{rowIndex + 1}:D{rowIndex + 1}"; worksheet[rangeAddress].Style.SetBackgroundColor("#D6DCE5"); } rowIndex++; } // Format the Price column as currency worksheet["C2:C100"].Style.Format = "$#,##0.00"; // Auto-fit column widths worksheet.AutoSizeColumn(0); worksheet.AutoSizeColumn(1); worksheet.AutoSizeColumn(2); worksheet.AutoSizeColumn(3); string outputPath = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "FormattedExport.xlsx" ); workbook.SaveAs(outputPath); MessageBox.Show("Formatted export complete.", "Done", MessageBoxButtons.OK, MessageBoxIcon.Information); } $vbLabelText $csharpLabel 格式化程式碼應用了多種技術。 標題行採用藍色背景(#4472C4),白色文本,12 號粗體字體,居中對齊——這是標準的商務電子表格樣式。 資料行每隔偶數行交替顯示白色和淺灰色(#D6DCE5),這樣使用者更容易在寬表格中閱讀而不會遺失位置。 "價格"欄位使用 Excel 內建的貨幣格式 ($#,##0.00),因此電子表格中的數值會以美元符號和兩位小數顯示,而不會變更底層數值資料。 AutoSizeColumn 將每一列調整到最長值,因此不會截斷任何內容。 您可以使用儲存格邊框樣式、條件格式和資料驗證規則進一步擴充此模式。 對於必須符合公司範本的報告,您還可以設定頁面佈局和列印區域,以便匯出的文件無需調整即可列印。 如何處理大型資料集和效能調優? 當 DataGridView 綁定到數千行時,逐個單元格迭代會變得明顯變慢。 兩項優化措施顯著提升了效能。 首先,使用 LoadFromDataTable 而不是每個單元格的 SetCellValue 呼叫。 其次,如果您的資料來源是 DataTable,請直接將其傳遞給IronXL,而不是透過 DataGridView 行提取值: void ExportLargeDataset(DataTable sourceTable) { WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX); WorkSheet worksheet = workbook.DefaultWorkSheet; // Direct DataTable load -- fastest path for large data worksheet.LoadFromDataTable(sourceTable, true); // Apply header styling after load int colCount = sourceTable.Columns.Count; for (int col = 0; col < colCount; col++) { char colLetter = (char)('A' + col); worksheet[$"{colLetter}1"].Style.Font.Bold = true; worksheet[$"{colLetter}1"].Style.SetBackgroundColor("#4472C4"); worksheet[$"{colLetter}1"].Style.Font.Color = "#FFFFFF"; } workbook.SaveAs(Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "LargeExport.xlsx" )); } void ExportLargeDataset(DataTable sourceTable) { WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX); WorkSheet worksheet = workbook.DefaultWorkSheet; // Direct DataTable load -- fastest path for large data worksheet.LoadFromDataTable(sourceTable, true); // Apply header styling after load int colCount = sourceTable.Columns.Count; for (int col = 0; col < colCount; col++) { char colLetter = (char)('A' + col); worksheet[$"{colLetter}1"].Style.Font.Bold = true; worksheet[$"{colLetter}1"].Style.SetBackgroundColor("#4472C4"); worksheet[$"{colLetter}1"].Style.Font.Color = "#FFFFFF"; } workbook.SaveAs(Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "LargeExport.xlsx" )); } $vbLabelText $csharpLabel 對於超過 10,000 行的資料集,在後台執行緒上執行導出操作可以保持 UI 的響應性。將匯出邏輯包裝在 Task.Run 中,並使用 Invoke 將 MessageBox.Show 回呼序列化到 UI 執行緒。 IronXL對獨立實例上的寫入操作是線程安全的,因此如果需要,您可以同時執行多個匯出操作。 其他效能資源: Excel匯出效能指南 -處理大型 Excel 文件 -串流 Excel 輸出 IronXL與 Microsoft Interop 在 DataGridView 匯出上有何不同? 許多開發人員首先選擇 Microsoft Excel Interop,因為它隨 Office 一起提供,而無需其他軟體包。 然而,互通性會帶來實際成本,這些成本會在生產環境中迅速顯現出來。 下表總結了主要區別: IronXL與 Microsoft Excel Interop 在 DataGridView 匯出方面的比較 能力 IronXL Microsoft Interop 需要安裝 Microsoft Excel 不 是的 可在伺服器/雲端環境中運行 是的 否(微軟不支援) 需要清理 COM 對象 不 是的(Marshal.ReleaseComObject) 處理大型資料集的效能 快(純.NET) 速度慢(COM編組開銷) 安裝方法 NuGet COM 參考/Office 安裝 支援的.NET版本 .NET 4.6.2 -- .NET 10 僅限.NET Framework (功能有限) XLSX、CSV、ODS 支持 是的 僅可透過 Excel 傳輸 XLSX/XLS 格式文件 微軟自己的文件警告不要在伺服器或服務帳戶中使用 Office Interop,理由是穩定性和授權方面有問題。 IronXL可以在 Azure 應用程式服務、Windows 服務主機、Docker 容器以及任何其他無法執行 Excel 等桌面應用程式的無頭環境中正常運作。 對於已經使用 Interop 並希望遷移的團隊來說,IronXL 的 API 映射非常接近,大多數 WorkBook 和 WorkSheet 操作可以直接轉換。 IronXL遷移指南涵蓋了常見的互通模式及其IronXL等效模式。 下一步計劃是什麼? 使用IronXL將 DataGridView 資料匯出至 Excel 只需要安裝NuGet套件和幾行程式碼,即可以乾淨、可維護的解決方案取代脆弱的 COM 互通方法,該解決方案可在任何部署環境中運行。 這裡介紹的技術——基本導出、格式化輸出、大數據集優化和比較表——為您提供了在生產 Windows Forms 應用程式中發布此功能所需的一切。 接下來,您可以探索以下相關功能: -使用 C# 從頭開始建立 Excel 檔案—無需資料來源即可透過程式設計方式建立工作簿 -將 Excel 檔案讀取到資料表中-這是將 Excel 資料匯入回應用程式的逆操作。 -套用條件格式-根據儲存格的值自動反白顯示儲存格 -在 Excel 中設定圖表資料-- 將圖表嵌入匯出的工作簿中 -對 Excel 檔案進行密碼保護-在分發之前確保匯出報表的安全性。 -匯出為 CSV 格式-- 當收件者需要平面檔案格式而非 .xlsx 您可以開始免費試用IronXL,在您的專案中測試其全部功能集,或在準備好進行生產部署時查看IronXL授權選項。 常見問題解答 如何在 C# 中將 DataGridView 數據匯出到 Excel? 透過 NuGet 安裝 IronXL,從 DataGridView 中擷取 DataTable,建立工作簿 (WorkBook) 和工作表 (WorkSheet),呼叫 worksheet.LoadFromDataTable(dt, true),然後使用 workbook.SaveAs 儲存。 將 DataGridView 匯出至 Excel 時,有哪些格式化選項可用? IronXL 支援粗體字型、背景顏色、文字顏色、水平對齊、數字格式(例如貨幣)、欄位自動調整大小、邊框樣式以及條件格式化。 我需要安裝 Microsoft Excel 才能匯出 DataGridView 的資料嗎? 不。IronXL程式庫是一個純 .NET 程式庫,可在無需 Microsoft Office 或任何 COM 註冊的情況下,直接在電腦上產生 Excel 檔案。 匯出 DataGridView 到 Excel 時,可以樣式化標題嗎? 是的。撰寫完標題列後,請透過座標存取每個標題儲存格,並設定 Style.Font.Bold、Style.SetBackgroundColor 及 Style.Font.Color 屬性。 從 DataGridView 匯出時,如何在 Excel 中套用交替的行顏色? 在迭代 DataGridView 行時追蹤行索引,並對偶數行套用範圍樣式,方法是使用 worksheet[rangeAddress].Style.SetBackgroundColor 並指定您選擇的十六進位顏色。 將 DataGridView 匯出至 Excel 時,該如何處理大型資料集? 請將底層的 DataTable 直接傳遞給 worksheet.LoadFromDataTable,而非逐個迭代儲存格。若資料集非常龐大,請使用 Task.Run 在背景執行緒中執行匯出作業。 在 DataGridView 匯出功能方面,IronXL 與 Microsoft Excel Interop 相比如何? IronXL 無需 Microsoft Excel 即可運作,適用於伺服器與雲端環境,無需 COM 清理程式碼,且在處理大型資料集時效能顯著提升。 Jordi Bardia 立即與工程團隊聊天 軟體工程師 Jordi 在 Python、C# 和 C++ 上最得心應手,當他不在 Iron Software 展現技術時,便在做遊戲編程。在分担產品测测试,產品開發和研究的责任時,Jordi 為持续的產品改進增值。他说这种多样化的经验使他受到挑战并保持参与, 而这也是他与 Iron Software 中工作一大乐趣。Jordi 在佛罗里达州迈阿密长大,曾在佛罗里达大学学习计算机科学和统计学。 相關文章 更新2026年3月1日 在ASP.NET C#中下載Excel文件:將數據匯出到XLSX,CSV和更多格式 使用C#和IronXL在ASP.NET Core中下載Excel文件。從MVC控制器中匯出數據到XLSX, CSV和XML,附有MemoryStream和File()返回。包括代碼範例。 閱讀更多 更新2026年3月1日 如何在Blazor中使用IronXL匯出Excel文件 學習如何在Blazor伺服器應用程式中使用IronXL将數據匯出到Excel。此指南涵蓋專案設置、服務設計、條件格式化、多表報告和錯誤處理,附有完整的C#代碼範例。 閱讀更多 更新2026年2月27日 如何在C#中而不是使用StreamReader來讀取Excel文件 了解StreamReader為何無法讀取Excel文件,並學習如何使用IronXL加載來自磁盤或內存流的XLSX和XLS工作簿。 閱讀更多 如何使用 IronXL 在 C# 中讀取 CSV 檔案使用 IronXL 在 C# 中將 SQL 資...
更新2026年3月1日 在ASP.NET C#中下載Excel文件:將數據匯出到XLSX,CSV和更多格式 使用C#和IronXL在ASP.NET Core中下載Excel文件。從MVC控制器中匯出數據到XLSX, CSV和XML,附有MemoryStream和File()返回。包括代碼範例。 閱讀更多
更新2026年3月1日 如何在Blazor中使用IronXL匯出Excel文件 學習如何在Blazor伺服器應用程式中使用IronXL将數據匯出到Excel。此指南涵蓋專案設置、服務設計、條件格式化、多表報告和錯誤處理,附有完整的C#代碼範例。 閱讀更多
更新2026年2月27日 如何在C#中而不是使用StreamReader來讀取Excel文件 了解StreamReader為何無法讀取Excel文件,並學習如何使用IronXL加載來自磁盤或內存流的XLSX和XLS工作簿。 閱讀更多