Passer au contenu du pied de page
UTILISATION D'IRONXL

Comment lire des fichiers Excel en C# sans utiliser StreamReader ?

De nombreux développeurs C# rencontrent un défi frustrant lorsqu'ils travaillent avec des fichiers Excel : la classe StreamReader, qui gère les fichiers texte de manière fiable, échoue complètement lorsqu'elle est pointée vers un document Excel. Si vous avez essayé de lire un fichier Excel en utilisant StreamReader en C# et que vous n'avez vu que des caractères brouillés, du bruit binaire ou des exceptions inattendues, vous n'êtes pas seul. Ce guide explique précisément pourquoi StreamReader ne peut pas gérer les fichiers Excel et vous montre comment résoudre correctement le problème en utilisant IronXL -- une bibliothèque Excel dédiée for .NET qui ne nécessite aucune installation d'Excel.

La confusion survient souvent parce que les fichiers CSV — qu'Excel peut ouvrir et enregistrer — fonctionnent parfaitement avec StreamReader. Les véritables fichiers Excel (XLSX, XLS, XLSM) nécessitent une approche fondamentalement différente. Comprendre cette distinction vous épargnera des heures de débogage et vous orientera vers l'outil adapté à la tâche.

Alternative pour lire un fichier Excel avec StreamReader en C# - IronXL: Image 1 - IronXL

Pourquoi StreamReader ne peut-il pas lire les fichiers Excel ?

StreamReader est un lecteur basé sur du texte. Il lit les données de caractères ligne par ligne en utilisant un encodage spécifié (UTF-8, ASCII, etc.) et ne tient pas compte des structures binaires ni des archives compressées. La documentation officielle de .NET StreamReader confirme que cette classe est conçue exclusivement pour le texte encodé en caractères. Les fichiers Excel, bien qu'ils ressemblent à de simples feuilles de calcul, sont en réalité des structures binaires complexes ou des structures XML compressées ZIP que StreamReader ne peuvent pas interpréter.

Lorsque vous ouvrez un fichier XLSX avec StreamReader, vous essayez essentiellement de lire une archive ZIP comme du texte brut. Le résultat est un flux de bruit binaire au lieu des données de votre feuille de calcul.

// This code will NOT work -- demonstrates the problem
using StreamReader reader = new StreamReader("ProductData.xlsx");
string content = reader.ReadLine();
Console.WriteLine(content); // Outputs garbled binary data like "PK♥♦"
// This code will NOT work -- demonstrates the problem
using StreamReader reader = new StreamReader("ProductData.xlsx");
string content = reader.ReadLine();
Console.WriteLine(content); // Outputs garbled binary data like "PK♥♦"
$vbLabelText   $csharpLabel

Lorsque vous exécutez ce fragment de code, au lieu d'afficher les lignes de votre feuille de calcul, vous obtenez des caractères binaires tels que PK♥♦ ou des caractères parasites similaires. Cela se produit pour les raisons suivantes :

  • Les fichiers XLSX sont des archives ZIP contenant plusieurs fichiers XML : feuilles de calcul, styles, chaînes partagées, relations. La documentation du kit de développement logiciel Open XML (SDK) fournit une description détaillée de cette structure.
  • Les fichiers XLS utilisent un format binaire propriétaire (BIFF – Binary Interchange Format de fichier).
  • StreamReader applique un encodage de caractères à tous les octets qu'il lit, produisant une sortie incompréhensible pour les deux formats

Entrée d'exemple

Alternative pour lire un fichier Excel avec StreamReader en C# - IronXL: Image 2 - Entrée Excel

Affichage brouillé lors de l'utilisation de StreamReader

Alternative pour lire un fichier Excel avec StreamReader en C# - IronXL: Image 3 - Sortie console

Pourquoi le format CSV fonctionne-t-il et pas le format XLSX ?

Le format CSV (Comma-Separated Values) est un format texte brut. Chaque ligne correspond à une ligne de texte, et chaque colonne est séparée par une virgule. StreamReader lit les fichiers CSV sans problème car ils ne contiennent aucune donnée binaire ni archive compressée. XLSX est fondamentalement différent : il regroupe plusieurs documents XML dans un conteneur ZIP avec des métadonnées, des thèmes et des définitions de style. Il n'est pas possible de lire simplement ligne par ligne.

Cette distinction est importante lors du choix de votre outillage. Pour les fichiers CSV, StreamReader ou File.ReadAllLines sont parfaitement adéquats. Pour les véritables classeurs Excel, vous avez besoin d'une bibliothèque qui comprenne le format au niveau structurel.

Comment installer IronXL dans un projet .NET ?

IronXL est une bibliothèque .NET qui permet de lire, d'écrire et de créer des fichiers Excel sans nécessiter l'installation de Microsoft Excel. Il prend en charge les formats XLSX, XLS, XLSM, CSV et TSV, et fonctionne sous Windows, Linux, macOS et dans les conteneurs Docker.

Pour installer IronXL, utilisez soit la console du gestionnaire de packages NuGet, soit l'interface de ligne de commande .NET . Le package est publié sur NuGet sous le nom IronXL :

Install-Package IronXL
dotnet add package IronXL
Install-Package IronXL
dotnet add package IronXL
SHELL

Après l'installation, ajoutez la directive using IronXL; à votre fichier et vous êtes prêt à travailler avec des documents Excel.

Alternative pour lire un fichier Excel avec StreamReader en C# - IronXL: Image 5 - Installation

Pour connaître les étapes d'installation détaillées et les options de configuration NuGet , consultez le guide d'installation NuGet IronXL . Une licence d'essai gratuite est disponible pour vous permettre d'évaluer IronXL dans votre projet avant de l'acheter.

Alternative pour lire un fichier Excel avec StreamReader en C# - IronXL: Image 4 - Multiplateforme

Comment lire des fichiers Excel avec IronXL?

IronXL fournit une API intuitive pour la lecture de fichiers Excel en C#. Contrairement à StreamReader, IronXL comprend la structure interne d'Excel et vous offre un accès clair aux lignes, aux colonnes et aux valeurs des cellules. La documentation IronXL fournit des références API complètes pour toutes les opérations prises en charge.

Voici comment lire un fichier Excel à l'aide IronXL avec des instructions de niveau supérieur :

using IronXL;

