Jak generować pliki Excel w C# używając IronXL
Programowe generowanie arkuszy kalkulacyjnych Excel w języku C# tradycyjnie wymagało instalacji pakietu Microsoft Office lub złożonej integracji COM. IronXL całkowicie to zmienia, oferując proste API, które tworzy pliki Excel bez żadnych zależności od pakietu Office. Ten samouczek przeprowadzi Cię przez proces tworzenia plików Excel w języku C# przy użyciu IronXL, od podstawowego tworzenia arkuszy kalkulacyjnych po zaawansowane formatowanie i integrację z bazami danych. Niezależnie od tego, czy tworzysz raporty, eksportujesz dane (pliki XLS lub XLSX), czy automatyzujesz generowanie arkuszy kalkulacyjnych, poznasz podstawowe techniki pracy z programem Excel w aplikacjach .NET.

Dłączego warto generować pliki Excel bez pakietu Microsoft Office?
Opracowanie funkcji generowania plików Excel bez zależności od pakietu Office rozwiązuje kluczowe wyzwania związane z wdrażaniem. W środowiskach serwerowych rzadko instaluje się pakiet Microsoft Office ze względu na koszty licencji i obciążenie zasobów. Każda instalacja pakietu Office wymaga znacznej ilości miejsca na dysku i pamięci, co sprawia, że nie nadaje się on do wdrożeń w chmurze lub aplikacji kontenerowych.
IronXL eliminuje te ograniczenia, działając niezależnie. Generowanie plików Excel w języku C# działa bez modyfikacji w systemach Windows, Linux, macOS, kontenerach Docker lub usługach Azure App Services. Ta kompatybilność między platformami oznacza, że wystarczy napisać kod raz, a następnie wdrożyć go w dowolnym miejscu, niezależnie od tego, czy chodzi o aplikacje .NET Framework, .NET Core czy .NET 10.

Wydajność znacznie wzrasta bez obciążenia związanego z COM Interop. Tradycyjna automatyzacja biurowa tworzy oddzielne instancje procesów dla każdej operacji, zużywając pamięć i zasoby procesora. IronXL przetwarza wszystko w pamięci w przestrzeni procesówej aplikacji, co skutkuje szybszym działaniem i mniejszym zużyciem zasobów podczas programowego generowania plików Excel.
Wdrożenie jest proste, ponieważ IronXL jest dostarczany jako pojedynczy pakiet NuGet. Nie ma wpisów w rejestrze, rejestracji COM ani pakietów serwisowych Office do utrzymania. Twoje potoki ciągłej integracji działają bez zakłóceń, a kontenery Docker pozostają lekkie. To uproszczone podejście sprawiło, że IronXL stał się popularnym wyborem, o czym dyskutuje się na różnych forach programistów, gdzie Professionals dzielą się swoimi doświadczeniami z automatyzacją Excela.
Niektórzy programiści nadal korzystają z narzędzia Microsoft Open XML Productivity Tool do bezpośredniej pracy ze strukturami plików Office Open XML. Jednak takie podejście wymaga większego nakładu pracy ręcznej oraz szczegółowej wiedzy na temat schematu XML i instalacji Open XML SDK. IronXL eliminuje te złożoności, zapewniając znacznie szybszy dostęp do programowego korzystania z programu Excel.

Jak zainstalować IronXL w projekcie C#?
Instalacja IronXL zajmuje zaledwie kilka chwil za pomocą menedżera pakietów NuGet w Visual Studio. Kliknij prawym przyciskiem myszy swój projekt w Eksploratorze rozwiązań i wybierz opcję "Zarządzaj pakietami NuGet". Wyszukaj "IronXl.Excel" i kliknij "Zainstaluj". Pakiet automatycznie zawiera wszystkie zależności wymagańe do generowania plików Excel w języku C#.
Aby zainstalować za pomocą konsoli menedżera pakietów lub interfejsu CLI .NET, użyj jednego z następujących poleceń:
Install-Package IronXl.Excel
dotnet add package IronXl.Excel
Install-Package IronXl.Excel
dotnet add package IronXl.Excel

Sprawdź instalację za pomocą tego prostego testu, aby upewnić się, że biblioteka jest gotowa:
using IronXL;
// Create an in-memory workbook
var workbook = WorkBook.Create();
Console.WriteLine("IronXL installed successfully!");
using IronXL;
// Create an in-memory workbook
var workbook = WorkBook.Create();
Console.WriteLine("IronXL installed successfully!");
Imports IronXL
' Create an in-memory workbook
Dim workbook = WorkBook.Create()
Console.WriteLine("IronXL installed successfully!")
Jeśli wszystko przebiegnie bez błędów, IronXL jest gotowy do użycia. Biblioteka obsługuje wszystkie nowoczesne wersje .NET, zapewniając kompatybilność z istniejącymi projektami. Szczegółowe wskazówki dotyczące instalacji i rozwiązywania problemów można znaleźć w oficjalnej dokumentacji instalacyjnej NuGet.
Wynik

Jak utworzyć swój pierwszy plik Excel?
Tworzenie plików Excel za pomocą IronXL rozpoczyna się od klasy WorkBook, która stanowi bramę do wszystkich operacji programu Excel. Biblioteka obsługuje zarówno nowoczesny format XLSX, jak i starszy format XLS, co zapewnia elastyczność w przypadku różnych wymagań podczas tworzenia pliku Excel w języku C#.
using IronXL;
// Create a new workbook (XLSX format by default)
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
// Add metadata
workbook.Metadata.Title = "Monthly Sales Report";
workbook.Metadata.Author = "Sales Department";
workbook.Metadata.Comments = "Generated using IronXL";
// Create a worksheet
WorkSheet worksheet = workbook.CreateWorkSheet("January Sales");
// Add header row
worksheet["A1"].Value = "Date";
worksheet["B1"].Value = "Product";
worksheet["C1"].Value = "Quantity";
worksheet["D1"].Value = "Revenue";
// Add data rows
worksheet["A2"].Value = new DateTime(2024, 1, 15);
worksheet["B2"].Value = "Widget Pro";
worksheet["C2"].Value = 100;
worksheet["D2"].Value = 2500.00;
// Save the workbook
workbook.SaveAs("FirstExcelFile.xlsx");
using IronXL;
// Create a new workbook (XLSX format by default)
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
// Add metadata
workbook.Metadata.Title = "Monthly Sales Report";
workbook.Metadata.Author = "Sales Department";
workbook.Metadata.Comments = "Generated using IronXL";
// Create a worksheet
WorkSheet worksheet = workbook.CreateWorkSheet("January Sales");
// Add header row
worksheet["A1"].Value = "Date";
worksheet["B1"].Value = "Product";
worksheet["C1"].Value = "Quantity";
worksheet["D1"].Value = "Revenue";
// Add data rows
worksheet["A2"].Value = new DateTime(2024, 1, 15);
worksheet["B2"].Value = "Widget Pro";
worksheet["C2"].Value = 100;
worksheet["D2"].Value = 2500.00;
// Save the workbook
workbook.SaveAs("FirstExcelFile.xlsx");
Imports IronXL
' Create a new workbook (XLSX format by default)
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
' Add metadata
workbook.Metadata.Title = "Monthly Sales Report"
workbook.Metadata.Author = "Sales Department"
workbook.Metadata.Comments = "Generated using IronXL"
' Create a worksheet
Dim worksheet As WorkSheet = workbook.CreateWorkSheet("January Sales")
' Add header row
worksheet("A1").Value = "Date"
worksheet("B1").Value = "Product"
worksheet("C1").Value = "Quantity"
worksheet("D1").Value = "Revenue"
' Add data rows
worksheet("A2").Value = New DateTime(2024, 1, 15)
worksheet("B2").Value = "Widget Pro"
worksheet("C2").Value = 100
worksheet("D2").Value = 2500.0
' Save the workbook
workbook.SaveAs("FirstExcelFile.xlsx")
Ten kod ilustruje kilka kluczowych koncepcji związanych z generowaniem plików Excel. Metoda WorkBook.Create() inicjuje nowy plik Excel w pamięci. Format określa się za pomocą wyliczenia ExcelFileFormat — wybierz XLSX dla zgodności z nowoczesnym Excelem lub XLS dla obsługi starszych wersji. Właściwość Metadata pozwala osadzić informacje o dokumencie, które pojawiają się we właściwościach pliku programu Excel, zgodnie ze standardami właściwości dokumentów firmy Microsoft.
Metoda CreateWorkSheet() dodaje nowy arkusz o podanej nazwie. Znana z programu Excel notacja komórek (A1, B1 itp.) sprawia, że ustawianie wartości jest intuicyjne. IronXL automatycznie obsługuje konwersję typów danych, rozpoznając daty, liczby i tekst bez konieczności jawnego rzutowania. Metoda SaveAs() zapisuje cały plik Excel na dysk. Aby uzyskać więcej informacji na temat operacji w arkuszach kalkulacyjnych, zapoznaj się z przewodnikiem dotyczącym pisania plików Excel.
Wynik

