IRONSOFTWAREHOME
KORZYSTANIE Z IRONXL

C# Eksportuj DataGridView do Excel z nagłówkami kolumn

Curtis Chau
Curtis Chau
Updated: 28 czerwca 2026

Jak wyeksportować DataGridView do Excela z nagłówkami kolumn w C#?

Eksportowanie danych z kontrolki DataGridView w Windows Forms do formatu Excel jest częstym wymaganiem, ale programiści często napotykają frustrującą przeszkodę: w eksportowanym pliku brakuje nagłówków kolumn. Jeśli chcesz wyeksportować DataGridView do Excela wraz z nagłówkami kolumn, rozwiązanie musi niezawodnie zachować wszystkie dane i formatowanie. Tradycyjne podejścia wykorzystujące Interop Microsoft Office mogą być powolne, niestabilne i wymagać zainstalowania programu MS Excel na każdym komputerze, na którym uruchamiany jest kod.

IronXL rozwiązuje ten problem w sposób przejrzysty. Jest to biblioteka .NET dla programu Excel, która odczytuje, tworzy i zapisuje pliki Excel bez konieczności korzystania z pakietu Office. Ten samouczek przeprowadzi Cię przez kompletne rozwiązanie do eksportu — takie, które obsługuje nagłówki kolumn, typy danych, komórki null oraz przyjazne dla użytkownika zapisywanie plików za pomocą zaledwie kilku linii kodu.

Na koniec będziesz mieć działający handler przycisku Windows Forms, który eksportuje DataGridView do pliku XLSX z zachowaniem wszystkich nagłówków kolumn.

Co jest potrzebne przed rozpoczęciem

Przed napisaniem jakiegokolwiek kodu upewnij się, że spełnione są następujące warunki:

  • Visual Studio 2022 lub nowsze (dowolna edycja)
  • Zainstalowany pakiet .NET 10 SDK
  • Projekt aplikacji Windows Forms przeznaczony dla platformy .NET 10
  • Dostęp do NuGet w celu zainstalowania IronXL

Przykłady poniżej używają instrukcji najwyższego poziomu oraz nowoczesnej struktury projektu .NET 10.

Jak zainstalować bibliotekę w projekcie .NET?

Otwórz konsolę menedżera pakietów NuGet w programie Visual Studio i uruchom jedno z poniższych poleceń. Pakiet jest dostępny w NuGet Gallery i jest przeznaczony dla .NET Standard 2.0 i nowszych wersji, dzięki czemu działa z każdym nowoczesnym projektem .NET.

PM > Install-Package IronXL.Excel

dotnet add package IronXL.Excel

Po instalacji dodaj wymagane przestrzenie nazw na początku pliku formularza:

using IronXL;
using System;
using System.Data;
using System.Windows.Forms;

Te importy zapewniają dostęp do funkcji programu Excel w IronXL, operacji DataTable oraz elementów sterujących Windows Forms niezbędnych do procesu eksportu.

Jak skonfigurować DataGridView z przykładowymi danymi?

Zacznij od utworzenia aplikacji Windows Forms w programie Visual Studio. Dodaj DataGridView o nazwie dataGridView1 i przycisk o nazwie btnExport do głównego formularza za pomocą projektanta. Następnie wypełnij tabelę po załadowaniu formularza:

using System;
using System.Data;
using System.Windows.Forms;

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        DataTable dt = new DataTable();

        // Define columns -- these names become Excel 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 data to the grid
        dataGridView1.DataSource = dt;
    }
}

Nazwy kolumn zdefiniowanych w dt.Columns.Add(...) będą stały się wierszem nagłówkowym w wyeksportowanym pliku Excel. Można tutaj podstawić dowolne źródło danych - wynik zapytania do bazy danych, import CSV lub odpowiedź API przechowywana jako DataTable, wszystkie działają identycznie z kodem eksportu pokazanym później. Podejście z DataTable jest szczególnie wygodne, ponieważ DataGridView udostępnia właściwość DataSource, która akceptuje dowolny IList lub IBindingList, co oznacza, że ten sam kod eksportu generalizuje się w każdym scenariuszu wiązania bez modyfikacji.