// Load the Excel file from disk
WorkBook workbook = WorkBook.Load("ProductData.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;

// Read a specific cell by address
string cellValue = worksheet["A1"].StringValue;
Console.WriteLine($"Cell A1 contains: {cellValue}");

// Iterate over a range of cells
foreach (var cell in worksheet["A1:C10"])
{
    Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}

// Read a numeric value
decimal price = worksheet["B2"].DecimalValue;
Console.WriteLine($"Price: {price:C}");
using IronXL;

// Load the Excel file from disk
WorkBook workbook = WorkBook.Load("ProductData.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;

// Read a specific cell by address
string cellValue = worksheet["A1"].StringValue;
Console.WriteLine($"Cell A1 contains: {cellValue}");

// Iterate over a range of cells
foreach (var cell in worksheet["A1:C10"])
{
    Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}

// Read a numeric value
decimal price = worksheet["B2"].DecimalValue;
Console.WriteLine($"Price: {price:C}");
$vbLabelText   $csharpLabel

La méthode WorkBook.Load détecte automatiquement le format du fichier (XLSX, XLS, XLSM, CSV) et gère toute l'analyse complexe. Vous accédez aux cellules en utilisant la notation Excel standard telle que "A1" ou aux plages telles que "A1:C10", ce qui rend le code immédiatement lisible par toute personne familière avec les tableurs.

Accéder à plusieurs feuilles de calcul

De nombreux cahiers d'exercices contiennent plus d'une feuille. IronXL vous permet d'ouvrir et de parcourir des classeurs avec une énumération complète des feuilles de calcul :

using IronXL;

WorkBook workbook = WorkBook.Load("MultiSheet.xlsx");

// List all worksheets
foreach (WorkSheet sheet in workbook.WorkSheets)
{
    Console.WriteLine($"Sheet: {sheet.Name}, Rows: {sheet.RowCount}");
}

// Access a sheet by name
WorkSheet summary = workbook.GetWorkSheet("Summary");
string totalRevenue = summary["B20"].StringValue;
Console.WriteLine($"Total Revenue: {totalRevenue}");

// Access a sheet by index
WorkSheet firstSheet = workbook.WorkSheets[0];
int lastRow = firstSheet.RowCount;
Console.WriteLine($"Last row in first sheet: {lastRow}");
using IronXL;

WorkBook workbook = WorkBook.Load("MultiSheet.xlsx");

// List all worksheets
foreach (WorkSheet sheet in workbook.WorkSheets)
{
    Console.WriteLine($"Sheet: {sheet.Name}, Rows: {sheet.RowCount}");
}

// Access a sheet by name
WorkSheet summary = workbook.GetWorkSheet("Summary");
string totalRevenue = summary["B20"].StringValue;
Console.WriteLine($"Total Revenue: {totalRevenue}");

// Access a sheet by index
WorkSheet firstSheet = workbook.WorkSheets[0];
int lastRow = firstSheet.RowCount;
Console.WriteLine($"Last row in first sheet: {lastRow}");
$vbLabelText   $csharpLabel

Cette approche est bien plus propre que toute tentative d'analyse d'Excel avec StreamReader ou de manipulation de chaînes de caractères.

Comment lire des données Excel à partir d'un flux mémoire ?

Dans le monde réel, les applications ont souvent besoin de traiter des fichiers Excel à partir de flux plutôt que de fichiers sur disque. Les scénarios courants incluent la gestion des téléchargements de fichiers à partir de formulaires Web, la récupération de classeurs à partir d'une colonne BLOB d'une base de données ou le traitement de fichiers téléchargés à partir d'un stockage cloud (Azure Blob Storage, AWS S3). IronXL gère ces scénarios via WorkBook.FromStream :

using IronXL;
using System.IO;

// Simulate reading file bytes (e.g., from a database or web upload)
byte[] fileBytes = File.ReadAllBytes("ProductData.xlsx");

using MemoryStream stream = new MemoryStream(fileBytes);
WorkBook workbook = WorkBook.FromStream(stream);
WorkSheet worksheet = workbook.DefaultWorkSheet;

// Get row and column counts
Console.WriteLine($"Rows: {worksheet.RowCount}, Columns: {worksheet.ColumnCount}");

// Convert to DataTable for database or grid binding
var dataTable = worksheet.ToDataTable(useHeaderRow: true);
Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows");

foreach (System.Data.DataRow row in dataTable.Rows)
{
    string productName = row["ProductName"]?.ToString() ?? string.Empty;
    string sku = row["SKU"]?.ToString() ?? string.Empty;
    Console.WriteLine($"Product: {productName}, SKU: {sku}");
}
using IronXL;
using System.IO;

// Simulate reading file bytes (e.g., from a database or web upload)
byte[] fileBytes = File.ReadAllBytes("ProductData.xlsx");

using MemoryStream stream = new MemoryStream(fileBytes);
WorkBook workbook = WorkBook.FromStream(stream);
WorkSheet worksheet = workbook.DefaultWorkSheet;

// Get row and column counts
Console.WriteLine($"Rows: {worksheet.RowCount}, Columns: {worksheet.ColumnCount}");

// Convert to DataTable for database or grid binding
var dataTable = worksheet.ToDataTable(useHeaderRow: true);
Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows");

foreach (System.Data.DataRow row in dataTable.Rows)
{
    string productName = row["ProductName"]?.ToString() ?? string.Empty;
    string sku = row["SKU"]?.ToString() ?? string.Empty;
    Console.WriteLine($"Product: {productName}, SKU: {sku}");
}
$vbLabelText   $csharpLabel

WorkBook.FromStream accepte tout Stream -- MemoryStream, FileStream, ou un flux réseau. Cette flexibilité signifie que vous n'aurez jamais besoin d'écrire de fichiers temporaires sur le disque simplement pour lire des données Excel. La conversion vers DataTable s'intègre également directement avec SqlBulkCopy, les contrôles de liaison de données et les cadres de reporting.

Sortie du traitement de flux

Alternative pour lire un fichier Excel à l'aide de StreamReader en C# - IronXL: Image 6 - Lire un fichier Excel à partir de la sortie MemoryStream

Quand utiliser la lecture Excel pilotée par les événements ?

Dans les architectures pilotées par les événements -- par exemple, un bouton de téléchargement de fichier dans Windows Forms ou une action de contrôleur ASP.NET -- la signature de la méthode comprend souvent les paramètres object sender et EventArgs e. La logique de traitement Excel utilise toujours la même API IronXL , mais elle est appelée depuis le gestionnaire d'événements plutôt que depuis une instruction de niveau supérieur. IronXL s'intègre parfaitement à tout flux de travail événementiel ou asynchrone car il ne dépend d'aucun thread d'interface utilisateur.

Alternative pour lire un fichier Excel avec StreamReader en C# - IronXL: Image 7 - Fonctionnalités

Comment convertir des fichiers Excel en fichiers CSV et inversement ?

Bien que StreamReader puisse gérer les fichiers CSV, les applications de production ont souvent besoin de transférer des données entre Excel et CSV. IronXL simplifie la conversion de format. Vous pouvez exporter des données Excel au format CSV ou importer des données CSV dans un classeur en quelques lignes seulement :

using IronXL;

// Load an Excel file and save as CSV
WorkBook workbook = WorkBook.Load("SalesData.xlsx");
workbook.SaveAsCsv("output.csv");

// Load a CSV file and save as Excel
WorkBook csvWorkbook = WorkBook.LoadCSV("legacy-report.csv");
csvWorkbook.SaveAs("converted.xlsx");

// Export a specific worksheet to CSV
WorkSheet worksheet = workbook.WorkSheets[0];
worksheet.SaveAsCsv("sheet1-export.csv");
using IronXL;

// Load an Excel file and save as CSV
WorkBook workbook = WorkBook.Load("SalesData.xlsx");
workbook.SaveAsCsv("output.csv");

// Load a CSV file and save as Excel
WorkBook csvWorkbook = WorkBook.LoadCSV("legacy-report.csv");
csvWorkbook.SaveAs("converted.xlsx");

// Export a specific worksheet to CSV
WorkSheet worksheet = workbook.WorkSheets[0];
worksheet.SaveAsCsv("sheet1-export.csv");
$vbLabelText   $csharpLabel

Ces conversions préservent vos données tout en modifiant le format du conteneur. Lors de la conversion d'Excel en CSV, IronXL exporte par défaut la première feuille de calcul ; Vous pouvez spécifier n'importe quelle feuille de votre choix. La conversion d'un fichier CSV en Excel crée un classeur correctement structuré que vous pouvez ensuite mettre en forme, auquel vous pouvez ajouter des formules et dans lequel vous pouvez écrire des données supplémentaires .

Quelles sont les différences en matière de prise en charge des formats ?

Comparaison de StreamReader et IronXL pour la lecture de différents formats de fichiers
Format de fichier StreamReader IronXL Remarques
CSV (.csv) Oui Oui Texte brut ; StreamReader fonctionne parfaitement
XLSX (.xlsx) Non Oui XML compressé au format ZIP ; nécessite une bibliothèque
XLS (.xls) Non Oui Format BIFF binaire ; nécessite une bibliothèque
XLSM (.xlsm) Non Oui Classeur à calcul avec macros
TSV (.tsv) Oui Oui texte brut séparé par des tabulations

Comment créer et mettre en forme des fichiers Excel avec IronXL?

La lecture des données Excel ne représente qu'une partie du flux de travail. De nombreuses applications nécessitent également la création de nouveaux fichiers Excel et l'application d'une mise en forme. IronXL prend en charge la mise en forme des cellules, notamment les polices, les couleurs, les bordures, les formats numériques et la fusion des cellules :

using IronXL;

// Create a new workbook and worksheet
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet sheet = workbook.CreateWorkSheet("Report");

// Write headers with formatting
sheet["A1"].Value = "Product";
sheet["B1"].Value = "Units Sold";
sheet["C1"].Value = "Revenue";

// Apply bold formatting to header row
sheet["A1:C1"].Style.Font.Bold = true;
sheet["A1:C1"].Style.SetBackgroundColor("#4472C4");
sheet["A1:C1"].Style.Font.Color = "#FFFFFF";

// Write data rows
string[] products = { "Widget A", "Widget B", "Widget C" };
int[] units = { 120, 85, 210 };
decimal[] revenues = { 2400.00m, 1700.00m, 4200.00m };

for (int i = 0; i < products.Length; i++)
{
    sheet[$"A{i + 2}"].Value = products[i];
    sheet[$"B{i + 2}"].Value = units[i];
    sheet[$"C{i + 2}"].Value = revenues[i];
    sheet[$"C{i + 2}"].FormatString = "$#,##0.00";
}

// Save the workbook
workbook.SaveAs("FormattedReport.xlsx");
Console.WriteLine("Report created successfully.");
using IronXL;

// Create a new workbook and worksheet
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet sheet = workbook.CreateWorkSheet("Report");

// Write headers with formatting
sheet["A1"].Value = "Product";
sheet["B1"].Value = "Units Sold";
sheet["C1"].Value = "Revenue";

// Apply bold formatting to header row
sheet["A1:C1"].Style.Font.Bold = true;
sheet["A1:C1"].Style.SetBackgroundColor("#4472C4");
sheet["A1:C1"].Style.Font.Color = "#FFFFFF";

// Write data rows
string[] products = { "Widget A", "Widget B", "Widget C" };
int[] units = { 120, 85, 210 };
decimal[] revenues = { 2400.00m, 1700.00m, 4200.00m };

for (int i = 0; i < products.Length; i++)
{
    sheet[$"A{i + 2}"].Value = products[i];
    sheet[$"B{i + 2}"].Value = units[i];
    sheet[$"C{i + 2}"].Value = revenues[i];
    sheet[$"C{i + 2}"].FormatString = "$#,##0.00";
}

// Save the workbook
workbook.SaveAs("FormattedReport.xlsx");
Console.WriteLine("Report created successfully.");
$vbLabelText   $csharpLabel

Grâce à sa capacité à la fois à lire des classeurs existants et à créer de nouveaux fichiers formatés, IronXL constitue une solution Excel complète pour les applications .NET . Consultez la page complète des fonctionnalités IronXL pour obtenir une description détaillée des opérations prises en charge.

Exportation des données vers d'autres formats

IronXL prend également en charge l'exportation des données du classeur vers des objets DataSet , ce qui est particulièrement utile lors du chargement de plusieurs feuilles de calcul en mémoire pour des calculs inter-feuilles ou des opérations d'insertion en masse dans une base de données. La méthode ToDataSet renvoie un DataSet où chaque feuille de calcul devient un DataTable.

Alternative to Read Excel File Using StreamReader in C# - IronXL: Image 8 - Licensing

Comment obtenir une licence et déployer IronXL en production ?

IronXL est gratuit pour le développement et les tests. Pour les applications de production, une licence est requise. Vous pouvez consulter les options de licence IronXL sur la page produit, qui proposent les niveaux Développeur, Équipe et Organisation en fonction de vos besoins de déploiement.

Après l'achat, saisissez votre clé de licence sous forme de code avant toute utilisation IronXL :

IronXl.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
IronXl.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
$vbLabelText   $csharpLabel

Vous pouvez également définir la variable d'environnement IRONXL_LICENSE_KEY dans votre environnement de déploiement et IronXL la détectera automatiquement. Il s'agit de l'approche privilégiée pour les déploiements conteneurisés (Docker, Kubernetes) et les environnements cloud où le codage en dur des clés n'est pas acceptable.

À des fins d'évaluation, une licence d'essai gratuite offre toutes les fonctionnalités nécessaires pour valider IronXL en fonction de vos charges de travail spécifiques avant de procéder à un achat. L'essai est disponible sans carte de crédit et s'active immédiatement.

Comparé à des alternatives telles que Microsoft.Office.Interop.Excel, IronXL présente plusieurs avantages en matière de déploiement :

  • Aucune obligation d'installer Microsoft Excel sur le serveur
  • Compatible avec Linux et Docker – essentiel pour les applications natives du cloud
  • Aucun problème de gestion du cycle de vie des objets COM ou de gestion des threads d'appartements
  • Démarrage plus rapide et consommation de mémoire réduite dans les contextes serveur
  • Comportement cohérent sur toutes les plateformes prises en charge

Ces qualités font IronXL un choix judicieux pour toute application .NET ayant besoin de traiter des fichiers Excel en production, que ce soit sur site ou dans le cloud.

Questions Fréquemment Posées

Pourquoi StreamReader ne peut-il pas gérer directement les fichiers Excel ?

StreamReader est conçu pour lire des fichiers texte et ne peut pas analyser les formats de données binaires ou structurés complexes utilisés dans les fichiers Excel. Cette limitation entraîne l'affichage de caractères illisibles ou des exceptions lors de la tentative de lecture directe de fichiers Excel avec StreamReader.

Quelle est la solution recommandée pour lire des fichiers Excel en C# ?

La solution recommandée consiste à utiliser IronXL, une bibliothèque performante permettant de lire, modifier et créer des fichiers Excel en C# sans avoir recours à Excel Interop. IronXL gère efficacement la structure complexe des fichiers Excel.

Quels sont les avantages d' IronXL par rapport à Excel Interop ?

IronXL offre plusieurs avantages par rapport à Excel Interop, notamment de meilleures performances, l'absence de dépendance à l'égard de l'installation d'Excel sur le serveur ou la machine cliente, un déploiement plus facile et la possibilité de travailler avec des fichiers Excel dans des environnements web et cloud.

IronXL est-il capable de gérer les formats de fichiers .xls et .xlsx ?

Oui, IronXL est capable de gérer les formats de fichiers Excel .xls et .xlsx, offrant ainsi une grande flexibilité aux développeurs travaillant avec différents types de documents Excel.

IronXL peut-il être utilisé dans des applications web ?

Oui, IronXL est conçu pour être utilisé dans différents types d'applications, y compris les applications Web, grâce à sa légèreté et à sa compatibilité avec .NET Core et .NET Framework.

IronXL nécessite-t-il l'installation de Microsoft Excel ?

Non, IronXL ne nécessite pas l'installation de Microsoft Excel sur le serveur ou la machine cliente, ce qui le rend idéal pour les applications côté serveur et les environnements cloud.

Quels sont quelques cas d'utilisation typiques d' IronXL?

Les cas d'utilisation typiques d' IronXL comprennent l'extraction et l'analyse de données à partir de fichiers Excel, la génération de rapports, l'automatisation de la création et de la modification de fichiers Excel et l'intégration de données Excel dans d'autres applications.

Jordi Bardia
Ingénieur logiciel
Jordi est le plus compétent en Python, C# et C++, et lorsqu'il ne met pas à profit ses compétences chez Iron Software, il programme des jeux. Partageant les responsabilités des tests de produit, du développement de produit et de la recherche, Jordi apporte une immense valeur à l'amé...
Lire la suite

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me