Jak zapisywać dane w komórkach programu Excel?
IronXL oferuje wiele sposobów wypełniania komórek w Excelu, od przypisywania wartości do pojedynczych komórek po operacje na wielu komórkach naraz. Zrozumienie tych metod pomoże Ci wybrać najbardziej efektywne podejście do Twojego scenariusza danych podczas zapisywania do pliku Excel.
using IronXL;
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Employees");
// Individual cell assignment
worksheet["A1"].Value = "Employee Name";
worksheet["A2"].Value = "John Smith";
worksheet["A3"].Value = "Jane Doe";
// Range assignment for multiple cells at once
worksheet["B1:B3"].Value = "Active";
// Using numeric indices (0-based row, 0-based column)
worksheet.SetCellValue(0, 2, "Department"); // C1
worksheet.SetCellValue(1, 2, "Sales"); // C2
worksheet.SetCellValue(2, 2, "Marketing"); // C3
// Array-based header population
string[] headers = { "ID", "Name", "Email", "Phone" };
for (int i = 0; i < headers.Length; i++)
{
worksheet.SetCellValue(0, i, headers[i]);
}
// Working with different data types
worksheet["E1"].Value = "Salary";
worksheet["E2"].Value = 75000.50m; // Decimal for currency
worksheet["E3"].Value = 82000.75m;
worksheet["F1"].Value = "Start Date";
worksheet["F2"].Value = new DateTime(2020, 3, 15);
worksheet["F3"].Value = new DateTime(2019, 7, 1);
worksheet["G1"].Value = "Full Time";
worksheet["G2"].Value = true; // Boolean
worksheet["G3"].Value = true;
workbook.SaveAs("EmployeeData.xlsx");
using IronXL;
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Employees");
// Individual cell assignment
worksheet["A1"].Value = "Employee Name";
worksheet["A2"].Value = "John Smith";
worksheet["A3"].Value = "Jane Doe";
// Range assignment for multiple cells at once
worksheet["B1:B3"].Value = "Active";
// Using numeric indices (0-based row, 0-based column)
worksheet.SetCellValue(0, 2, "Department"); // C1
worksheet.SetCellValue(1, 2, "Sales"); // C2
worksheet.SetCellValue(2, 2, "Marketing"); // C3
// Array-based header population
string[] headers = { "ID", "Name", "Email", "Phone" };
for (int i = 0; i < headers.Length; i++)
{
worksheet.SetCellValue(0, i, headers[i]);
}
// Working with different data types
worksheet["E1"].Value = "Salary";
worksheet["E2"].Value = 75000.50m; // Decimal for currency
worksheet["E3"].Value = 82000.75m;
worksheet["F1"].Value = "Start Date";
worksheet["F2"].Value = new DateTime(2020, 3, 15);
worksheet["F3"].Value = new DateTime(2019, 7, 1);
worksheet["G1"].Value = "Full Time";
worksheet["G2"].Value = true; // Boolean
worksheet["G3"].Value = true;
workbook.SaveAs("EmployeeData.xlsx");
Imports IronXL
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Employees")
' Individual cell assignment
worksheet("A1").Value = "Employee Name"
worksheet("A2").Value = "John Smith"
worksheet("A3").Value = "Jane Doe"
' Range assignment for multiple cells at once
worksheet("B1:B3").Value = "Active"
' Using numeric indices (0-based row, 0-based column)
worksheet.SetCellValue(0, 2, "Department") ' C1
worksheet.SetCellValue(1, 2, "Sales") ' C2
worksheet.SetCellValue(2, 2, "Marketing") ' C3
' Array-based header population
Dim headers As String() = {"ID", "Name", "Email", "Phone"}
For i As Integer = 0 To headers.Length - 1
worksheet.SetCellValue(0, i, headers(i))
Next
' Working with different data types
worksheet("E1").Value = "Salary"
worksheet("E2").Value = 75000.5D ' Decimal for currency
worksheet("E3").Value = 82000.75D
worksheet("F1").Value = "Start Date"
worksheet("F2").Value = New DateTime(2020, 3, 15)
worksheet("F3").Value = New DateTime(2019, 7, 1)
worksheet("G1").Value = "Full Time"
worksheet("G2").Value = True ' Boolean
worksheet("G3").Value = True
workbook.SaveAs("EmployeeData.xlsx")
Kod pokazuje elastyczne adresowanie komórek w IronXL. Notacja łańcuchowa ("A1") jest naturalna dla użytkowników programu Excel, natomiast indeksy numeryczne zapewniają programową kontrolę nad pętlami i dynamicznym generowaniem. Przypisania zakresów ("B1:B3") pozwalają efektywnie ustawić tę samą wartość w wielu komórkach, co idealnie nadaje się do inicjalizacji kolumn lub stosowania wartości domyślnych.
IronXL inteligentnie obsługuje różne typy danych. Liczby dziesiętne zachowują precyzję w przypadku danych finansowych, obiekty DateTime są poprawnie formatowane jako daty w Excelu, a wartości logiczne wyświetlane są jako TRUE/FALSE. Ta automatyczna konwersja eliminuje konieczność ręcznego formatowania kodu, zapewniając jednocześnie integralność danych. W przypadku dużych zbiorów danych zapoznaj się z przewodnikiem po importowaniu danych, aby poznać dodatkowe wzorce.
Wynik

