Przejdź do treści stopki
KORZYSTANIE Z IRONXL

Alternatywa dla odczytu pliku Excel za pomocą StreamReader w C# — IronXL

Wielu programistów C# napotyka typowe wyzwanie podczas próby odczytania plików arkuszy Excel: ich sprawdzony StreamReader, który działa idealnie w przypadku plików tekstowych, w tajemniczy sposób zawodzi w przypadku dokumentów Excel. Jeśli próbowałeś odczytać plik Excel za pomocą StreamReader w języku C# i zobaczyłeś tylko zniekształcone znaki lub wyjątki, nie jesteś sam. W tym samouczku wyjaśniono, dłączego StreamReader nie może obsługiwać plików Excel bezpośrednio, oraz pokazano właściwe rozwiązanie z wykorzystaniem IronXL bez Excel Interop.

Często pojawia się niejasność, ponieważ pliki CSV, które można otworzyć w programie Excel, działają poprawnie z StreamReader. Jednak prawdziwe pliki Excel (XLSX, XLS) wymagają zupełnie innego podejścia. Zrozumienie tej różnicy pozwoli Ci zaoszczędzić wiele godzin na debugowaniu i doprowadzi Cię do wyboru odpowiedniego narzędzia do danego zadania.

Alternatywa dla odczytu pliku Excel za pomocą StreamReader w C# — IronXL: Obraz 1 — IronXL

Dłączego StreamReader nie może odczytywać plików Excel?

StreamReader jest przeznaczony do plików tekstowych, odczytujących dane znakowe wiersz po wierszu przy użyciu określonego kodowania. Pliki Excel, pomimo wyglądu arkusza kalkulacyjnego, są w rzeczywistości złożonymi strukturami binarnymi lub skompresowanymi w formacie ZIP plikami XML, których StreamReader nie potrafi zinterpretować.

static void Main(string[] args)
{
    // This code will NOT work - demonstrates the problem
    using (StreamReader reader = new StreamReader("ProductData.xlsx"))
    {
        string content = reader.ReadLine(); // read data
        Console.WriteLine(content); // Outputs garbled binary data
    }
}
static void Main(string[] args)
{
    // This code will NOT work - demonstrates the problem
    using (StreamReader reader = new StreamReader("ProductData.xlsx"))
    {
        string content = reader.ReadLine(); // read data
        Console.WriteLine(content); // Outputs garbled binary data
    }
}
Option Strict On



Imports System.IO

Module Program
    Sub Main(args As String())
        ' This code will NOT work - demonstrates the problem
        Using reader As New StreamReader("ProductData.xlsx")
            Dim content As String = reader.ReadLine() ' read data
            Console.WriteLine(content) ' Outputs garbled binary data
        End Using
    End Sub
End Module
$vbLabelText   $csharpLabel

Po uruchomieniu tego fragmentu kodu klasy zamiast danych z arkusza kalkulacyjnego zobaczysz nieznane dane binarne, takie jak "PK♥♦" lub podobne znaki systemówe. Dzieje się tak, ponieważ pliki XLSX są archiwami ZIP zawierającymi wiele plików XML, podczas gdy pliki XLS wykorzystują zastrzeżony format binarny. StreamReader oczekuje zwykłego tekstu i próbuje interpretować te złożone struktury jako znaki, co skutkuje bezsensownym wynikiem.

Przykładowe dane wejściowe

Alternatywa dla odczytu pliku Excel za pomocą StreamReader w C# — IronXL: Obraz 2 — Dane wejściowe Excel

Wynik

Alternatywa dla odczytu pliku Excel za pomocą StreamReader w C# — IronXL: Obraz 3 — Wynik konsoli

Nowoczesne pliki Excel (XLSX) zawierają wiele elementów: arkusze, style, wspólne ciągi znaków i relacje, a wszystko to w jednym pakiecie. Ta złożoność wymaga specjalistycznych bibliotek, które rozumieją strukturę plików Excel, co prowadzi nas do IronXL.

Jak odczytywać pliki Excel za pomocą IronXL?