Jeśli Twój DataGridView jest wypełniony z bazy danych przy użyciu SqlDataAdapter, DataTable już zawiera typowane kolumny. Przekazanie tych typowanych wartości do SetCellValue zamiast wywoływania ToString() na nich utrzymuje kolumny numeryczne jako numeryczne w wyniku eksportu Excel, co ma znaczenie dla wszelkich raportów lub tabel przestawnych dalszego użycia.

Powoduje to utworzenie kontrolki DataGridView wypełnionej wszystkimi danymi:

C# Eksport DataGridView do Excela z nagłówkami kolumn za pomocą IronXL: Obraz 1 - Przykładowe dane w DataGridView

W przypadku bardziej zaawansowanych scenariuszy powiązania danych dodatkowe przykłady można znaleźć w dokumentacji Microsoftu dotyczącej powiązania danych w DataGridView.

Jak wyeksportować DataGridView do Excela, zachowując nagłówki kolumn?

Metoda eksportu odczytuje nagłówki kolumn z właściwości HeaderText każdej kolumny DataGridView i zapisuje je do wiersza 0 arkusza. Wiersze danych zaczynają się od wiersza 1. Podłącz tę metodę do zdarzenia kliknięcia btnExport:

private void btnExport_Click(object sender, EventArgs e)
{
    try
    {
        // Create a new Excel workbook in XLSX format
        WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        WorkSheet worksheet = workbook.CreateWorkSheet("Exported Data");

        // Write column headers to row 0
        for (int col = 0; col < dataGridView1.Columns.Count; col++)
        {
            worksheet.SetCellValue(0, col, dataGridView1.Columns[col].HeaderText);
        }

        // Write data rows starting at row 1
        for (int row = 0; row < dataGridView1.Rows.Count; row++)
        {
            // Skip the placeholder new-row at the bottom of the grid
            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());
                }
            }
        }

        // Prompt the user to choose a save location
        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);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Export failed: {ex.Message}", "Error",
                       MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

Podział etapów eksportu

Każdy etap tej metody służy konkretnemu celowi:

  • WorkBook.Create: Inicjuje nowy plik Excel w pamięci w formacie XLSX. Żaden plik nie jest zapisywany na dysku, dopóki nie zostanie wywołane SaveAs.
  • CreateWorkSheet: Dodaje arkusz o określonej nazwie, w którym będą przechowywane wyeksportowane dane. Nazwa "Exported Data" pojawia się jako etykieta karty w programie Excel.
  • Pętla nagłówka kolumn: Odczytuje dataGridView1.Columns[col].HeaderText dla każdej kolumny i zapisuje go do indeksu wiersza 0. To kluczowy krok, który zachowuje nagłówki.
  • Pętle wierszy danych: Zagnieżdżone pętle iterują każdy wiersz i kolumnę, używając row + 1 jako indeksu wiersza Excel, aby dane zawsze zaczynały się poniżej wiersza nagłówkowego.
  • Sprawdzanie wartości null: zapobiega wyjątkom, gdy komórka nie zawiera wartości, co jest powszechne w rzeczywistych danych.
  • SaveFileDialog: Pozwala użytkownikom wybrać nazwę pliku i miejsce docelowe w czasie wykonywania, zamiast sztywnego kodowania ścieżki.

Wyeksportowany plik wygląda następująco:

C# Eksport DataGridView do Excela z nagłówkami kolumn za pomocą IronXL: Obraz 2 - Wyjściowy plik Excel z wyeksportowanymi przykładowymi danymi

Jak radzisz sobie z typowymi sytuacjami granicznymi podczas eksportu?

Dane z rzeczywistych sytuacji rzadko wyglądają tak przejrzyście jak przykładowy zbiór danych. Oto scenariusze, z którymi najprawdopodobniej się spotkasz, oraz sposoby ich rozwiązania.

Puste komórki

Sprawdzenie null (if (cellValue != null)) w pętli danych obsługuje puste komórki bez rzucania wyjątku. Puste komórki pozostają puste w pliku wyjściowym Excel, zachowując strukturę siatki.

Mieszane typy danych

IronXL automatycznie obsługuje różne formaty danych. Gdy przekazujesz liczbę jako ciąg za pomocą ToString(), Excel może nadal rozpoznać ją jako numeryczną w zależności od wartości. Aby zapewnić precyzyjną kontrolę typu, przed zapisaniem należy rzutować wartość komórki na właściwy typ:

if (cellValue is int intVal)
    worksheet.SetCellValue(row + 1, col, intVal);
else if (cellValue is decimal decVal)
    worksheet.SetCellValue(row + 1, col, (double)decVal);
else
    worksheet.SetCellValue(row + 1, col, cellValue?.ToString() ?? string.Empty);

Takie podejście pozwala zachować kolumny liczbowe w formacie numerycznym w programie Excel, dzięki czemu formuły i sortowanie działają poprawnie w dalszych etapach przetwarzania.

Znaki specjalne w nagłówkach

Nagłówki kolumn ze specjalnymi znakami, takimi jak &, <, > i akcentowane litery eksportują się poprawnie. IronXL automatycznie obsługuje kodowanie i nie wymaga od użytkownika stosowania znaków escape.

Duże zbiory danych

Dla siatek zawierających dziesiątki tysięcy wierszy, rozważ przeniesienie logiki eksportu do wątku w tle, aby utrzymać responsywność UI. Owiń WorkBook.Create i logikę pętli w wywołanie Task.Run i aktualizuj UI z wywołania zwrotnego po zakończeniu. Dokumentacja Microsoftu dotycząca programowania asynchronicznego z wykorzystaniem Task szczegółowo wyjaśnia ten wzorzec.

W przypadku dodatkowych scenariuszy, takich jak stylizacja komórek, zachowanie formuł i ochrona hasłem, dokumentacja IronXL szczegółowo omawia każdy z nich.

Jak wypadają w porównaniu główne podejścia do eksportu?

Przed podjęciem decyzji o wyborze biblioteki warto zrozumieć kompromisy między najpopularniejszymi metodami.

Porównanie metod eksportu DataGridView do programu Excel w języku C#
MetodaWymagane biuroNagłówki kolumnWydajnośćBezpieczny dla serwerów
Interop Microsoft OfficeTakPodręcznikPowolnyNie
OpenXml SDKNiePodręcznikSzybkoTak
ClosedXMLNiePodręcznikDobrzeTak
IronXLNieAutomatyczneSzybkoTak

Rozwiązania oparte na Interop wymagają zainstalowania programu Excel na serwerze, co wiąże się zarówno z kwestią licencji, jak i złożonością wdrożenia. OpenXml SDK jest potężnym narzędziem, ale działa na niskim poziomie — napisanie wiersza nagłówkowego wymaga ręcznego tworzenia struktur XML. IronXL i ClosedXML zapewniają bardziej wyrafinowane API, ale model IronXL WorkBook i WorkSheet odpowiada temu, jak deweloperzy myślą o arkuszach kalkulacyjnych.

Jak wyeksportować do pliku CSV zamiast XLSX?

Ten sam wzór eksportu ma zastosowanie, gdy potrzebujesz pliku CSV zamiast skoroszytu Excel. Zmień format pliku i rozszerzenie:

WorkBook csvWorkbook = WorkBook.Create(ExcelFileFormat.CSV);
WorkSheet csvSheet = csvWorkbook.CreateWorkSheet("Data");

// Headers and data loops remain identical

using SaveFileDialog dialog = new SaveFileDialog
{
    Filter = "CSV Files|*.csv",
    FileName = "DataGridView_Export.csv"
};

if (dialog.ShowDialog() == DialogResult.OK)
    csvWorkbook.SaveAs(dialog.FileName);

Eksport do formatu CSV jest przydatny, gdy system docelowy nie obsługuje formatu XLSX lub gdy rozmiar pliku stanowi problem w przypadku bardzo dużych zbiorów danych.

Jak sformatować wiersz nagłówka w eksportowanym pliku?

Eksportowane dane są bardziej czytelne, gdy wiersz nagłówka jest wyraźnie wyróżniony. IronXL zapewnia opcje stylizacji komórek, które pozwalają na stosowanie pogrubienia tekstu, koloru tła i rozmiaru czcionki po zapisaniu wartości nagłówków:

// Write headers and apply bold styling
for (int col = 0; col < dataGridView1.Columns.Count; col++)
{
    string cellAddress = worksheet.GetCellAddress(0, col);
    worksheet[cellAddress].Value = dataGridView1.Columns[col].HeaderText;
    worksheet[cellAddress].Style.Font.Bold = true;
    worksheet[cellAddress].Style.SetBackgroundColor("#4472C4");
    worksheet[cellAddress].Style.Font.FontColor = "#FFFFFF";
}

Stylizowany wiersz nagłówka sprawia, że wyeksportowany plik nadaje się do natychmiastowego wykorzystania w raportach, bez konieczności ręcznego formatowania przez odbiorcę. Pełna lista właściwości stylów znajduje się w dokumentacji dotyczącej stylów komórek IronXL.

Jak rozpocząć korzystanie z bezpłatnej wersji próbnej?

IronXL oferuje bezpłatną wersję próbną, która pozwala przetestować wszystkie funkcje, w tym procesy eksportu przedstawione w tym artykułe. Zainstaluj pakiet za pomocą jednego z poleceń NuGet pokazanych powyżej, wygeneruj klucz próbny na stronie licencyjnej IronXL i ustaw go w swojej aplikacji przed pierwszym wywołaniem biblioteki IronXL:

IronXL.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";

Wersja próbna generuje w pełni funkcjonalne pliki Excel i nie ogranicza dostępnych funkcji. W przypadku wdrożenia produkcyjnego opcje licencyjne obejmują pojedynczych programistów, zespoły oraz redystrybucję bez opłat licencyjnych.

Dla powiązanych scenariuszy eksportu, zbadamy jak IronXL radzi sobie z eksportowaniem DataTables bezpośrednio do Excela, czytaniem plików Excel do DataGridViews, i tworzeniem wykresów z wyeksportowanych danych.

Wybór odpowiedniej strategii eksportu dla danego przypadku użycia

Prosta metoda eksportu komórka po komórce, pokazana w tym samouczku, pasuje do większości aplikacji Windows Forms. Jeśli twoje DataGridView jest związane z DataTable, możesz również przekazać DataTable bezpośrednio do konwertera DataTable na arkusz pracy IronXL, który automatycznie obsługuje wiersz nagłówka. Wybierz bezpośrednie podejście DataTable, gdy układ kolumn jest stały i chcesz uzyskać możliwie najkrótszą ścieżkę kodu. Wybierz ręczne podejście komórka po komórce, gdy potrzebujesz logiki warunkowej dla poszczególnych komórek — na przykład podświetlanie komórek, których wartość wykracza poza dopuszczalny zakres, lub jawne mapowanie typów nullable przed zapisaniem.

W przypadku scenariuszy po stronie serwera, takich jak kontrolery ASP.NET Core generujące raporty Excel do pobrania, stosuje się ten sam interfejs API IronXL. Jedyną różnicą jest cel zapisu: zamiast SaveAs(filePath), wywołaj workbook.ToByteArray() i zapisz bajty do odpowiedzi HTTP z typem zawartości application/vnd.openxmlformats-officedocument.spreadsheetml.sheet. Nagłówki kolumn są przenoszone identycznie, niezależnie od tego, czy wynik jest zapisywany do pliku, czy do strumienia.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podręczników.

...
Czytaj więcej

Powiązane artykuły

Key in blue circle

Uzyskaj natychmiast swój darmowy 30-dniowy Klucz Testowy.

Your trial license will be sent to your email address

Brak ograniczeń. 100% dostępności. Bez karty kredytowej.

bullet_checkedNie wymaga karty kredytowej ani tworzenia kontaBrak ograniczeń. 100% dostępności. Bez karty kredytowej.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Zarezerwuj swoje darmowe Demo na żywo
Booking Badge

Zaufane przez miliony inżynierów na całym świecie

Logotypy klientów Iron Software
Otrzymaj swoje Konsultacja Bez Zobowiązań
Wypełnij poniższy formularz lub wyślij e-mail na sales@ironsoftware.com
Twoje dane zawsze będą utrzymywane w tajemnicy.
Zaufane przez miliony inżynierów na całym świecie
Logotypy klientów Iron Software
Otrzymaj swój darmowy Klucz Próbny na 30 dni natychmiast.
Nie wymaga karty kredytowej ani tworzenia konta