Jak zastosować profesjonalne formatowanie w plikach Excel?
Profesjonalne pliki Excel wymagają czegoś więcej niż tylko surowych danych. API stylizacji IronXL przekształca zwykłe arkusze kalkulacyjne w dopracowane dokumenty biznesowe poprzez formatowanie, kolory i hierarchię wizualną. Możesz zastosować formatowanie komórek, aby kontrolować każdy aspekt wizualny arkusza kalkulacyjnego.
using IronXL;
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Employees");
// Header formatting
var headerRange = worksheet["A1:D1"];
headerRange.Style.Font.Bold = true;
headerRange.Style.Font.Height = 12;
headerRange.Style.SetBackgroundColor("#4472C4");
headerRange.Style.Font.Color = "#FFFFFF";
// Column width adjustment
worksheet.AutoSizeColumn(0); // Auto-fit column A
worksheet.GetColumn(1).Width = 20; // Set column B width
// Number formatting
var salaryColumn = worksheet["E2:E3"];
salaryColumn.FormatString = "$#,##0.00";
// Date formatting
var dateColumn = worksheet["F2:F3"];
dateColumn.FormatString = "MM/dd/yyyy";
// Cell borders
var dataRange = worksheet["A1:G3"];
dataRange.Style.TopBorder.Type = IronXl.Styles.BorderType.Thin;
dataRange.Style.BottomBorder.Type = IronXl.Styles.BorderType.Thin;
dataRange.Style.LeftBorder.Type = IronXl.Styles.BorderType.Thin;
dataRange.Style.RightBorder.Type = IronXl.Styles.BorderType.Thin;
dataRange.Style.TopBorder.Color = "#000000";
dataRange.Style.BottomBorder.Color = "#000000";
// Text alignment
worksheet["A1:G1"].Style.HorizontalAlignment = IronXl.Styles.HorizontalAlignment.Center;
// Alternating row colors for readability (banded rows)
for (int row = 2; row <= 10; row++)
{
if (row % 2 == 0)
{
worksheet[$"A{row}:G{row}"].Style.SetBackgroundColor("#F2F2F2");
}
}
workbook.SaveAs("FormattedReport.xlsx");
using IronXL;
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Employees");
// Header formatting
var headerRange = worksheet["A1:D1"];
headerRange.Style.Font.Bold = true;
headerRange.Style.Font.Height = 12;
headerRange.Style.SetBackgroundColor("#4472C4");
headerRange.Style.Font.Color = "#FFFFFF";
// Column width adjustment
worksheet.AutoSizeColumn(0); // Auto-fit column A
worksheet.GetColumn(1).Width = 20; // Set column B width
// Number formatting
var salaryColumn = worksheet["E2:E3"];
salaryColumn.FormatString = "$#,##0.00";
// Date formatting
var dateColumn = worksheet["F2:F3"];
dateColumn.FormatString = "MM/dd/yyyy";
// Cell borders
var dataRange = worksheet["A1:G3"];
dataRange.Style.TopBorder.Type = IronXl.Styles.BorderType.Thin;
dataRange.Style.BottomBorder.Type = IronXl.Styles.BorderType.Thin;
dataRange.Style.LeftBorder.Type = IronXl.Styles.BorderType.Thin;
dataRange.Style.RightBorder.Type = IronXl.Styles.BorderType.Thin;
dataRange.Style.TopBorder.Color = "#000000";
dataRange.Style.BottomBorder.Color = "#000000";
// Text alignment
worksheet["A1:G1"].Style.HorizontalAlignment = IronXl.Styles.HorizontalAlignment.Center;
// Alternating row colors for readability (banded rows)
for (int row = 2; row <= 10; row++)
{
if (row % 2 == 0)
{
worksheet[$"A{row}:G{row}"].Style.SetBackgroundColor("#F2F2F2");
}
}
workbook.SaveAs("FormattedReport.xlsx");
Imports IronXL
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Employees")
' Header formatting
Dim headerRange = worksheet("A1:D1")
headerRange.Style.Font.Bold = True
headerRange.Style.Font.Height = 12
headerRange.Style.SetBackgroundColor("#4472C4")
headerRange.Style.Font.Color = "#FFFFFF"
' Column width adjustment
worksheet.AutoSizeColumn(0) ' Auto-fit column A
worksheet.GetColumn(1).Width = 20 ' Set column B width
' Number formatting
Dim salaryColumn = worksheet("E2:E3")
salaryColumn.FormatString = "$#,##0.00"
' Date formatting
Dim dateColumn = worksheet("F2:F3")
dateColumn.FormatString = "MM/dd/yyyy"
' Cell borders
Dim dataRange = worksheet("A1:G3")
dataRange.Style.TopBorder.Type = IronXl.Styles.BorderType.Thin
dataRange.Style.BottomBorder.Type = IronXl.Styles.BorderType.Thin
dataRange.Style.LeftBorder.Type = IronXl.Styles.BorderType.Thin
dataRange.Style.RightBorder.Type = IronXl.Styles.BorderType.Thin
dataRange.Style.TopBorder.Color = "#000000"
dataRange.Style.BottomBorder.Color = "#000000"
' Text alignment
worksheet("A1:G1").Style.HorizontalAlignment = IronXl.Styles.HorizontalAlignment.Center
' Alternating row colors for readability (banded rows)
For row As Integer = 2 To 10
If row Mod 2 = 0 Then
worksheet($"A{row}:G{row}").Style.SetBackgroundColor("#F2F2F2")
End If
Next
workbook.SaveAs("FormattedReport.xlsx")
Ten kod formatowania zapewnia profesjonalny wygląd zgodny ze standardami biznesowymi. Pogrubione nagłówki z kolorowym tłem tworzą wizualną hierarchię. Metoda SetBackgroundColor() akceptuje szesnastkowe kody kolorów, zapewniając precyzyjną kontrolę nad schematem kolorów. Właściwości czcionki obejmują opcje rozmiaru, koloru, pogrubienia, kursywy i podkreślenia — wszystkie niezbędne do tworzenia plików Excel zgodnych z wytycznymi dotyczącymi identyfikacji wizualnej firmy.
Dostosowanie szerokości kolumn zapobiega ucinaniu tekstu. AutoSizeColumn() automatycznie dopasowuje zawartość, natomiast GetColumn().Width zapewnia precyzyjną kontrolę. Formatowanie liczb wykorzystuje kody formatowania programu Excel — na przykład "$#,##0.00" wyświetla walutę z separatorami tysięcy i dwoma miejscami po przecinku. Formatowanie daty odbywa się według podobnych wzorców, z wykorzystaniem standardowych ciągów formatowania daty w programie Excel, zgodnie z dokumentacją Microsoftu dotyczącą kodów formatowania liczb.
Obramowania wyznaczają granice danych, poprawiając czytelność. Wyliczenie BorderType oferuje różne style: cienki, średni, gruby, kropkowany i przerywany. Naprzemienne kolory wierszy, często nazywane "pasmowymi wierszami", pomagają czytelnikom śledzić informacje w rozległych zestawach danych. Aby dowiedzieć się więcej o scałaniu komórek i innych funkcjach układu, zapoznaj się z przewodnikiem dotyczącym scałania komórek.
Wynik