IronXL zapewnia proste rozwiązanie do odczytu plików Excel w języku C#. W przeciwieństwie do StreamReader, IronXL rozumie wewnętrzną strukturę programu Excel i zapewnia intuicyjne metody dostępu do danych. Biblioteka obsługuje systemy Windows, Linux, macOS oraz kontenery Docker, dzięki czemu idealnie nadaje się do nowoczesnych, wielopłatformowych aplikacji.

Alternatywa dla odczytu pliku Excel przy użyciu StreamReader w C# — IronXL: Obraz 4 — Wielopłatformowy

Najpierw zainstaluj IronXL za pomocą menedżera pakietów NuGet:

Install-Package IronXl.Excel

Alternatywa dla odczytu pliku Excel za pomocą StreamReader w C# — IronXL: Ilustracja 5 — Instalacja

Oto jak poprawnie odczytać plik Excel:

using IronXL;
// Load the Excel file
WorkBook workbook = WorkBook.Load("sample.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;
// Read specific cell values
string cellValue = worksheet["A1"].StringValue;
Console.WriteLine($"Cell A1 contains: {cellValue}");
// Read a range of cells
foreach (var cell in worksheet["A1:C5"])
{
    Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}
using IronXL;
// Load the Excel file
WorkBook workbook = WorkBook.Load("sample.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;
// Read specific cell values
string cellValue = worksheet["A1"].StringValue;
Console.WriteLine($"Cell A1 contains: {cellValue}");
// Read a range of cells
foreach (var cell in worksheet["A1:C5"])
{
    Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}
Imports IronXL

' Load the Excel file
Dim workbook As WorkBook = WorkBook.Load("sample.xlsx")
Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
' Read specific cell values
Dim cellValue As String = worksheet("A1").StringValue
Console.WriteLine($"Cell A1 contains: {cellValue}")
' Read a range of cells
For Each cell In worksheet("A1:C5")
    Console.WriteLine($"{cell.AddressString}: {cell.Text}")
Next
$vbLabelText   $csharpLabel

Ten kod z powodzeniem ładuje plik Excel i zapewnia łatwy dostęp do wartości komórek. Metoda WorkBook.Load automatycznie wykrywa format pliku (XLSX, XLS, XLSM, CSV) i wewnętrznie obsługuje wszystkie złożone operacje parsowania. Dostęp do komórek można uzyskać za pomocą znanej notacji programu Excel, takiej jak "A1", lub zakresów, takich jak "A1:C5", dzięki czemu kod jest intuicyjny dla każdego, kto zna program Excel.

Jak odczytywać dane z Excela ze strumieni pamięci?

W rzeczywistych zastosowaniach często konieczne jest przetwarzanie plików Excel z strumieni, a nie z dysku. Typowe scenariusze obejmują obsługę przesyłania plików przez Internet, pobieranie plików z baz danych lub przetwarzanie danych z pamięci masowej w chmurze. IronXL elegancko radzi sobie z takimi sytuacjami:

using IronXL;
using System.IO;
// Read Excel from a memory stream
byte[] fileBytes = File.ReadAllBytes("ProductData.xlsx");
using (MemoryStream stream = new MemoryStream(fileBytes))
{
    WorkBook workbook = WorkBook.FromStream(stream);
    WorkSheet worksheet = workbook.DefaultWorkSheet;
    // Process the data
    int rowCount = worksheet.RowCount;
    Console.WriteLine($"The worksheet has {rowCount} rows");
    // Read all data into a new DataTable, return dt
    var dataTable = worksheet.ToDataTable(false);
    // Return DataTable row count
    Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows");
}
using IronXL;
using System.IO;
// Read Excel from a memory stream
byte[] fileBytes = File.ReadAllBytes("ProductData.xlsx");
using (MemoryStream stream = new MemoryStream(fileBytes))
{
    WorkBook workbook = WorkBook.FromStream(stream);
    WorkSheet worksheet = workbook.DefaultWorkSheet;
    // Process the data
    int rowCount = worksheet.RowCount;
    Console.WriteLine($"The worksheet has {rowCount} rows");
    // Read all data into a new DataTable, return dt
    var dataTable = worksheet.ToDataTable(false);
    // Return DataTable row count
    Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows");
}
Imports IronXL
Imports System.IO

' Read Excel from a memory stream
Dim fileBytes As Byte() = File.ReadAllBytes("ProductData.xlsx")
Using stream As New MemoryStream(fileBytes)
    Dim workbook As WorkBook = WorkBook.FromStream(stream)
    Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
    ' Process the data
    Dim rowCount As Integer = worksheet.RowCount
    Console.WriteLine($"The worksheet has {rowCount} rows")
    ' Read all data into a new DataTable, return dt
    Dim dataTable = worksheet.ToDataTable(False)
    ' Return DataTable row count
    Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows")
End Using
$vbLabelText   $csharpLabel

Metoda WorkBook.FromStream akceptuje dowolny typ strumienia, niezależnie od tego, czy jest to MemoryStream, FileStream czy strumień sieciowy. Ta elastyczność pozwala przetwarzać pliki Excel z różnych źródeł bez konieczności ich uprzedniego zapisywania na dysku. Przykład pokazuje również konwersję danych z arkusza do tabeli DataTable, która płynnie integruje się z bazami danych i scenariuszami powiązania danych.

Wynik

Alternatywa dla odczytu pliku Excel za pomocą StreamReader w C# — IronXL: Ilustracja 6 — Odczyt pliku Excel z wyjścia MemoryStream

Kiedy należy używać obiektu sender do odczytu danych?

W przypadkach, gdy kod ten jest używany w programowaniu sterowanym zdarzeniami (na przykład obsługa przycisku przesyłania plików w Windows Forms lub ASP.NET), sygnatura jednej metody często zawiera parametry takie jak object sender i EventArgs e. Ten kontekst zapewnia, że logika przetwarzania w Excelu prawidłowo łączy się z wydarzeniami interfejsu użytkownika lub usługi.

Alternatywa dla odczytu pliku Excel za pomocą StreamReader w C# — IronXL: Ilustracja 7 — Funkcje

Jak konwertować pliki między formatami Excel i CSV?

Chociaż StreamReader obsługuje pliki CSV, często konieczna jest konwersja między formatami Excel i CSV. IronXL sprawia, że konwersja ta jest prosta:

using IronXL;
// Load an Excel file and save as CSV
WorkBook workbook = WorkBook.Load("data.xlsx");
workbook.SaveAsCsv("output.csv");
// Load a CSV file and save as Excel
WorkBook csvWorkbook = WorkBook.LoadCSV("input.csv");
csvWorkbook.SaveAs("output.xlsx");
// Export specific worksheet to CSV
WorkSheet worksheet = workbook.WorkSheets[0];
worksheet.SaveAsCsv("worksheet1.csv");
using IronXL;
// Load an Excel file and save as CSV
WorkBook workbook = WorkBook.Load("data.xlsx");
workbook.SaveAsCsv("output.csv");
// Load a CSV file and save as Excel
WorkBook csvWorkbook = WorkBook.LoadCSV("input.csv");
csvWorkbook.SaveAs("output.xlsx");
// Export specific worksheet to CSV
WorkSheet worksheet = workbook.WorkSheets[0];
worksheet.SaveAsCsv("worksheet1.csv");
Imports IronXL

' Load an Excel file and save as CSV
Dim workbook As WorkBook = WorkBook.Load("data.xlsx")
workbook.SaveAsCsv("output.csv")

' Load a CSV file and save as Excel
Dim csvWorkbook As WorkBook = WorkBook.LoadCSV("input.csv")
csvWorkbook.SaveAs("output.xlsx")

' Export specific worksheet to CSV
Dim worksheet As WorkSheet = workbook.WorkSheets(0)
worksheet.SaveAsCsv("worksheet1.csv")
$vbLabelText   $csharpLabel

Te konwersje pozwalają zachować dane przy zmianie formatu pliku. Podczas konwersji pliku Excel do formatu CSV program IronXL domyślnie spłaszcza pierwszy arkusz, ale można określić, który arkusz ma zostać wyeksportowany. Konwersja z formatu CSV do Excela tworzy poprawnie sformatowany arkusz kalkulacyjny, który zachowuje typy danych i umożliwia przyszłe formatowanie oraz dodawanie formuł.

Wnioski

StreamReader nie jest w stanie przetwarzać plików Excel ze względu na zasadniczą różnicę między zwykłym tekstem a złożoną strukturą plików Excel. Chociaż StreamReader działa idealnie w przypadku plików CSV i innych formatów tekstowych, prawdziwe pliki Excel wymagają specjalistycznej biblioteki, takiej jak IronXL, która rozumie zawarte w nich struktury binarne i XML.

IronXL zapewnia eleganckie rozwiązanie dzięki intuicyjnemu API, obsłudze wielu formatów oraz płynnym możliwościom przetwarzania strumieniowego. Niezależnie od tego, czy tworzysz aplikacje internetowe, oprogramowanie desktopowe czy usługi w chmurze, IronXL niezawodnie obsługuje pliki Excel na wszystkich platformach.

Alternatywa dla odczytu pliku Excel przy użyciu StreamReader w C# — IronXL: Ilustracja 8 — Licencjonowanie

Gotowy, aby zacząć prawidłowo pracować z plikami Excel? Pobierz bezpłatną wersję próbną IronXL i ciesz się bezproblemowym przetwarzaniem plików Excel w swoich aplikacjach C#. W przypadku wdrożeń produkcyjnych warto rozważyć opcje licencji IronXL, które najlepiej odpowiadają potrzebom projektu.

Często Zadawane Pytania

Dlaczego nie mogę użyć StreamReader do odczytu plików Excel w C#?

StreamReader jest przeznaczony do odczytu plików tekstowych i nie obsługuje binarnego formatu plików Excel, co skutkuje zamazanymi znakami lub wyjątkami.

Jak jest zalecany sposób odczytywania plików Excel w C#?

Zalecanym sposobem odczytu plików Excel w C# jest użycie IronXL, który może bezpośrednio odczytywać i manipulować plikami Excel bez potrzeby stosowania Excel Interop.

Jakie są zalety używania IronXL w porównaniu do StreamReader dla plików Excel?

IronXL jest specjalnie zaprojektowany do obsługi formatu plików Excel, co pozwala na dokładne odczytywanie i manipulowanie danymi, wspierając różnorodne funkcje takie jak formuły, wykresy i formatowanie.

Czy potrzebuję Excel Interop do używania IronXL?

Nie, IronXL działa niezależnie od Excel Interop, pozwalając na pracę z plikami Excel bez konieczności posiadania zainstalowanego programu Excel na swoim komputerze.

Czy IronXL obsługuje różne formaty plików Excel?

Tak, IronXL obsługuje wiele formatów plików Excel, w tym .xls, .xlsx, i .csv, zapewniając elastyczność w obsłudze różnych typów dokumentów Excel.

Czy IronXL nadaje się do dużych plików Excel?

Tak, IronXL jest zoptymalizowany pod kątem wydajności i może efektywnie obsługiwać duże pliki Excel, dzięki czemu nadaje się do aplikacji przetwarzających obszerne zbiory danych.

Jak porównuje się IronXL z innymi bibliotekami C# do manipulacji plikami Excel?

IronXL oferuje przyjazny dla użytkownika interfejs API, wszechstronne wsparcie dla funkcji Excel i nie wymaga instalacji Excel, co czyni go solidnym wyborem w porównaniu do innych bibliotek.

Jordi Bardia
Inżynier oprogramowania
Jordi jest najbardziej biegły w Pythonie, C# i C++. Kiedy nie wykorzystuje swoich umiejętności w Iron Software, programuje gry. Dzieląc odpowiedzialność za testowanie produktów, rozwój produktów i badania, Jordi wnosi ogromną wartość do ciągłej poprawy produktów. Różnorodne doświadczenia ...
Czytaj więcej

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie