Earn More by Sharing What You Love
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Tim Corey
55m 42s
Tworzenie i zarządzanie plikami Excel to kluczowa umiejętność dla każdego programisty C# tworzącego narzędzia do raportowania, eksportu danych czy interfejsów do wprowadzania danych przez użytkownika. W tym artykułe szczegółowo omawiamy przewodnik przedstawiony przez Tima Coreya w jego filmie "Creating Excel files in C#", gdzie pokazuje on, jak utworzyć plik Excel przy użyciu C#, sformatować go, a nawet odczytać z niego dane - wszystko z wykorzystaniem biblioteki EPPlus.
Niezależnie od tego, czy chcesz utworzyć nowy skoroszyt Excel z List, sformatować komórki arkusza Excel, czy też odczytać strukturalne dane z powrotem do swojej aplikacji, przykład Tima służy jako praktyczny poradnik dotyczący podstaw generowania plików Excel w C#.
Rozbijmy to krok po kroku, odwołując się do filmu Tima.
Tim zaczyna od wyjaśnienia, że Microsoft Excel jest jednym z najważniejszych narzędzi w biznesie. Pliki Excel są przyjazne dla użytkownika, wysoce wszechstronne i idealne do prezentacji danych. Podkreśla, że tworzenie plików Excel w C# może być używane jako zamiennik dla skomplikowanych rozwiązań raportowania - czyniąc Excel domyślnym narzędziem raportującym.
Cel: stworzyć aplikację Excel używając C#, wypełnić ją danymi, zastosować formatowanie, a następnie odczytać dane z tego pliku Excel.
Tim otwiera Visual Studio 2019, wybiera aplikację konsolową (.NET Core) i nazywa rozwiązanie ExcelDemoApp. Używanie aplikacji konsolowej zapewnia czyste i wolne od rozproszeń środowisko do skupienia się wyłącznie na kodzie związanym z Excel.
Aktualizuje środowisko docelowe do .NET 5.0, aby wykorzystać funkcje C# 9, takie jak uproszczona inicjalizacja obiektów.
Aby utworzyć skoroszyt Excel, Tim instaluje pakiet EPPlus za pośrednictwem Menedżera pakietów NuGet. EPPlus to biblioteka Excel, która współpracuje z plikami .xlsx (Open XML) i obsługuje pełną funkcjonalność Excel, taką jak wykresy, tabele, style i formuły - bez potrzeby instalowania MS Office lub Excel Interop.
Uwaga: EPPlus jest darmowy do użytku niekomercyjnego, ale wymaga licencji do zastosowań komercyjnych.
Kopiuje wymaganą linię akceptacji licencji niekomercyjnej do swojego kodu, aby uniknąć błędów wykonania, i dodaje niezbędną dyrektywę using OfficeOpenXml; dyrektywę.
Używając System.IO.FileInfo, Tim ustala zakodowaną na stałe ścieżkę pliku:
var file = new FileInfo(@"C:\demos\youtubedemo.xlsx");Dim file As New FileInfo("C:\demos\youtubedemo.xlsx")Dim file As New FileInfo("C:\demos\youtubedemo.xlsx")Ten plik nie istnieje początkowo - zostanie stworzony dynamicznie przez program.
Aby wypełnić arkusz Excel, Tim definiuje prostą klasę PersonModel z następującymi właściwościami:
int Id
string Imie
string Nazwisko
Używa metody pomocniczej GetSetupData(), aby zwrócić List<PersonModel> wypełnioną przykładowymi danymi, takimi jak Tim Corey, Sue Storm i Jane Smith.
We współczesnym programowaniu blokowanie wątku UI jest niedopuszczalne. Dlatego Tim definiuje metodę asynchroniczną:
static async Task SaveExcelFile(List<PersonModel> people, FileInfo file)static async Task SaveExcelFile(List<PersonModel> people, FileInfo file)Private Shared Async Function SaveExcelFile(people As List(Of PersonModel), file As FileInfo) As TaskPrivate Shared Async Function SaveExcelFile(people As List(Of PersonModel), file As FileInfo) As TaskPrzed zapisem do Excel sprawdza, czy plik istnieje i usuwa go, aby uniknąć konfliktów nazw.
if (file.Exists) file.Delete();if (file.Exists) file.Delete();If file.Exists Then file.Delete()If file.Exists Then file.Delete()Tim używa obiektu EPPlus ExcelPackage w bloku using, aby zapewnić właściwe zwolnienie zasobów:
using var package = new ExcelPackage(file);using var package = new ExcelPackage(file);Using package As New ExcelPackage(file)
End UsingUsing package As New ExcelPackage(file)
End UsingDodaje nowy arkusz do skoroszytu:
var ws = package.Workbook.Worksheets.Add("MainReport");var ws = package.Workbook.Worksheets.Add("MainReport");Dim ws = package.Workbook.Worksheets.Add("MainReport")Dim ws = package.Workbook.Worksheets.Add("MainReport")Używając LoadFromCollection, wstawia listę osób od komórki "A2":
ws.Cells["A2"].LoadFromCollection(people, true);ws.Cells["A2"].LoadFromCollection(people, true);ws.Cells("A2").LoadFromCollection(people, True)ws.Cells("A2").LoadFromCollection(people, True)Następnie AutoFitColumns() automatycznie dostosowuje szerokości kolumn:
ws.Cells[ws.Dimension.Address].AutoFitColumns();ws.Cells[ws.Dimension.Address].AutoFitColumns();ws.Cells(ws.Dimension.Address).AutoFitColumns()ws.Cells(ws.Dimension.Address).AutoFitColumns()W końcu zapisuje plik Excel:
await package.SaveAsync();await package.SaveAsync();Await package.SaveAsync()Await package.SaveAsync()Aby plik Excel był bardziej czytelny, Tim pokazuje, jak zastosować style:
ws.Cells["A1"].Value = "Our Cool Report";
ws.Cells["A1:C1"].Merge = true; ws.Row(1).Style.Font.Size = 24;
ws.Row(1).Style.Font.Color.SetColor(Color.Blue);
ws.Column(1).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;ws.Cells["A1"].Value = "Our Cool Report";
ws.Cells["A1:C1"].Merge = true; ws.Row(1).Style.Font.Size = 24;
ws.Row(1).Style.Font.Color.SetColor(Color.Blue);
ws.Column(1).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;ws.Cells("A1").Value = "Our Cool Report"
ws.Cells("A1:C1").Merge = True
ws.Row(1).Style.Font.Size = 24
ws.Row(1).Style.Font.Color.SetColor(Color.Blue)
ws.Column(1).Style.HorizontalAlignment = ExcelHorizontalAlignment.Centerws.Cells("A1").Value = "Our Cool Report"
ws.Cells("A1:C1").Merge = True
ws.Row(1).Style.Font.Size = 24
ws.Row(1).Style.Font.Color.SetColor(Color.Blue)
ws.Column(1).Style.HorizontalAlignment = ExcelHorizontalAlignment.Centerws.Row(2).Style.Font.Bold = true;
ws.Row(2).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;ws.Row(2).Style.Font.Bold = true;
ws.Row(2).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;ws.Row(2).Style.Font.Bold = True
ws.Row(2).Style.HorizontalAlignment = ExcelHorizontalAlignment.Centerws.Row(2).Style.Font.Bold = True
ws.Row(2).Style.HorizontalAlignment = ExcelHorizontalAlignment.Centerws.Column(3).Width = 20;ws.Column(3).Width = 20;ws.Column(3).Width = 20ws.Column(3).Width = 20Ta sekcja demonstruje zaawansowane formatowanie, takie jak:
Scałanie komórek
Stylizowanie czcionki
Kolory tła
Wyrównanie wierszy/kolumn
Dostosowania szerokości
Te funkcje naśladują typicalne funkcje formatowania MS Office Excel.
Teraz, gdy zapisaliśmy dane do Excel, czas je odczytać z powrotem do C#.
Tim przedstawia metodę:
static async Task<List<PersonModel>> LoadExcelFile(FileInfo file)static async Task<List<PersonModel>> LoadExcelFile(FileInfo file)Private Shared Async Function LoadExcelFile(file As FileInfo) As Task(Of List(Of PersonModel))Private Shared Async Function LoadExcelFile(file As FileInfo) As Task(Of List(Of PersonModel))Ustawia liczniki wierszy i kolumn:
int row = 3; // Skip title and header rows int col = 1;int row = 3; // Skip title and header rows int col = 1;Dim row As Integer = 3 ' Skip title and header rows
Dim col As Integer = 1Dim row As Integer = 3 ' Skip title and header rows
Dim col As Integer = 1Używając pętli while, sprawdza niepuste komórki i odczytuje wartości:
while (!string.IsNullOrWhiteSpace(ws.Cells[row, col].Value?.ToString()))while (!string.IsNullOrWhiteSpace(ws.Cells[row, col].Value?.ToString()))While Not String.IsNullOrWhiteSpace(ws.Cells(row, col).Value?.ToString())While Not String.IsNullOrWhiteSpace(ws.Cells(row, col).Value?.ToString())W pętli wartości są odczytywane i parsowane:
p.Id = int.Parse(ws.Cells[row, col].Value.ToString());
p.FirstName = ws.Cells[row, col + 1].Value.ToString();
p.LastName = ws.Cells[row, col + 2].Value.ToString();p.Id = int.Parse(ws.Cells[row, col].Value.ToString());
p.FirstName = ws.Cells[row, col + 1].Value.ToString();
p.LastName = ws.Cells[row, col + 2].Value.ToString();p.Id = Integer.Parse(ws.Cells(row, col).Value.ToString())
p.FirstName = ws.Cells(row, col + 1).Value.ToString()
p.LastName = ws.Cells(row, col + 2).Value.ToString()p.Id = Integer.Parse(ws.Cells(row, col).Value.ToString())
p.FirstName = ws.Cells(row, col + 1).Value.ToString()
p.LastName = ws.Cells(row, col + 2).Value.ToString()Lista<List<PersonModel>> jest wypełniana i zwracana.
Tim przechodzi przez zwróconą listę i zapisuje każdy wpis na konsolę:
foreach (var p in peopleFromExcel)
{
Console.WriteLine($"{p.Id} {p.FirstName} {p.LastName}");
}foreach (var p in peopleFromExcel)
{
Console.WriteLine($"{p.Id} {p.FirstName} {p.LastName}");
}For Each p In peopleFromExcel
Console.WriteLine($"{p.Id} {p.FirstName} {p.LastName}")
NextFor Each p In peopleFromExcel
Console.WriteLine($"{p.Id} {p.FirstName} {p.LastName}")
NextAby zademonstrować elastyczność Excel jako narzędzia wejściowego dla użytkownika, Tim ręcznie dodaje nowe rekordy ("Bill Smith", "Mary White") bezpośrednio w pliku Excel. Po ponownym uruchomieniu aplikacji, wpisy te są importowane bez zmiany kodu - potwierdzając potencjał Excel jako interfejsu wprowadzania danych.
Tim podkreśla przypadki użycia rozwiązania Excel w C#:
Eksportowanie tabel bazy danych do Excel
Importowanie danych wprowadzonych przez użytkowników końcowych
Użycie Excel jako dashboardu raportującego
Tworzenie strukturalnych skoroszytów do przetwarzania danych
I wszystko to bez polegania na Microsoft.Office.Interop.Excel, który wymaga zainstalowanego Excel.
Tim wyjaśnia, że pliki .xlsx utworzone programatycznie nie zawierają pełnych metadanych, dopóki nie zostaną otwarte i zapisane w Excel. Dlatego rozmiar pliku rośnie po jego otwarciu w prawdziwej aplikacji Excel.
Zauważa również, że EPPlus to dopracowana, solidna biblioteka z obsługą dla:
Wykresów
Obrazów
Mikrowykresów
Formuł
Ustawień stron
Obramowań
Formatowania komórek
Tworzenie plików Excel w C# nie musi być trudne ani kosztowne. Dzięki bibliotece Excel EPPlus, programiści mogą tworzyć dokumenty Excel pełne funkcji programatycznie bez potrzeby korzystania z MS Office. Jak pokazuje Tim Corey, zaledwie kilkoma liniami kodu możesz:
Stworzyć plik Excel
Wypełniać wiersze i kolumny
Zastosować stylizowanie
Odczytywać dane z powrotem
Zastosować Excel jako interfejs użytkownika
Czyni to fantastycznym wyborem dla lekkich narzędzi raportujących, importu/eksportu danych lub po prostu dostarczenia użytkownikom znanego im interfejsu.
Więc następnym razem, gdy tworzysz projekt i musisz wyprowadzić lub zużywać dane Excel, spróbuj wdrożyć przykładowy kod z filmu Tima Coreya film - i wprowadź siłę Excel do swoich aplikacji .NET Framework lub .NET Core.
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Join our newsletter, you’ll get exclusive access on article updates. We value your privacy