Jak programowo korzystać z formuł programu Excel?
Formuły programu Excel ożywiają arkusze kalkulacyjne dzięki automatycznym obliczeniom. IronXL obsługuje tworzenie i obliczanie formuł, umożliwiając tworzenie dynamicznych arkuszy kalkulacyjnych, które aktualizują się automatycznie.
using IronXL;
var workbook = WorkBook.Create();
// Create a budget worksheet
WorkSheet budget = workbook.CreateWorkSheet("Q1 Budget");
// Headers
budget["A1"].Value = "Category";
budget["B1"].Value = "January";
budget["C1"].Value = "February";
budget["D1"].Value = "March";
budget["E1"].Value = "Q1 Total";
// Budget categories and values
string[] categories = { "Salaries", "Marketing", "Operations", "Equipment", "Training" };
decimal[,] monthlyBudgets = {
{ 50000, 52000, 51000 },
{ 15000, 18000, 20000 },
{ 8000, 8500, 9000 },
{ 12000, 5000, 7000 },
{ 3000, 3500, 4000 }
};
// Populate data and add row total formulas
for (int i = 0; i < categories.Length; i++)
{
budget[$"A{i + 2}"].Value = categories[i];
budget[$"B{i + 2}"].Value = monthlyBudgets[i, 0];
budget[$"C{i + 2}"].Value = monthlyBudgets[i, 1];
budget[$"D{i + 2}"].Value = monthlyBudgets[i, 2];
budget[$"E{i + 2}"].Formula = $"=SUM(B{i + 2}:D{i + 2})";
}
// Monthly totals row
budget["A7"].Value = "Monthly Total";
budget["B7"].Formula = "=SUM(B2:B6)";
budget["C7"].Formula = "=SUM(C2:C6)";
budget["D7"].Formula = "=SUM(D2:D6)";
budget["E7"].Formula = "=SUM(E2:E6)";
// Calculate percentages
budget["A9"].Value = "Marketing %";
budget["B9"].Formula = "=B3/B7*100";
// Average calculation
budget["A10"].Value = "Average Spending";
budget["B10"].Formula = "=AVERAGE(B2:B6)";
// Evaluate all formulas before saving
workbook.EvaluateAll();
workbook.SaveAs("Budget.xlsx");
using IronXL;
var workbook = WorkBook.Create();
// Create a budget worksheet
WorkSheet budget = workbook.CreateWorkSheet("Q1 Budget");
// Headers
budget["A1"].Value = "Category";
budget["B1"].Value = "January";
budget["C1"].Value = "February";
budget["D1"].Value = "March";
budget["E1"].Value = "Q1 Total";
// Budget categories and values
string[] categories = { "Salaries", "Marketing", "Operations", "Equipment", "Training" };
decimal[,] monthlyBudgets = {
{ 50000, 52000, 51000 },
{ 15000, 18000, 20000 },
{ 8000, 8500, 9000 },
{ 12000, 5000, 7000 },
{ 3000, 3500, 4000 }
};
// Populate data and add row total formulas
for (int i = 0; i < categories.Length; i++)
{
budget[$"A{i + 2}"].Value = categories[i];
budget[$"B{i + 2}"].Value = monthlyBudgets[i, 0];
budget[$"C{i + 2}"].Value = monthlyBudgets[i, 1];
budget[$"D{i + 2}"].Value = monthlyBudgets[i, 2];
budget[$"E{i + 2}"].Formula = $"=SUM(B{i + 2}:D{i + 2})";
}
// Monthly totals row
budget["A7"].Value = "Monthly Total";
budget["B7"].Formula = "=SUM(B2:B6)";
budget["C7"].Formula = "=SUM(C2:C6)";
budget["D7"].Formula = "=SUM(D2:D6)";
budget["E7"].Formula = "=SUM(E2:E6)";
// Calculate percentages
budget["A9"].Value = "Marketing %";
budget["B9"].Formula = "=B3/B7*100";
// Average calculation
budget["A10"].Value = "Average Spending";
budget["B10"].Formula = "=AVERAGE(B2:B6)";
// Evaluate all formulas before saving
workbook.EvaluateAll();
workbook.SaveAs("Budget.xlsx");
Imports IronXL
Dim workbook = WorkBook.Create()
' Create a budget worksheet
Dim budget As WorkSheet = workbook.CreateWorkSheet("Q1 Budget")
' Headers
budget("A1").Value = "Category"
budget("B1").Value = "January"
budget("C1").Value = "February"
budget("D1").Value = "March"
budget("E1").Value = "Q1 Total"
' Budget categories and values
Dim categories As String() = {"Salaries", "Marketing", "Operations", "Equipment", "Training"}
Dim monthlyBudgets As Decimal(,) = {
{50000, 52000, 51000},
{15000, 18000, 20000},
{8000, 8500, 9000},
{12000, 5000, 7000},
{3000, 3500, 4000}
}
' Populate data and add row total formulas
For i As Integer = 0 To categories.Length - 1
budget($"A{i + 2}").Value = categories(i)
budget($"B{i + 2}").Value = monthlyBudgets(i, 0)
budget($"C{i + 2}").Value = monthlyBudgets(i, 1)
budget($"D{i + 2}").Value = monthlyBudgets(i, 2)
budget($"E{i + 2}").Formula = $"=SUM(B{i + 2}:D{i + 2})"
Next
' Monthly totals row
budget("A7").Value = "Monthly Total"
budget("B7").Formula = "=SUM(B2:B6)"
budget("C7").Formula = "=SUM(C2:C6)"
budget("D7").Formula = "=SUM(D2:D6)"
budget("E7").Formula = "=SUM(E2:E6)"
' Calculate percentages
budget("A9").Value = "Marketing %"
budget("B9").Formula = "=B3/B7*100"
' Average calculation
budget("A10").Value = "Average Spending"
budget("B10").Formula = "=AVERAGE(B2:B6)"
' Evaluate all formulas before saving
workbook.EvaluateAll()
workbook.SaveAs("Budget.xlsx")
Ten przykład budżetu ilustruje praktyczne zastosowanie formuł. Właściwość Formula akceptuje standardową składnię formuł programu Excel, zaczynającą się od znaku równości. IronXL obsługuje popularne funkcje: SUM, AVERAGE, COUNT, MAX, MIN i wiele innych. Odwołania do komórek w formułach działają dokładnie tak samo jak w programie Excel, w tym odwołania względne i bezwzględne.
Metoda EvaluateAll() przetwarza wszystkie formuły, aktualizując obliczone wartości w całym skoroszycie. Dzięki temu formuły wyświetlają wyniki po otwarciu pliku w programie Excel. Bez oceny program Excel wyświetlałby tekst formuły do momentu, aż użytkownik uruchomi ponowne obliczenie. Więcej informacji na temat odczytywania wyników formuł można znaleźć w dokumentacji dotyczącej odczytu plików Excel.
Wynik

