跳過到頁腳內容
使用 IRONXL

C# Export DataGridView to Excel with Column Headers Using IronXL.Excel

立即開始產品試用

將 Windows Forms DataGridView 控制項中的資料匯出為 Excel 格式是常見的需求,但開發人員經常會遇到一個關鍵問題:匯出的文件中缺少列標題。當您需要將 DataGridView 匯出到 Excel 並保留列標題時,您需要一個能夠完美保留所有資料和格式的解決方案。 雖然使用 Microsoft Office Interop 的傳統方法速度較慢,並且需要安裝 MS Excel,但IronXL提供了一個簡化的解決方案,可以無縫地處理 DataGridView 到 Excel 的轉換。

在這篇文章中,我們將向您展示如何使用 IronXL(一個功能強大的.NET Excel 庫,無需 Microsoft Office 依賴即可運行)將 DataGridView 資料匯出到 Excel,並保留所有資料和列標題。 您將學習如何用幾行程式碼實作一個完整的匯出解決方案,該方案可以處理標頭、資料類型和使用者友好的文件保存。

我們也會提及一些常見的陷阱,示範物件obj使用範例,並提供一些評論和註釋,以便您可以進一步擴展範例。

IronXL為何是理想之選?

IronXL 透過提供無需安裝 Microsoft Excel 的直覺式 API,簡化了 .NET 應用程式中的 Excel 操作。 與基於互通性的解決方案不同,IronXL 可以獨立運行,因此非常適合伺服器環境和沒有 Office 的機器。

此程式庫可處理所有Excel 格式,包括 XLSX、XLS 和 CSV,並在整個匯出過程中保持資料完整性和格式。 開發人員無需安裝 Excel 即可輕鬆複製資料、擴充工作表以及刪除或新增行。

設定 Windows 窗體項目

首先,在 Visual Studio 中建立一個新的 Windows 窗體應用程式。 專案準備就緒後,透過 NuGet 套件管理器安裝 IronXL。 開啟軟體包管理器控制台並執行:

Install-Package IronXL.Excel

安裝完成後,請將以下必要的命名空間新增至您的表單:

using IronXL;
using System;
using System.Data;
using System.Windows.Forms;
using IronXL;
using System;
using System.Data;
using System.Windows.Forms;
Imports IronXL
Imports System
Imports System.Data
Imports System.Windows.Forms
$vbLabelText   $csharpLabel

這些導入功能提供了對IronXL 的 Excel 功能、資料表操作和 Windows 窗體控制項的訪問,這些功能是匯出過程所必需的。

使用範例資料建立 DataGridView

讓我們建立一個簡單的介面,其中包含一個填充了範例資料來源的 DataGridView。 您可能還需要從 CSV 檔案或資料庫匯入數據,而下面的 DataTable 方法同樣適用於匯入的資料集。 透過 Visual Studio 設計器為表單新增一個新的 DataGridView 和一個按鈕,然後使用下列程式碼設定資料:

private void Form1_Load(object sender, EventArgs e)
{
    // Example object usage
    object obj = "Initializing DataTable";
    Console.WriteLine(obj);
    // Create a DataTable with sample data
    DataTable dt = new DataTable();
    // Add columns with descriptive headers
    dt.Columns.Add("Product ID", typeof(int));
    dt.Columns.Add("Product Name", typeof(string));
    dt.Columns.Add("Price", typeof(decimal));
    dt.Columns.Add("Stock Quantity", typeof(int));
    // Add sample rows
    dt.Rows.Add(1001, "Laptop", 999.99m, 15);
    dt.Rows.Add(1002, "Mouse", 29.99m, 50);
    dt.Rows.Add(1003, "Keyboard", 79.99m, 30);
    dt.Rows.Add(1004, "Monitor", 299.99m, 12);
    dt.Rows.Add(1005, "Headphones", 89.99m, 25);
    // Bind the DataTable to DataGridView Control
    dataGridView1.DataSource = dt;
}
private void Form1_Load(object sender, EventArgs e)
{
    // Example object usage
    object obj = "Initializing DataTable";
    Console.WriteLine(obj);
    // Create a DataTable with sample data
    DataTable dt = new DataTable();
    // Add columns with descriptive headers
    dt.Columns.Add("Product ID", typeof(int));
    dt.Columns.Add("Product Name", typeof(string));
    dt.Columns.Add("Price", typeof(decimal));
    dt.Columns.Add("Stock Quantity", typeof(int));
    // Add sample rows
    dt.Rows.Add(1001, "Laptop", 999.99m, 15);
    dt.Rows.Add(1002, "Mouse", 29.99m, 50);
    dt.Rows.Add(1003, "Keyboard", 79.99m, 30);
    dt.Rows.Add(1004, "Monitor", 299.99m, 12);
    dt.Rows.Add(1005, "Headphones", 89.99m, 25);
    // Bind the DataTable to DataGridView Control
    dataGridView1.DataSource = dt;
}
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ' Example object usage
    Dim obj As Object = "Initializing DataTable"
    Console.WriteLine(obj)
    ' Create a DataTable with sample data
    Dim dt As New DataTable()
    ' Add columns with descriptive headers
    dt.Columns.Add("Product ID", GetType(Integer))
    dt.Columns.Add("Product Name", GetType(String))
    dt.Columns.Add("Price", GetType(Decimal))
    dt.Columns.Add("Stock Quantity", GetType(Integer))
    ' Add sample rows
    dt.Rows.Add(1001, "Laptop", 999.99D, 15)
    dt.Rows.Add(1002, "Mouse", 29.99D, 50)
    dt.Rows.Add(1003, "Keyboard", 79.99D, 30)
    dt.Rows.Add(1004, "Monitor", 299.99D, 12)
    dt.Rows.Add(1005, "Headphones", 89.99D, 25)
    ' Bind the DataTable to DataGridView Control
    dataGridView1.DataSource = dt
End Sub
$vbLabelText   $csharpLabel

此範例建立一個資料表並將其綁定到網格。 即使數據量較小,該方法也能很好地擴展到更大的表格。 這裡定義的列名將成為 Excel 檔案中的標題。

範例資料代表了一個簡單的產品庫存,以便於驗證導出是否正確。 對於更複雜的資料綁定場景,微軟關於DataGridView 資料綁定的文件提供了更多範例。

這將創建一個 DataGridView,其中填充了我們程式碼中的所有資料:

! 使用 IronXL 將 C# DataGridView 匯出到 Excel 並帶有列標題:圖 1 - DataGridView 中的範例數據

實作帶有列標題的匯出

現在來說說主要功能,即在保留列標題的情況下將 DataGridView 匯出到 Excel。 新增此方法來處理匯出按鈕的點擊事件:

private void btnExport_Click(object sender, EventArgs e)
{
    // Create a new Excel workbook
    WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet worksheet = workbook.CreateWorkSheet("Exported Data");
    // Export column headers
    for (int col = 0; col < dataGridView1.Columns.Count; col++)
    {
        worksheet.SetCellValue(0, col, dataGridView1.Columns[col].HeaderText);
    }
    // Export data rows
    for (int row = 0; row < dataGridView1.Rows.Count; row++)
    {
        // Skip the last empty row (used for adding new rows in DataGridView)
        if (dataGridView1.AllowUserToAddRows && row == dataGridView1.Rows.Count - 1)
            continue;
        for (int col = 0; col < dataGridView1.Columns.Count; col++)
        {
            var cellValue = dataGridView1.Rows[row].Cells[col].Value;
            if (cellValue != null)
            {
                worksheet.SetCellValue(row + 1, col, cellValue.ToString());
            }
        }
    }
    // Show save dialog
    using (SaveFileDialog saveFileDialog = new SaveFileDialog
    {
        Filter = "Excel Files|*.xlsx",
        FileName = "DataGridView_Export.xlsx"
    })
    {
        if (saveFileDialog.ShowDialog() == DialogResult.OK)
        {
            workbook.SaveAs(saveFileDialog.FileName);
            MessageBox.Show("Export completed successfully!", "Success",
                            MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
}
private void btnExport_Click(object sender, EventArgs e)
{
    // Create a new Excel workbook
    WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet worksheet = workbook.CreateWorkSheet("Exported Data");
    // Export column headers
    for (int col = 0; col < dataGridView1.Columns.Count; col++)
    {
        worksheet.SetCellValue(0, col, dataGridView1.Columns[col].HeaderText);
    }
    // Export data rows
    for (int row = 0; row < dataGridView1.Rows.Count; row++)
    {
        // Skip the last empty row (used for adding new rows in DataGridView)
        if (dataGridView1.AllowUserToAddRows && row == dataGridView1.Rows.Count - 1)
            continue;
        for (int col = 0; col < dataGridView1.Columns.Count; col++)
        {
            var cellValue = dataGridView1.Rows[row].Cells[col].Value;
            if (cellValue != null)
            {
                worksheet.SetCellValue(row + 1, col, cellValue.ToString());
            }
        }
    }
    // Show save dialog
    using (SaveFileDialog saveFileDialog = new SaveFileDialog
    {
        Filter = "Excel Files|*.xlsx",
        FileName = "DataGridView_Export.xlsx"
    })
    {
        if (saveFileDialog.ShowDialog() == DialogResult.OK)
        {
            workbook.SaveAs(saveFileDialog.FileName);
            MessageBox.Show("Export completed successfully!", "Success",
                            MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
}
Private Sub btnExport_Click(sender As Object, e As EventArgs)
    ' Create a new Excel workbook
    Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
    Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Exported Data")
    ' Export column headers
    For col As Integer = 0 To dataGridView1.Columns.Count - 1
        worksheet.SetCellValue(0, col, dataGridView1.Columns(col).HeaderText)
    Next
    ' Export data rows
    For row As Integer = 0 To dataGridView1.Rows.Count - 1
        ' Skip the last empty row (used for adding new rows in DataGridView)
        If dataGridView1.AllowUserToAddRows AndAlso row = dataGridView1.Rows.Count - 1 Then
            Continue For
        End If
        For col As Integer = 0 To dataGridView1.Columns.Count - 1
            Dim cellValue = dataGridView1.Rows(row).Cells(col).Value
            If cellValue IsNot Nothing Then
                worksheet.SetCellValue(row + 1, col, cellValue.ToString())
            End If
        Next
    Next
    ' Show save dialog
    Using saveFileDialog As New SaveFileDialog With {
        .Filter = "Excel Files|*.xlsx",
        .FileName = "DataGridView_Export.xlsx"
    }
        If saveFileDialog.ShowDialog() = DialogResult.OK Then
            workbook.SaveAs(saveFileDialog.FileName)
            MessageBox.Show("Export completed successfully!", "Success",
                            MessageBoxButtons.OK, MessageBoxIcon.Information)
        End If
    End Using
End Sub
$vbLabelText   $csharpLabel

此導出方法包含以下幾個關鍵步驟:

1.建立工作簿: WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX)在記憶體中初始化一個新的 Excel 檔案。 2.新增工作表: CreateWorkSheet方法會新增一個命名的工作表來儲存您的資料。 3.匯出標題:第一個迴圈遍歷 DataGridView 列,提取HeaderText屬性並將其寫入第 0 行。 4.匯出資料:巢狀循環處理每個表格單元格,並進行空值檢查以防止錯誤。 5.使用者友善的保存: SaveFileDialog允許使用者選擇檔案位置和名稱。

保留標題的關鍵在於存取dataGridView1.Columns[i].HeaderText屬性,該屬性包含每個列標題的顯示文字。 您可以在每個匯出步驟上方新增註釋,以便向其他開發人員或未來的維護人員說明其目的。

使用 IronXL 將 C# DataGridView 匯出到 Excel 並帶有列標題:圖 2 - 包含匯出範例資料的輸出 Excel 文件

處理常見的Excel檔案資料匯出場景

處理真實世界數據時,你會遇到各種需要特殊處理的情況:

*空白儲存格:*我們的程式碼中的空值檢查可以防止儲存格不包含資料時發生錯誤。 在 Excel 中,空白儲存格顯示為空白,保持網格結構不變。 混合資料類型:** IronXL 會自動處理不同的資料格式。 在 Excel 中,數字保持數值形式,可以進行計算,而文字則保持字串形式。 *特殊字元:包含特殊字元的列標題可以正確匯出。 IronXL 會自動處理編碼,保留 &、<、> 等字元以及帶有重音符號的字母。

匯出文件時可能會出現錯誤。 使用 try-catch-finally 語句進行健全處理:

try
{
    // Export code here
}
catch (Exception ex)
{
    MessageBox.Show($"Export failed: {ex.Message}", "Error",
                   MessageBoxButtons.OK, MessageBoxIcon.Error);
}
try
{
    // Export code here
}
catch (Exception ex)
{
    MessageBox.Show($"Export failed: {ex.Message}", "Error",
                   MessageBoxButtons.OK, MessageBoxIcon.Error);
}
Try
    ' Export code here
Catch ex As Exception
    MessageBox.Show($"Export failed: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
$vbLabelText   $csharpLabel

IronXL 會保留 Excel 表格的詳細信息,例如格式、標題和特殊字元。 對於更進階的場景,您可以查閱 IronXL 文件作為參考,以了解檔案安全性、儲存格樣式公式保留等任務。

結論

使用 IronXL 將 DataGridView 匯出到 Excel 並帶有列標題非常簡單。 該庫負責處理複雜的 Excel 文件操作,讓您可以專注於應用程式邏輯。 無論您選擇逐單元格匯出還是資料表匯出,列標題都會完美地傳輸到 Excel 中。 這樣可以輕鬆地將 DataGridView 資料轉換為 Excel 格式,而不會遺失任何有用的標題或資料。

我們希望本文能幫助您為 DataGridView 匯出需求實作可靠的解決方案,並且您可以自信地運用今天在這裡學到的技能,將 DataGridView 匯出為 Excel 格式。 如果您正在尋找可靠的 C# 將 DataGridView 匯出到 Excel 並帶有列標題的解決方案,IronXL 提供了一種簡潔、無依賴項的方法來實現此目的。

準備好在您的專案中實施此功能了嗎?首先使用IronXL 的免費試用版,探索其全部功能。 生產用途的授權許可價格極具競爭力,並包含全面的技術支援。

常見問題解答

如何在 C# 中將 DataGridView 資料匯出至 Excel?

您可以使用 IronXL.Excel 函式庫將 DataGridView 資料匯出至 Excel。它可讓您輕鬆地將資料從 DataGridView 傳輸至 Excel,同時保留列標題。

使用 IronXL 匯出資料有什麼好處?

IronXL.Excel 提供簡單有效的方式,將資料從 DataGridView 匯出至 Excel,並維持資料的完整性,確保保留列頭。

從 DataGridView 匯出至 Excel 時,是否可能保留欄頭?

是的,使用 IronXL,您可以在從 DataGridView 匯出資料到 Excel 時保留欄頭。這個函式庫的設計是為了維持您的資料結構。

我需要試用才能開始使用 IronXL 匯出至 Excel 嗎?

是的,您可以下載 IronXL 的試用版開始使用。這可讓您探索其功能,包括將 DataGridView 資料匯出至 Excel。

IronXL.Excel 能否在匯出至 Excel 時處理大型 DataGridView 資料集?

IronXL.Excel 能夠有效率地處理大型資料集,因此適合將大量 DataGridView 資料匯出至 Excel 而不會產生效能問題。

使用 IronXL.Excel 將 DataGridView 匯出至 Excel 的步驟為何?

過程包括初始化 IronXL、載入您的 DataGridView 資料,以及使用函式庫的方法將資料匯出至 Excel 檔案,並確保包含欄頭。

為何要選擇 IronXL 而非其他匯出至 Excel 的程式庫?

IronXL.Excel 提供強大的效能、簡易的使用方式以及全面的說明文件,使其成為希望以最小的工作量將資料從 DataGridView 匯出至 Excel 的開發人員的首選。

IronXL 是否提供疑難排解支援?

是的,IronXL 提供廣泛的說明文件和支援,以協助您排除在匯出 DataGridView 資料至 Excel 時可能遇到的任何問題。

我可以使用 IronXL 自訂 Excel 匯出流程嗎?

是的,IronXL.Excel 提供自訂匯出程序的彈性,讓您在從 DataGridView 匯出至 Excel 時,可根據需要調整格式和資料呈現。

IronXL 是否支援將資料匯出至 Excel 以外的其他格式?

雖然 IronXL.Excel 主要是針對 Excel 作業而設計,但它也支援將資料匯出為其他格式,提供資料處理的多樣性。

Curtis Chau
技術撰稿人

Curtis Chau 擁有電腦科學學士學位(卡爾頓大學),專長於前端開發,精通 Node.js、TypeScript、JavaScript 和 React。Curtis 對製作直覺且美觀的使用者介面充滿熱情,他喜歡使用現代化的架構,並製作結構良好且視覺上吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 也有濃厚的興趣,他喜歡探索整合硬體與軟體的創新方式。在空閒時間,他喜歡玩遊戲和建立 Discord bots,將他對技術的熱愛與創意結合。