Jak wyeksportować dane z bazy danych do programu Excel?
W praktyce dane z baz danych są często eksportowane do programu Excel w celu sporządzenia raportów i przeprowadzenia analizy. IronXL ułatwia ten proces dzięki wbudowanej obsłudze DataTable, eliminując potrzebę ręcznego mapowania pól podczas eksportowania plików Excel z aplikacji C#.
using System.Data;
using IronXL;
// Simulate database retrieval (replace with actual database code)
DataTable GetSalesData()
{
DataTable dt = new DataTable("Sales");
dt.Columns.Add("OrderID", typeof(int));
dt.Columns.Add("CustomerName", typeof(string));
dt.Columns.Add("Product", typeof(string));
dt.Columns.Add("Quantity", typeof(int));
dt.Columns.Add("UnitPrice", typeof(decimal));
dt.Columns.Add("OrderDate", typeof(DateTime));
dt.Rows.Add(1001, "ABC Corp", "Widget Pro", 50, 25.99m, DateTime.Now.AddDays(-5));
dt.Rows.Add(1002, "XYZ Ltd", "Widget Basic", 100, 15.99m, DateTime.Now.AddDays(-4));
dt.Rows.Add(1003, "ABC Corp", "Widget Premium", 25, 45.99m, DateTime.Now.AddDays(-3));
dt.Rows.Add(1004, "Tech Solutions", "Widget Pro", 75, 25.99m, DateTime.Now.AddDays(-2));
dt.Rows.Add(1005, "XYZ Ltd", "Widget Premium", 30, 45.99m, DateTime.Now.AddDays(-1));
return dt;
}
// Export to Excel
WorkBook reportWorkbook = WorkBook.Create();
WorkSheet reportSheet = reportWorkbook.CreateWorkSheet("Sales Report");
DataTable salesData = GetSalesData();
// Title row
reportSheet["A1"].Value = "Order Report - " + DateTime.Now.ToString("MMMM yyyy");
reportSheet.Merge("A1:F1");
reportSheet["A1"].Style.Font.Bold = true;
reportSheet["A1"].Style.Font.Height = 14;
// Headers
int headerRow = 3;
for (int col = 0; col < salesData.Columns.Count; col++)
{
reportSheet.SetCellValue(headerRow - 1, col, salesData.Columns[col].ColumnName);
}
var headers = reportSheet[$"A{headerRow}:F{headerRow}"];
headers.Style.Font.Bold = true;
headers.Style.SetBackgroundColor("#D9E1F2");
// Data rows
for (int row = 0; row < salesData.Rows.Count; row++)
{
for (int col = 0; col < salesData.Columns.Count; col++)
{
reportSheet.SetCellValue(row + headerRow, col, salesData.Rows[row][col]);
}
reportSheet[$"G{row + headerRow + 1}"].Formula = $"=D{row + headerRow + 1}*E{row + headerRow + 1}";
}
// Total header
reportSheet["G3"].Value = "Total";
reportSheet["G3"].Style.Font.Bold = true;
reportSheet["G3"].Style.SetBackgroundColor("#D9E1F2");
// Format currency and date columns
reportSheet[$"E{headerRow + 1}:E{headerRow + salesData.Rows.Count}"].FormatString = "$#,##0.00";
reportSheet[$"G{headerRow + 1}:G{headerRow + salesData.Rows.Count}"].FormatString = "$#,##0.00";
reportSheet[$"F{headerRow + 1}:F{headerRow + salesData.Rows.Count}"].FormatString = "MM/dd/yyyy";
// Summary section
int summaryRow = headerRow + salesData.Rows.Count + 2;
reportSheet[$"A{summaryRow}"].Value = "Summary";
reportSheet[$"A{summaryRow}"].Style.Font.Bold = true;
reportSheet[$"A{summaryRow + 1}"].Value = "Total Orders:";
reportSheet[$"B{summaryRow + 1}"].Formula = $"=COUNTA(A{headerRow + 1}:A{headerRow + salesData.Rows.Count})";
reportSheet[$"A{summaryRow + 2}"].Value = "Total Revenue:";
reportSheet[$"B{summaryRow + 2}"].Formula = $"=SUM(G{headerRow + 1}:G{headerRow + salesData.Rows.Count})";
reportSheet[$"B{summaryRow + 2}"].FormatString = "$#,##0.00";
for (int col = 0; col <= 6; col++) { reportSheet.AutoSizeColumn(col); }
reportWorkbook.EvaluateAll();
reportWorkbook.SaveAs("DatabaseExport.xlsx");
using System.Data;
using IronXL;
// Simulate database retrieval (replace with actual database code)
DataTable GetSalesData()
{
DataTable dt = new DataTable("Sales");
dt.Columns.Add("OrderID", typeof(int));
dt.Columns.Add("CustomerName", typeof(string));
dt.Columns.Add("Product", typeof(string));
dt.Columns.Add("Quantity", typeof(int));
dt.Columns.Add("UnitPrice", typeof(decimal));
dt.Columns.Add("OrderDate", typeof(DateTime));
dt.Rows.Add(1001, "ABC Corp", "Widget Pro", 50, 25.99m, DateTime.Now.AddDays(-5));
dt.Rows.Add(1002, "XYZ Ltd", "Widget Basic", 100, 15.99m, DateTime.Now.AddDays(-4));
dt.Rows.Add(1003, "ABC Corp", "Widget Premium", 25, 45.99m, DateTime.Now.AddDays(-3));
dt.Rows.Add(1004, "Tech Solutions", "Widget Pro", 75, 25.99m, DateTime.Now.AddDays(-2));
dt.Rows.Add(1005, "XYZ Ltd", "Widget Premium", 30, 45.99m, DateTime.Now.AddDays(-1));
return dt;
}
// Export to Excel
WorkBook reportWorkbook = WorkBook.Create();
WorkSheet reportSheet = reportWorkbook.CreateWorkSheet("Sales Report");
DataTable salesData = GetSalesData();
// Title row
reportSheet["A1"].Value = "Order Report - " + DateTime.Now.ToString("MMMM yyyy");
reportSheet.Merge("A1:F1");
reportSheet["A1"].Style.Font.Bold = true;
reportSheet["A1"].Style.Font.Height = 14;
// Headers
int headerRow = 3;
for (int col = 0; col < salesData.Columns.Count; col++)
{
reportSheet.SetCellValue(headerRow - 1, col, salesData.Columns[col].ColumnName);
}
var headers = reportSheet[$"A{headerRow}:F{headerRow}"];
headers.Style.Font.Bold = true;
headers.Style.SetBackgroundColor("#D9E1F2");
// Data rows
for (int row = 0; row < salesData.Rows.Count; row++)
{
for (int col = 0; col < salesData.Columns.Count; col++)
{
reportSheet.SetCellValue(row + headerRow, col, salesData.Rows[row][col]);
}
reportSheet[$"G{row + headerRow + 1}"].Formula = $"=D{row + headerRow + 1}*E{row + headerRow + 1}";
}
// Total header
reportSheet["G3"].Value = "Total";
reportSheet["G3"].Style.Font.Bold = true;
reportSheet["G3"].Style.SetBackgroundColor("#D9E1F2");
// Format currency and date columns
reportSheet[$"E{headerRow + 1}:E{headerRow + salesData.Rows.Count}"].FormatString = "$#,##0.00";
reportSheet[$"G{headerRow + 1}:G{headerRow + salesData.Rows.Count}"].FormatString = "$#,##0.00";
reportSheet[$"F{headerRow + 1}:F{headerRow + salesData.Rows.Count}"].FormatString = "MM/dd/yyyy";
// Summary section
int summaryRow = headerRow + salesData.Rows.Count + 2;
reportSheet[$"A{summaryRow}"].Value = "Summary";
reportSheet[$"A{summaryRow}"].Style.Font.Bold = true;
reportSheet[$"A{summaryRow + 1}"].Value = "Total Orders:";
reportSheet[$"B{summaryRow + 1}"].Formula = $"=COUNTA(A{headerRow + 1}:A{headerRow + salesData.Rows.Count})";
reportSheet[$"A{summaryRow + 2}"].Value = "Total Revenue:";
reportSheet[$"B{summaryRow + 2}"].Formula = $"=SUM(G{headerRow + 1}:G{headerRow + salesData.Rows.Count})";
reportSheet[$"B{summaryRow + 2}"].FormatString = "$#,##0.00";
for (int col = 0; col <= 6; col++) { reportSheet.AutoSizeColumn(col); }
reportWorkbook.EvaluateAll();
reportWorkbook.SaveAs("DatabaseExport.xlsx");
Imports System.Data
Imports IronXL
' Simulate database retrieval (replace with actual database code)
Function GetSalesData() As DataTable
Dim dt As New DataTable("Sales")
dt.Columns.Add("OrderID", GetType(Integer))
dt.Columns.Add("CustomerName", GetType(String))
dt.Columns.Add("Product", GetType(String))
dt.Columns.Add("Quantity", GetType(Integer))
dt.Columns.Add("UnitPrice", GetType(Decimal))
dt.Columns.Add("OrderDate", GetType(DateTime))
dt.Rows.Add(1001, "ABC Corp", "Widget Pro", 50, 25.99D, DateTime.Now.AddDays(-5))
dt.Rows.Add(1002, "XYZ Ltd", "Widget Basic", 100, 15.99D, DateTime.Now.AddDays(-4))
dt.Rows.Add(1003, "ABC Corp", "Widget Premium", 25, 45.99D, DateTime.Now.AddDays(-3))
dt.Rows.Add(1004, "Tech Solutions", "Widget Pro", 75, 25.99D, DateTime.Now.AddDays(-2))
dt.Rows.Add(1005, "XYZ Ltd", "Widget Premium", 30, 45.99D, DateTime.Now.AddDays(-1))
Return dt
End Function
' Export to Excel
Dim reportWorkbook As WorkBook = WorkBook.Create()
Dim reportSheet As WorkSheet = reportWorkbook.CreateWorkSheet("Sales Report")
Dim salesData As DataTable = GetSalesData()
' Title row
reportSheet("A1").Value = "Order Report - " & DateTime.Now.ToString("MMMM yyyy")
reportSheet.Merge("A1:F1")
reportSheet("A1").Style.Font.Bold = True
reportSheet("A1").Style.Font.Height = 14
' Headers
Dim headerRow As Integer = 3
For col As Integer = 0 To salesData.Columns.Count - 1
reportSheet.SetCellValue(headerRow - 1, col, salesData.Columns(col).ColumnName)
Next
Dim headers = reportSheet($"A{headerRow}:F{headerRow}")
headers.Style.Font.Bold = True
headers.Style.SetBackgroundColor("#D9E1F2")
' Data rows
For row As Integer = 0 To salesData.Rows.Count - 1
For col As Integer = 0 To salesData.Columns.Count - 1
reportSheet.SetCellValue(row + headerRow, col, salesData.Rows(row)(col))
Next
reportSheet($"G{row + headerRow + 1}").Formula = $"=D{row + headerRow + 1}*E{row + headerRow + 1}"
Next
' Total header
reportSheet("G3").Value = "Total"
reportSheet("G3").Style.Font.Bold = True
reportSheet("G3").Style.SetBackgroundColor("#D9E1F2")
' Format currency and date columns
reportSheet($"E{headerRow + 1}:E{headerRow + salesData.Rows.Count}").FormatString = "$#,##0.00"
reportSheet($"G{headerRow + 1}:G{headerRow + salesData.Rows.Count}").FormatString = "$#,##0.00"
reportSheet($"F{headerRow + 1}:F{headerRow + salesData.Rows.Count}").FormatString = "MM/dd/yyyy"
' Summary section
Dim summaryRow As Integer = headerRow + salesData.Rows.Count + 2
reportSheet($"A{summaryRow}").Value = "Summary"
reportSheet($"A{summaryRow}").Style.Font.Bold = True
reportSheet($"A{summaryRow + 1}").Value = "Total Orders:"
reportSheet($"B{summaryRow + 1}").Formula = $"=COUNTA(A{headerRow + 1}:A{headerRow + salesData.Rows.Count})"
reportSheet($"A{summaryRow + 2}").Value = "Total Revenue:"
reportSheet($"B{summaryRow + 2}").Formula = $"=SUM(G{headerRow + 1}:G{headerRow + salesData.Rows.Count})"
reportSheet($"B{summaryRow + 2}").FormatString = "$#,##0.00"
For col As Integer = 0 To 6
reportSheet.AutoSizeColumn(col)
Next
reportWorkbook.EvaluateAll()
reportWorkbook.SaveAs("DatabaseExport.xlsx")
Ten przykład ilustruje kompletny proces przepływu danych z bazy danych do programu Excel. DataTable symuluje pobieranie danych z bazy — w środowisku produkcyjnym należy zastąpić to rzeczywistymi zapytaniami do bazy danych przy użyciu Entity Framework, Dapper lub ADO.NET Framework. Podejście oparte na ręcznym mapowaniu zapewnia pełną kontrolę nad formatowaniem i układem, zgodnie z zaleceniami Microsoftu dotyczącymi najlepszych praktyk w zakresie eksportu danych.
Kod tworzy profesjonalny raport z tytułem, sformatowanymi nagłówkami i wierszami danych. Kolumny formuł obliczają sumy wierszy dynamicznie. W sekcji podsumowania wykorzystano formuły programu Excel do zliczania zamówień i sumowania przychodów, co gwarantuje aktualizację tych wartości w przypadku zmiany danych. Aby uzyskać informacje na temat pracy z zestawami danych (DataSet) i większymi strukturami danych, zapoznaj się z przewodnikiem dotyczącym konwersji plików Excel do zestawów danych (DataSet).
Wynik

Chcesz wdrożyć raportowanie w Excelu? Zdobądź licencję, aby w pełni wykorzystać potencjał IronXL w środowisku produkcyjnym.
Jak radzisz sobie z wieloma arkuszami?
Złożone pliki Excel często wymagają wielu arkuszy do uporządkowania powiązanych danych. IronXL upraszcza zarządzanie wieloma arkuszami dzięki intuicyjnym metodom tworzenia, uzyskiwania dostępu i organizowania arkuszy. Możesz otwierać arkusze skoroszytu i zarządzać nimi za pomocą zaledwie kilku wierszy kodu.
using IronXL;
WorkBook companyReport = WorkBook.Create();
// Create department sheets
WorkSheet salesSheet = companyReport.CreateWorkSheet("Sales");
WorkSheet inventorySheet = companyReport.CreateWorkSheet("Inventory");
WorkSheet summarySheet = companyReport.CreateWorkSheet("Summary");
// Populate Sales sheet
salesSheet["A1"].Value = "Sales Dashboard";
salesSheet["A3"].Value = "Region";
salesSheet["B3"].Value = "Q1 Sales";
salesSheet["C3"].Value = "Q2 Sales";
string[] regions = { "North", "South", "East", "West" };
decimal[] q1Sales = { 250000, 180000, 220000, 195000 };
decimal[] q2Sales = { 275000, 195000, 240000, 210000 };
for (int i = 0; i < regions.Length; i++)
{
salesSheet[$"A{i + 4}"].Value = regions[i];
salesSheet[$"B{i + 4}"].Value = q1Sales[i];
salesSheet[$"C{i + 4}"].Value = q2Sales[i];
}
// Populate Inventory sheet
inventorySheet["A1"].Value = "Inventory Status";
string[] products = { "Widget A", "Widget B", "Widget C" };
int[] stock = { 150, 45, 200 };
int[] reorderPoint = { 100, 50, 75 };
for (int i = 0; i < products.Length; i++)
{
inventorySheet[$"A{i + 4}"].Value = products[i];
inventorySheet[$"B{i + 4}"].Value = stock[i];
inventorySheet[$"C{i + 4}"].Value = reorderPoint[i];
string status = stock[i] <= reorderPoint[i] ? "REORDER" : "OK";
inventorySheet[$"D{i + 4}"].Value = status;
if (status == "REORDER")
inventorySheet[$"D{i + 4}"].Style.Font.Color = "#FF0000";
}
// Summary sheet with cross-sheet formulas
summarySheet["A1"].Value = "Company Overview";
summarySheet["A4"].Value = "Total Q1 Sales";
summarySheet["B4"].Formula = "=SUM(Sales!B4:B7)";
summarySheet["A5"].Value = "Total Q2 Sales";
summarySheet["B5"].Formula = "=SUM(Sales!C4:C7)";
summarySheet["A6"].Value = "Products Need Reorder";
summarySheet["B6"].Formula = "=COUNTIF(Inventory!D4:D6,\"REORDER\")";
// Apply consistent formatting across all sheets
foreach (WorkSheet sheet in companyReport.WorkSheets)
{
sheet["A1"].Style.Font.Bold = true;
sheet["A1"].Style.Font.Height = 14;
}
companyReport.SaveAs("CompanyReport.xlsx");
using IronXL;
WorkBook companyReport = WorkBook.Create();
// Create department sheets
WorkSheet salesSheet = companyReport.CreateWorkSheet("Sales");
WorkSheet inventorySheet = companyReport.CreateWorkSheet("Inventory");
WorkSheet summarySheet = companyReport.CreateWorkSheet("Summary");
// Populate Sales sheet
salesSheet["A1"].Value = "Sales Dashboard";
salesSheet["A3"].Value = "Region";
salesSheet["B3"].Value = "Q1 Sales";
salesSheet["C3"].Value = "Q2 Sales";
string[] regions = { "North", "South", "East", "West" };
decimal[] q1Sales = { 250000, 180000, 220000, 195000 };
decimal[] q2Sales = { 275000, 195000, 240000, 210000 };
for (int i = 0; i < regions.Length; i++)
{
salesSheet[$"A{i + 4}"].Value = regions[i];
salesSheet[$"B{i + 4}"].Value = q1Sales[i];
salesSheet[$"C{i + 4}"].Value = q2Sales[i];
}
// Populate Inventory sheet
inventorySheet["A1"].Value = "Inventory Status";
string[] products = { "Widget A", "Widget B", "Widget C" };
int[] stock = { 150, 45, 200 };
int[] reorderPoint = { 100, 50, 75 };
for (int i = 0; i < products.Length; i++)
{
inventorySheet[$"A{i + 4}"].Value = products[i];
inventorySheet[$"B{i + 4}"].Value = stock[i];
inventorySheet[$"C{i + 4}"].Value = reorderPoint[i];
string status = stock[i] <= reorderPoint[i] ? "REORDER" : "OK";
inventorySheet[$"D{i + 4}"].Value = status;
if (status == "REORDER")
inventorySheet[$"D{i + 4}"].Style.Font.Color = "#FF0000";
}
// Summary sheet with cross-sheet formulas
summarySheet["A1"].Value = "Company Overview";
summarySheet["A4"].Value = "Total Q1 Sales";
summarySheet["B4"].Formula = "=SUM(Sales!B4:B7)";
summarySheet["A5"].Value = "Total Q2 Sales";
summarySheet["B5"].Formula = "=SUM(Sales!C4:C7)";
summarySheet["A6"].Value = "Products Need Reorder";
summarySheet["B6"].Formula = "=COUNTIF(Inventory!D4:D6,\"REORDER\")";
// Apply consistent formatting across all sheets
foreach (WorkSheet sheet in companyReport.WorkSheets)
{
sheet["A1"].Style.Font.Bold = true;
sheet["A1"].Style.Font.Height = 14;
}
companyReport.SaveAs("CompanyReport.xlsx");
Imports IronXL
Dim companyReport As WorkBook = WorkBook.Create()
' Create department sheets
Dim salesSheet As WorkSheet = companyReport.CreateWorkSheet("Sales")
Dim inventorySheet As WorkSheet = companyReport.CreateWorkSheet("Inventory")
Dim summarySheet As WorkSheet = companyReport.CreateWorkSheet("Summary")
' Populate Sales sheet
salesSheet("A1").Value = "Sales Dashboard"
salesSheet("A3").Value = "Region"
salesSheet("B3").Value = "Q1 Sales"
salesSheet("C3").Value = "Q2 Sales"
Dim regions As String() = {"North", "South", "East", "West"}
Dim q1Sales As Decimal() = {250000, 180000, 220000, 195000}
Dim q2Sales As Decimal() = {275000, 195000, 240000, 210000}
For i As Integer = 0 To regions.Length - 1
salesSheet($"A{i + 4}").Value = regions(i)
salesSheet($"B{i + 4}").Value = q1Sales(i)
salesSheet($"C{i + 4}").Value = q2Sales(i)
Next
' Populate Inventory sheet
inventorySheet("A1").Value = "Inventory Status"
Dim products As String() = {"Widget A", "Widget B", "Widget C"}
Dim stock As Integer() = {150, 45, 200}
Dim reorderPoint As Integer() = {100, 50, 75}
For i As Integer = 0 To products.Length - 1
inventorySheet($"A{i + 4}").Value = products(i)
inventorySheet($"B{i + 4}").Value = stock(i)
inventorySheet($"C{i + 4}").Value = reorderPoint(i)
Dim status As String = If(stock(i) <= reorderPoint(i), "REORDER", "OK")
inventorySheet($"D{i + 4}").Value = status
If status = "REORDER" Then
inventorySheet($"D{i + 4}").Style.Font.Color = "#FF0000"
End If
Next
' Summary sheet with cross-sheet formulas
summarySheet("A1").Value = "Company Overview"
summarySheet("A4").Value = "Total Q1 Sales"
summarySheet("B4").Formula = "=SUM(Sales!B4:B7)"
summarySheet("A5").Value = "Total Q2 Sales"
summarySheet("B5").Formula = "=SUM(Sales!C4:C7)"
summarySheet("A6").Value = "Products Need Reorder"
summarySheet("B6").Formula = "=COUNTIF(Inventory!D4:D6,""REORDER"")"
' Apply consistent formatting across all sheets
For Each sheet As WorkSheet In companyReport.WorkSheets
sheet("A1").Style.Font.Bold = True
sheet("A1").Style.Font.Height = 14
Next
companyReport.SaveAs("CompanyReport.xlsx")
Ten przykład tworzy kompletny raport wielostronicowy. Każdy arkusz służy konkretnemu celowi: danym sprzedażowym, śledzeniu zapasów i podsumowaniu. Arkusz podsumowujący konsoliduje kluczowe wskaźniki przy użyciu formuł międzyarkuszowych. Zwróć uwagę na składnię odwołań do arkuszy — "Sales!B4:B7" odnosi się do komórek od B4 do B7 w arkuszu Sales.
Arkusz inwentaryzacyjny wykorzystuje logikę warunkówą, zaznaczając na czerwono pozycje o niskim stanie magazynowym, aby zwrócić na nie natychmiastową uwagę. Pętla foreach stosuje spójne formatowanie we wszystkich arkuszach, zapewniając profesjonalny wygląd całego skoroszytu. Nazwy arkuszy pojawiają się w programie Excel jako zakładki, co pozwala użytkownikom na łatwe przechodzenie między różnymi widokami danych.
Jakie są najlepsze praktyki dotyczące generowania plików Excel w języku C#?
Wydajne generowanie plików Excel w języku C# wymaga przemyślanego podejścia do wykorzystania pamięci, obsługi błędów i wdrażania. Te praktyki zapewniają skuteczne skalowanie aplikacji przy zachowaniu niezawodności podczas programowego tworzenia arkuszy kalkulacyjnych Excel.
Zarządzanie pamięcią staje się kluczowe w przypadku dużych plików. Przetwarzaj dane partiami, zamiast ładować całe zbiory danych naraz. Poniższy wzorzec pozwala zachować przewidywalne zużycie pamięci w przypadku eksportów o dużej objętości:
using IronXL;
WorkBook workbook = WorkBook.Create();
WorkSheet sheet = workbook.CreateWorkSheet("Data");
int rowsPerBatch = 1000;
int currentRow = 2;
sheet["A1"].Value = "ID";
sheet["B1"].Value = "Name";
sheet["C1"].Value = "Value";
// Process records in manageable batches
foreach (var batch in GetDataInBatches(rowsPerBatch))
{
foreach (var record in batch)
{
sheet[$"A{currentRow}"].Value = record.Id;
sheet[$"B{currentRow}"].Value = record.Name;
sheet[$"C{currentRow}"].Value = record.Value;
currentRow++;
}
}
workbook.SaveAs("LargeDataset.xlsx");
using IronXL;
WorkBook workbook = WorkBook.Create();
WorkSheet sheet = workbook.CreateWorkSheet("Data");
int rowsPerBatch = 1000;
int currentRow = 2;
sheet["A1"].Value = "ID";
sheet["B1"].Value = "Name";
sheet["C1"].Value = "Value";
// Process records in manageable batches
foreach (var batch in GetDataInBatches(rowsPerBatch))
{
foreach (var record in batch)
{
sheet[$"A{currentRow}"].Value = record.Id;
sheet[$"B{currentRow}"].Value = record.Name;
sheet[$"C{currentRow}"].Value = record.Value;
currentRow++;
}
}
workbook.SaveAs("LargeDataset.xlsx");
Imports IronXL
Dim workbook As WorkBook = WorkBook.Create()
Dim sheet As WorkSheet = workbook.CreateWorkSheet("Data")
Dim rowsPerBatch As Integer = 1000
Dim currentRow As Integer = 2
sheet("A1").Value = "ID"
sheet("B1").Value = "Name"
sheet("C1").Value = "Value"
' Process records in manageable batches
For Each batch In GetDataInBatches(rowsPerBatch)
For Each record In batch
sheet($"A{currentRow}").Value = record.Id
sheet($"B{currentRow}").Value = record.Name
sheet($"C{currentRow}").Value = record.Value
currentRow += 1
Next
Next
workbook.SaveAs("LargeDataset.xlsx")
W przypadku aplikacji internetowych generuj pliki Excel w pamięci i przesyłaj je bezpośrednio do użytkowników, zamiast zapisywać pliki tymczasowe na dysku. Zawsze należy otaczać logikę generowania procedurami obsługi błędów, aby zapobiegać awariom i zapewnić konstruktywne informacje zwrotne:
// ASP.NET Core controller action with error handling
IActionResult DownloadExcel()
{
try
{
WorkBook workbook = WorkBook.Create();
WorkSheet sheet = workbook.CreateWorkSheet("Report");
sheet["A1"].Value = "Report Data";
// Populate report data here...
var stream = new MemoryStream();
workbook.SaveAs(stream);
stream.Position = 0;
return File(stream,
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"report.xlsx");
}
catch (Exception ex)
{
Console.WriteLine($"Excel generation failed: {ex.Message}");
return StatusCode(500, "Failed to generate Excel file.");
}
}
// ASP.NET Core controller action with error handling
IActionResult DownloadExcel()
{
try
{
WorkBook workbook = WorkBook.Create();
WorkSheet sheet = workbook.CreateWorkSheet("Report");
sheet["A1"].Value = "Report Data";
// Populate report data here...
var stream = new MemoryStream();
workbook.SaveAs(stream);
stream.Position = 0;
return File(stream,
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"report.xlsx");
}
catch (Exception ex)
{
Console.WriteLine($"Excel generation failed: {ex.Message}");
return StatusCode(500, "Failed to generate Excel file.");
}
}
Imports System
Imports System.IO
Imports Microsoft.AspNetCore.Mvc
Public Class YourController
Inherits Controller
Public Function DownloadExcel() As IActionResult
Try
Dim workbook As WorkBook = WorkBook.Create()
Dim sheet As WorkSheet = workbook.CreateWorkSheet("Report")
sheet("A1").Value = "Report Data"
' Populate report data here...
Dim stream As New MemoryStream()
workbook.SaveAs(stream)
stream.Position = 0
Return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "report.xlsx")
Catch ex As Exception
Console.WriteLine($"Excel generation failed: {ex.Message}")
Return StatusCode(500, "Failed to generate Excel file.")
End Try
End Function
End Class
Poniższa tabela zawiera podsumowanie kluczowych najlepszych praktyk oraz wskazówki, kiedy należy je stosować:
| Scenariusz | Zalecane podejście | Korzyści |
|---|---|---|
| Large datasets (>10,000 rows) | Przetwarzanie wsadowe z zapisywaniem w fragmentach | Zmniejszone zużycie pamięci |
| Pobieranie aplikacji internetowych | MemoryStream zamiast plików tymczasowych | Brak operacji wejścia/wyjścia na dysku, szybsza reakcja |
| Wdrożenie produkcyjne | Dołącz ważny klucz licencyjny IronXL | Brak znaku wodnego na wygenerowanych plikach |
| Waluty i daty | Użyj właściwości FormatString | Prawidłowe wyświetlanie ustawień regionalnych w programie Excel |
| Raporty dynamiczne | Wywołaj funkcję EvaluateAll() przed SaveAs() | Wzory pokazują obliczone wartości |
IronXL działa w środowiskach o ograniczonych uprawnieniach, bez konieczności posiadania uprawnień administratora, dzięki czemu nadaje się do hostingu współdzielonego i wdrożeń kontenerowych. Dołącz plik licencji IronXL do pakietu wdrożeniowego i upewnij się, że Twoja aplikacja ma uprawnienia do zapisu dla wszelkich operacji na plikach tymczasowych, które mogą być potrzebne. Aby uzyskać dodatkowe wskazówki dotyczące wdrażania, zapoznaj się z przeglądem funkcji IronXL oraz pełną dokumentacją API.
Jakie są dalsze możliwości?
IronXL zmienia generowanie plików Excel w języku C# ze skomplikówanego wyzwania w proste kodowanie. Nauczyłeś się tworzyć skoroszyty, wypełniać komórki, stosować formatowanie, używać formuł, eksportować dane z baz danych oraz zarządzać wieloma arkuszami — wszystko to bez konieczności korzystania z pakietu Microsoft Office. Techniki te działają spójnie na platformach Windows, Linux i chmurowych przeznaczonych dla .NET 10.
Aby dowiedzieć się więcej, zapoznaj się z poradnikami IronXL dotyczącymi odczytu i modyfikacji istniejących plików Excel lub odwiedź stronę z Licencją Trial, aby rozpocząć pracę w środowisku produkcyjnym. Zobacz opcje licencji, które odpowiadają wymaganiom i skali Twojego projektu.

Często Zadawane Pytania
Jak mogę generować pliki Excel za pomocą języka C#?
Pliki Excel można generować w języku C# za pomocą biblioteki IronXL, która udostępnia proste API do tworzenia plików Excel bez konieczności instalowania pakietu Microsoft Office lub stosowania skomplikowanej interoperacyjności COM.
Czy Microsoft Office jest wymagany do pracy z plikami Excel w C#?
Nie, pakiet Microsoft Office nie jest wymagany. IronXL pozwala tworzyć i edytować pliki Excel w języku C# bez żadnych zależności od pakietu Office.
Jakie są zalety korzystania z IronXL w porównaniu z tradycyjnymi metodami?
IronXL upraszcza proces generowania plików Excel, eliminując potrzebę korzystania z pakietu Microsoft Office i skomplikowanej interoperacyjności COM, oferując proste API do tworzenia i edycji plików Excel.
Czy za pomocą IronXL mogę zintegrować bazy danych z plikami Excel?
Tak, IronXL obsługuje zaawansowane operacje, takie jak integracja z bazami danych, umożliwiając wydajny eksport danych do plików Excel.
Jakie formaty plików można generować za pomocą IronXL?
IronXL umożliwia tworzenie plików zarówno w formacie XLS, jak i XLSX, dzięki czemu jest wszechstronnym narzędziem dostosowanym do różnych potrzeb związanych z generowaniem plików Excel.
Czy IronXL obsługuje zaawansowane formatowanie w plikach Excel?
Tak, IronXL obsługuje zaawansowane funkcje formatowania, umożliwiając dostosowanie wyglądu i struktury plików Excel.
Czy możliwe jest zautomatyzowanie generowania arkuszy kalkulacyjnych za pomocą IronXL?
Tak, IronXL zapewnia narzędzia i techniki do automatycznego generowania arkuszy kalkulacyjnych, usprawniając procesy takie jak tworzenie raportów i eksport danych.
Jak mogę tworzyć raporty przy użyciu programu Excel w aplikacjach .NET?
IronXL oferuje łatwy sposób tworzenia raportów poprzez generowanie plików Excel bezpośrednio w aplikacjach .NET, zapewniając potężne rozwiązanie do prezentacji danych.
Jakie techniki są niezbędne do pracy z programem Excel w języku C#?
Podstawowe techniki pracy z programem Excel w języku C# przy użyciu biblioteki IronXL obejmują tworzenie arkuszy kalkulacyjnych, zaawansowane formatowanie oraz integrację z bazami danych.
Gdzie mogę znaleźć dokumentację dotyczącą korzystania z IronXL w języku C#?
Kompleksową dokumentację dotyczącą korzystania z IronXL w języku C# można znaleźć na stronie internetowej Iron Software, która zawiera samouczki i przykłady dla różnych przypadków użycia.




