# How to Read Excel Files in C# Without Interop: Complete Developer Guide
La première fois que j'ai dû lire un fichier Excel à partir d'un service .NET, j'ai utilisé Microsoft Interop et je l'ai presque immédiatement regretté. Il avait besoin d'Office installé sur le serveur, il fuyait des processus lorsqu'une exception était lancée en milieu de méthode, et il échouait sous toute sorte de charge. Nous avons construit IronXL car nous rencontrions constamment ces mêmes obstacles. Ce guide explique comment je lis réellement les fichiers XLS et XLSX en production aujourd'hui, y compris les pièges qui mordent le plus souvent les gens.
La plupart de ce qui suit est une lecture directe du format de fichier, aucune application Excel impliquée : chargez un classeur, extrayez des valeurs par adresse de cellule, validez des plages, poussez les données dans une base de données ou une API. La bibliothèque gère XLS et XLSX sans nécessiter Microsoft Office sur la machine.
*as-heading:2(Démarrage rapide : Lire une cellule avec IronXL en une ligne)*
Une seule ligne charge un classeur Excel et extrait une valeur d'une cellule. Pas d'Interop, pas de configuration, pas de processus Excel s'exécutant en arrière-plan.
```cs
:title=Quickly Read Excel in C# Today
var value = IronXL.WorkBook.Load("file.xlsx").GetWorkSheet(0)["A1"].StringValue;
```
## Comment configurer IronXL pour lire des fichiers Excel en C# ?
L'installation elle-même est une installation via NuGet et une directive `using IronXL;`. La bibliothèque gère à la fois `.XLS` et `.XLSX`, de sorte que le même chemin de code fonctionne pour les feuilles de calcul héritées et le format Open XML moderne.
Suivez ces étapes pour commencer :
1. [Téléchargez la bibliothèque C# pour lire les fichiers Excel.](https://nuget.org/packages/IronXL.Excel/)
2. Chargez et lisez les classeurs Excel en utilisant `WorkBook.Load()`
3. Accédez aux feuilles de calcul avec la méthode `GetWorkSheet()`
4. Lisez les valeurs des cellules en utilisant des adresses de style Excel comme `sheet["A1"].Value`
5. Valider et traiter les données de la feuille de calcul par programmation
6. Exporter les données vers des bases de données à l'aide d'Entity Framework
IronXL lit et édite les documents Microsoft Excel depuis C# sans dépendre du produit Office. Il ne nécessite pas Microsoft Excel installé, et il n'a pas besoin d'[Interop](https://learn.microsoft.com/en-us/dotnet/api/microsoft.office.interop.excel?view=excel-pia). See the [comparison with Microsoft.Office.Interop.Excel](/csharp/excel/blog/compare-to-other-components/microsoft-office-excel-interop-alternative/) for the differences in approach and API surface.
Si vous venez d'Interop, le modèle mental est différent et vaut la peine d'être bien compris avant d'écrire du code. Interop lance un processus `Excel.exe` réel en arrière-plan et votre code automatise cette application via COM. IronXL lit directement les octets du fichier en mémoire et les présente sous forme d'objets. Pas de processus Excel, pas de pompe de message, pas de marshaling COM. La conséquence pratique que je vois piéger le plus de gens : Interop indexe les cellules à partir de `[1, 1]` (basé sur 1, tout comme l'interface utilisateur d'Excel), mais l'accès aux lignes/colonnes d'IronXL est basé sur 0. L'indexeur de chaînes `["A1"]` correspond à l'interface utilisateur des feuilles de calcul dans les deux bibliothèques, donc lorsque vous pouvez rester dans la forme de chaîne, la migration se lit presque identiquement. Les bugs de décalage de un dans le sens longitudinal proviennent tous de l'indexeur numérique.
IronXL comprend :
- Assistance produit dédiée assurée par nos ingénieurs .NET
- Installation facile via Microsoft Visual Studio
- Essai gratuit pour le développement. Licences de `liteLicense`
Les projets C# et VB.NET peuvent utiliser IronXL de la même manière pour lire ou créer des fichiers Excel.
### Lecture des fichiers Excel .XLS et .XLSX avec IronXL
Voici le flux de travail essentiel pour lire des fichiers Excel à l'aide d'IronXL :
1. Installez la bibliothèque IronXL Excel via [le package NuGet](https://www.nuget.org/packages/IronXL.Excel/) ou téléchargez la [DLL Excel .NET](/csharp/excel/packages/IronXL.zip)
2. Utilisez la méthode `WorkBook.Load()` pour lire n'importe quel document XLS, XLSX ou CSV
3. Accédez aux valeurs des cellules en utilisant des adresses de style Excel : `sheet["A11"].DecimalValue`
```csharp
using IronXL;
using System;
using System.Linq;
// Load Excel workbook from file path
WorkBook workBook = WorkBook.Load("test.xlsx");
// Access the first worksheet using LINQ
WorkSheet workSheet = workBook.WorkSheets.First();
// Read integer value from cell A2
int cellValue = workSheet["A2"].IntValue;
Console.WriteLine($"Cell A2 value: {cellValue}");
// Iterate through a range of cells
foreach (var cell in workSheet["A2:A10"])
{
Console.WriteLine("Cell {0} has value '{1}'", cell.AddressString, cell.Text);
}
// Advanced Operations with LINQ
// Calculate sum using built_in Sum() method
decimal sum = workSheet["A2:A10"].Sum();
// Find maximum value using LINQ
decimal max = workSheet["A2:A10"].Max(c => c.DecimalValue);
// Output calculated results
Console.WriteLine($"Sum of A2:A10: {sum}");
Console.WriteLine($"Maximum value: {max}");
```
Le fragment de code présente les quatre opérations que vous utiliserez constamment : charger un classeur, lire une cellule par adresse, itérer une plage et exécuter des calculs sur une plage. `WorkBook.Load()` détecte le format du fichier à partir de l'extension, et la syntaxe de plage `["A2:A10"]` correspond à la sélection de cellule que vous saisiriez directement dans Excel. Les plages sont `IEnumerable<Cell>`, donc LINQ fonctionne directement contre elles pour les sommes, les filtres, et les projections.
### Quelle est la rapidité de cela en pratique ?
Pour vous donner un aperçu de la performance réaliste, j'ai écrit un petit projet console qui charge le même type de fichiers utilisés tout au long de ce tutoriel et chronomètre les opérations. Le banc d'essai se trouve dans un [projet d'exemple ReadExcelBenchmark](#sample-project) que vous pouvez exécuter vous-même. Sur une boîte Windows 11 exécutant .NET 9.0.7, les chiffres à travers plusieurs exécutions se situent approximativement ici :
| Opération |Premier chargement à froid (processus frais)|Moyenne à chaud sur 10 itérations|
|---|---|---|
| Chargez `GDP.xlsx` (213 lignes) et faites la somme de la colonne B|~270 ms|~40 ms (plage de 25 à 70 ms)|
| Chargez `People.xlsx` (100 lignes) et validez chaque cellule avec regex|~30 ms|~28 ms|
Le premier chiffre à froid est dominé par le chargement de l'assemblage et le préchauffage du JIT d'IronXL ; le second chiffre à froid est beaucoup plus bas car l'assemblage est déjà en mémoire à ce stade. Les exécutions à chaud se stabilisent dans une bande étroite une fois que le JIT a compilé les chemins fréquemment utilisés.
Si vous constatez des temps de chargement de plusieurs secondes sur des fichiers de cette taille, le coupable est presque toujours l'appel de `WorkBook.Load()` à l'intérieur d'une boucle plutôt qu'une fois en dehors. Chargez le classeur une fois, puis itérez les cellules ou lignes dont vous avez réellement besoin. Je vois ce schéma exact dans environ la moitié des tickets de support " IronXL est lent " que nous recevons.
Les exemples de code de ce tutoriel fonctionnent avec trois exemples de feuilles de calcul Excel qui illustrent différents scénarios de données :

*Exemples de fichiers Excel (GDP.xlsx, People.xlsx et PopulationByState.xlsx) utilisés tout au long de ce tutoriel pour illustrer diverses opérations IronXL.*
---
## Comment puis-je installer la bibliothèque IronXL C# ?
---
Ajoutez la bibliothèque `IronXL.Excel` à un projet .NET via NuGet, ou en référencer directement le DLL.
### Installation du package NuGet IronXL
1. Dans Visual Studio, cliquez avec le bouton droit sur votre projet et sélectionnez " Gérer les packages NuGet… "
2. Recherchez `IronXL.Excel` dans l'onglet de recherche
3. Cliquez sur le bouton Installer pour ajouter IronXL à votre projet.

*L'installation d'IronXL via le gestionnaire de packages NuGet de Visual Studio assure une gestion automatique des dépendances.*
Vous pouvez également installer IronXL à l'aide de la console du Package Manager :
1. Ouvrez la console du gestionnaire de packages (Outils → Gestionnaire de packages NuGet → Console du gestionnaire de packages)
2. Exécutez la commande d'installation :
```shell
:ProductInstall
```
Vous pouvez également [consulter les détails du package sur le site web NuGet](https://www.nuget.org/packages/IronXL.Excel/) .
### Installation manuelle
Pour une installation manuelle, téléchargez la [DLL IronXL .NET Excel](/csharp/excel/packages/IronXL.zip) et référencez-la directement dans votre projet Visual Studio.
## Comment charger et lire un classeur Excel ?
La [`WorkBook`](/csharp/excel/object-reference/api/IronXL.WorkBook.html) classe représente un fichier Excel complet. Chargez les fichiers Excel en utilisant la méthode `WorkBook.Load()`, qui accepte les chemins de fichiers pour les formats XLS, XLSX, CSV, et TSV.
```csharp
using IronXL;
using System;
using System.Linq;
// Load Excel file from specified path
WorkBook workBook = WorkBook.Load(@"Spreadsheets\GDP.xlsx");
Console.WriteLine("Workbook loaded successfully.");
// Access specific worksheet by name
WorkSheet sheet = workBook.GetWorkSheet("Sheet1");
// Read and display cell value
string cellValue = sheet["A1"].StringValue;
Console.WriteLine($"Cell A1 contains: {cellValue}");
// Perform additional operations
// Count non_empty cells in column A
int rowCount = sheet["A:A"].Count(cell => !cell.IsEmpty);
Console.WriteLine($"Column A has {rowCount} non_empty cells");
```
Chaque `WorkBook` contient plusieurs objets [`WorkSheet`](/csharp/excel/object-reference/api/IronXL.WorkSheet.html) représentant des feuilles Excel individuelles. Accédez aux feuilles de calcul par nom en utilisant [`GetWorkSheet()`](/csharp/excel/object-reference/api/IronXL.WorkBook.html#IronXL_WorkBook_GetWorkSheet_System_String_) :
```csharp
using IronXL;
using System;
// Get worksheet by name
WorkSheet workSheet = workBook.GetWorkSheet("GDPByCountry");
Console.WriteLine("Worksheet 'GDPByCountry' not found");
// List available worksheets
foreach (var sheet in workBook.WorkSheets)
{
Console.WriteLine($"Available: {sheet.Name}");
}
```
## Comment créer de nouveaux documents Excel en C# ?
Créez de nouveaux documents Excel en construisant un objet `WorkBook` avec le format de fichier de votre choix. IronXL prend en charge les formats XLSX modernes et XLS plus anciens.
```csharp
using IronXL;
// Create new XLSX workbook (recommended format)
WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
// Set workbook metadata
workBook.Metadata.Author = "Your Application";
workBook.Metadata.Comments = "Generated by IronXL";
// Create new XLS workbook for legacy support
WorkBook legacyWorkBook = WorkBook.Create(ExcelFileFormat.XLS);
// Save the workbook
workBook.SaveAs("NewDocument.xlsx");
```
Remarque : Utilisez `ExcelFileFormat.XLS` uniquement lorsque la compatibilité avec Excel 2003 et les versions antérieures est requise.
## Comment ajouter des feuilles de calcul à un document Excel ?
Un `WorkBook` IronXL contient une collection de feuilles de calcul. Comprendre cette structure est utile lors de la création de fichiers Excel à plusieurs feuilles.

*Représentation visuelle de la structure WorkBook contenant plusieurs objets WorkSheet dans IronXL.*
Créez de nouvelles feuilles de calcul en utilisant `CreateWorkSheet()` :
```csharp
using IronXL;
// Create multiple worksheets with descriptive names
WorkSheet summarySheet = workBook.CreateWorkSheet("Summary");
WorkSheet dataSheet = workBook.CreateWorkSheet("RawData");
WorkSheet chartSheet = workBook.CreateWorkSheet("Charts");
// Set the active worksheet
workBook.SetActiveTab(0); // Makes "Summary" the active sheet
// Access default worksheet (first sheet)
WorkSheet defaultSheet = workBook.DefaultWorkSheet;
```
## Comment lire et modifier les valeurs des cellules ?
### Lire et modifier une seule cellule
Accédez aux cellules individuelles via la propriété d'indexation de la feuille de calcul. La classe [`Cell`](/csharp/excel/object-reference/api/IronXL.Cell.html) d'IronXL fournit des propriétés de valeur fortement typées.
```csharp
using IronXL;
using System;
using System.Linq;
// Load workbook and get worksheet
WorkBook workBook = WorkBook.Load("test.xlsx");
WorkSheet workSheet = workBook.DefaultWorkSheet;
// Access cell B1
IronXL.Cell cell = workSheet["B1"].First();
// Read cell value with type safety
string textValue = cell.StringValue;
int intValue = cell.IntValue;
decimal decimalValue = cell.DecimalValue;
DateTime? dateValue = cell.DateTimeValue;
// Check cell data type
if (cell.IsNumeric)
{
Console.WriteLine($"Numeric value: {cell.DecimalValue}");
}
else if (cell.IsText)
{
Console.WriteLine($"Text value: {cell.StringValue}");
}
```
La classe `Cell` propose plusieurs propriétés pour différents types de données, convertissant automatiquement les valeurs lorsque cela est possible. Pour plus d'opérations sur les cellules, consultez le [tutoriel sur la mise en forme des cellules](/csharp/excel/how-to/set-cell-data-format/) .
```csharp
// Write different data types to cells
workSheet["A1"].Value = "Product Name"; // String
workSheet["B1"].Value = 99.95m; // Decimal
workSheet["C1"].Value = DateTime.Today; // Date
workSheet["D1"].Formula = "=B1*1.2"; // Formula
// Format cells
workSheet["B1"].FormatString = "$#,##0.00"; // Currency format
workSheet["C1"].FormatString = "yyyy-MM-dd";// Date format
// Save changes
workBook.Save();
```
## Comment puis-je travailler avec des plages de cellules ?
La [`Range`](/csharp/excel/object-reference/api/IronXL.Range.html) classe représente une collection de cellules, permettant des opérations en bloc sur les données Excel.
```csharp
using IronXL;
using Range = IronXL.Range;
// Select range using Excel notation
Range range = workSheet["D2:D101"];
// Alternative: Use Range class for dynamic selection
Range dynamicRange = workSheet.GetRange("D2:D101"); // Row 2_101, Column D
// Perform bulk operations
range.Value = 0; // Set all cells to 0
```
Traitement efficace des plages de valeurs à l'aide de boucles lorsque le nombre de cellules est connu :
```cs
// Data validation example
public class ValidationResult
{
public int Row { get; set; }
public string PhoneError { get; set; }
public string EmailError { get; set; }
public string DateError { get; set; }
public bool IsValid => string.IsNullOrEmpty(PhoneError) &&
string.IsNullOrEmpty(EmailError) &&
string.IsNullOrEmpty(DateError);
}
// Validate data in rows 2-101
var results = new List<ValidationResult>();
for (int row = 2; row <= 101; row++)
{
var result = new ValidationResult { Row = row };
// Get row data efficiently
var phoneCell = workSheet[$"B{row}"];
var emailCell = workSheet[$"D{row}"];
var dateCell = workSheet[$"E{row}"];
// Validate phone number
if (!IsValidPhoneNumber(phoneCell.StringValue))
result.PhoneError = "Invalid phone format";
// Validate email
if (!IsValidEmail(emailCell.StringValue))
result.EmailError = "Invalid email format";
// Validate date
if (!dateCell.IsDateTime)
result.DateError = "Invalid date format";
results.Add(result);
}
// Helper methods
bool IsValidPhoneNumber(string phone) =>
System.Text.RegularExpressions.Regex.IsMatch(phone, @"^\d{3}-\d{3}-\d{4}$");
bool IsValidEmail(string email) =>
email.Contains("@") && email.Contains(".");
```
## Comment ajouter des formules à une feuille de calcul Excel ?
Appliquez les formules Excel en utilisant la propriété [`Formula`](/csharp/excel/object-reference/api/IronXL.Cell.html#IronXL_Cell_Formula). IronXL prend en charge la syntaxe standard des formules Excel.
```csharp
using IronXL;
// Add formulas to calculate percentages
int lastRow = 50;
for (int row = 2; row < lastRow; row++)
{
// Calculate percentage: current value / total
workSheet[$"C{row}"].Formula = $"=B{row}/B{lastRow}";
// Format as percentage
workSheet[$"C{row}"].FormatString = "0.00%";
}
// Add summary formulas
workSheet["B52"].Formula = "=SUM(B2:B50)"; // Sum
workSheet["B53"].Formula = "=AVERAGE(B2:B50)"; // Average
workSheet["B54"].Formula = "=MAX(B2:B50)"; // Maximum
workSheet["B55"].Formula = "=MIN(B2:B50)"; // Minimum
// Force formula evaluation
workBook.EvaluateAll();
```
Pour modifier les formules existantes, consultez le [tutoriel sur les formules Excel](/csharp/excel/how-to/edit-formulas/) .
## Comment puis-je valider les données d'une feuille de calcul ?
Un cas d'utilisation courant que je vois est la validation des feuilles de calcul fournies par l'utilisateur avant d'importer les données dans une base de données. L'exemple ci-dessous vérifie les numéros de téléphone, les e-mails et les dates avec des expressions régulières et les vérifications de type intégrées d'IronXL.
```cs
using System.Text.RegularExpressions;
using IronXL;
// Validation implementation
for (int i = 2; i <= 101; i++)
{
var result = new PersonValidationResult { Row = i };
results.Add(result);
// Get cells for current person
var cells = workSheet[$"A{i}:E{i}"].ToList();
// Validate phone (column B)
string phone = cells[1].StringValue;
if (!Regex.IsMatch(phone, @"^\+?1?\d{10,14}$"))
{
result.PhoneNumberErrorMessage = "Invalid phone format";
}
// Validate email (column D)
string email = cells[3].StringValue;
if (!Regex.IsMatch(email, @"^[^@\s]+@[^@\s]+\.[^@\s]+$"))
{
result.EmailErrorMessage = "Invalid email address";
}
// Validate date (column E)
if (!cells[4].IsDateTime)
{
result.DateErrorMessage = "Invalid date format";
}
}
```
Enregistrer les résultats de validation dans une nouvelle feuille de calcul :
```cs
// Create results worksheet
var resultsSheet = workBook.CreateWorkSheet("ValidationResults");
// Add headers
resultsSheet["A1"].Value = "Row";
resultsSheet["B1"].Value = "Valid";
resultsSheet["C1"].Value = "Phone Error";
resultsSheet["D1"].Value = "Email Error";
resultsSheet["E1"].Value = "Date Error";
// Style headers
resultsSheet["A1:E1"].Style.Font.Bold = true;
resultsSheet["A1:E1"].Style.SetBackgroundColor("#4472C4");
resultsSheet["A1:E1"].Style.Font.Color = "#FFFFFF";
// Output validation results
for (int i = 0; i < results.Count; i++)
{
var result = results[i];
int outputRow = i + 2;
resultsSheet[$"A{outputRow}"].Value = result.Row;
resultsSheet[$"B{outputRow}"].Value = result.IsValid ? "Yes" : "No";
resultsSheet[$"C{outputRow}"].Value = result.PhoneNumberErrorMessage ?? "";
resultsSheet[$"D{outputRow}"].Value = result.EmailErrorMessage ?? "";
resultsSheet[$"E{outputRow}"].Value = result.DateErrorMessage ?? "";
// Highlight invalid rows
if (!result.IsValid)
{
resultsSheet[$"A{outputRow}:E{outputRow}"].Style.SetBackgroundColor("#FFE6E6");
}
}
// Auto-fit columns
for (int col = 0; col < 5; col++)
{
resultsSheet.AutoSizeColumn(col);
}
// Save validated workbook
workBook.SaveAs(@"Spreadsheets\PeopleValidated.xlsx");
```
## Comment exporter des données Excel vers une base de données ?
Utilisez IronXL avec Entity Framework pour exporter directement les données de vos feuilles de calcul vers des bases de données. Cet exemple illustre l'exportation de données de PIB national vers SQLite.
```cs
using System;
using System.ComponentModel.DataAnnotations;
using Microsoft.EntityFrameworkCore;
using IronXL;
// Define entity model
public class Country
{
[Key]
public Guid Id { get; set; } = Guid.NewGuid();
[Required]
[MaxLength(100)]
public string Name { get; set; }
[Range(0, double.MaxValue)]
public decimal GDP { get; set; }
public DateTime ImportedDate { get; set; } = DateTime.UtcNow;
}
```
Configurer le contexte Entity Framework pour les opérations de base de données :
```cs
public class CountryContext : DbContext
{
public DbSet<Country> Countries { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// Configure SQLite connection
optionsBuilder.UseSqlite("Data Source=CountryGDP.db");
// Enable sensitive data logging in development
#if DEBUG
optionsBuilder.EnableSensitiveDataLogging();
#endif
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// Configure decimal precision
modelBuilder.Entity<Country>()
.Property(c => c.GDP)
.HasPrecision(18, 2);
}
}
```
[[i:(Remarque : Pour utiliser différentes bases de données, installez le package NuGet approprié (par exemple, `Microsoft.EntityFrameworkCore.SqlServer` pour SQL Server) et modifiez la configuration de connexion en conséquence.)]]
Importer des données Excel dans une base de données :
```cs
using System.Threading.Tasks;
using IronXL;
using Microsoft.EntityFrameworkCore;
public async Task ImportGDPDataAsync()
{
try
{
// Load Excel file
var workBook = WorkBook.Load(@"Spreadsheets\GDP.xlsx");
var workSheet = workBook.GetWorkSheet("GDPByCountry");
using (var context = new CountryContext())
{
// Ensure database exists
await context.Database.EnsureCreatedAsync();
// Clear existing data (optional)
await context.Database.ExecuteSqlRawAsync("DELETE FROM Countries");
// Import data with progress tracking
int totalRows = 213;
for (int row = 2; row <= totalRows; row++)
{
// Read country data
var countryName = workSheet[$"A{row}"].StringValue;
var gdpValue = workSheet[$"B{row}"].DecimalValue;
// Skip empty rows
if (string.IsNullOrWhiteSpace(countryName))
continue;
// Create and add entity
var country = new Country
{
Name = countryName.Trim(),
GDP = gdpValue * 1_000_000 // Convert to actual value if in millions
};
await context.Countries.AddAsync(country);
// Save in batches for performance
if (row % 50 == 0)
{
await context.SaveChangesAsync();
Console.WriteLine($"Imported {row - 1} of {totalRows} countries");
}
}
// Save remaining records
await context.SaveChangesAsync();
Console.WriteLine($"Successfully imported {await context.Countries.CountAsync()} countries");
}
}
catch (Exception ex)
{
Console.WriteLine($"Import failed: {ex.Message}");
throw;
}
}
```
## Comment importer des données d'API dans des feuilles de calcul Excel ?
Combinez IronXL avec des clients HTTP pour alimenter des feuilles de calcul avec des données API en temps réel. Cet exemple utilise [RestClient.Net](https://github.com/MelbourneDeveloper/RestClient.Net) pour récupérer des données de pays.
```cs
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;
using IronXL;
// Define data model matching API response
public class RestCountry
{
public string Name { get; set; }
public long Population { get; set; }
public string Region { get; set; }
public string NumericCode { get; set; }
public List<Language> Languages { get; set; }
}
public class Language
{
public string Name { get; set; }
public string NativeName { get; set; }
}
// Fetch and process API data
public async Task ImportCountryDataAsync()
{
using var httpClient = new HttpClient();
try
{
// Call REST API
var response = await httpClient.GetStringAsync("https://restcountries.com/v3.1/all");
var countries = JsonConvert.DeserializeObject<List<RestCountry>>(response);
// Create new workbook
var workBook = WorkBook.Create(ExcelFileFormat.XLSX);
var workSheet = workBook.CreateWorkSheet("Countries");
// Add headers with styling
string[] headers = { "Country", "Population", "Region", "Code", "Language 1", "Language 2", "Language 3" };
for (int col = 0; col < headers.Length; col++)
{
var headerCell = workSheet[0, col];
headerCell.Value = headers[col];
headerCell.Style.Font.Bold = true;
headerCell.Style.SetBackgroundColor("#366092");
headerCell.Style.Font.Color = "#FFFFFF";
}
// Import country data
await ProcessCountryData(countries, workSheet);
// Save workbook
workBook.SaveAs("CountriesFromAPI.xlsx");
}
catch (Exception ex)
{
Console.WriteLine($"API import failed: {ex.Message}");
}
}
```
L'API renvoie des données JSON au format suivant :

*Exemple de réponse JSON de l'API REST Countries affichant des informations hiérarchiques sur les pays.*
Traiter et écrire les données de l'API dans Excel :
```cs
private async Task ProcessCountryData(List<RestCountry> countries, WorkSheet workSheet)
{
for (int i = 0; i < countries.Count; i++)
{
var country = countries[i];
int row = i + 1; // Start from row 1 (after headers)
// Write basic country data
workSheet[$"A{row}"].Value = country.Name;
workSheet[$"B{row}"].Value = country.Population;
workSheet[$"C{row}"].Value = country.Region;
workSheet[$"D{row}"].Value = country.NumericCode;
// Format population with thousands separator
workSheet[$"B{row}"].FormatString = "#,##0";
// Add up to 3 languages
for (int langIndex = 0; langIndex < Math.Min(3, country.Languages?.Count ?? 0); langIndex++)
{
var language = country.Languages[langIndex];
string columnLetter = ((char)('E' + langIndex)).ToString();
workSheet[$"{columnLetter}{row}"].Value = language.Name;
}
// Add conditional formatting for regions
if (country.Region == "Europe")
{
workSheet[$"C{row}"].Style.SetBackgroundColor("#E6F3FF");
}
else if (country.Region == "Asia")
{
workSheet[$"C{row}"].Style.SetBackgroundColor("#FFF2E6");
}
// Show progress every 50 countries
if (i % 50 == 0)
{
Console.WriteLine($"Processed {i} of {countries.Count} countries");
}
}
// Auto-size all columns
for (int col = 0; col < 7; col++)
{
workSheet.AutoSizeColumn(col);
}
}
```
---
## Pièges courants
Quelques éléments mordent les gens assez souvent pour mériter leur propre section.
### Les cellules vides renvoient 0, pas null
Cela m'a pris de court au début. Appeler `sheet["A1"].IntValue` (ou `DecimalValue` ou `DoubleValue`) sur une cellule vide retourne `0`, pas `null`. Si vous faites la somme ou la moyenne d'une colonne avec des trous, les blancs deviennent silencieusement des zéros et faussent le résultat. Je protège désormais les lectures sur toute feuille où les valeurs manquantes sont possibles :
```cs
var cell = sheet["B5"];
if (!cell.IsEmpty)
{
total += cell.DecimalValue;
}
```
`Cell.IsEmpty` est bon marché, donc par défaut je l'utilise chaque fois que la feuille est fournie par l'utilisateur plutôt que générée par la machine.
### Les dates reviennent sous forme de numéros de série si vous demandez le mauvais type
Excel enregistre les dates sous forme de numéros de série en interne (45292 signifie 2024-01-01, par exemple). La question la plus fréquente sur la gestion des dates dans notre boîte de réception de support est " pourquoi ma date s'affiche-t-elle comme 45292 ? " La réponse est presque toujours que la cellule a été lue comme `StringValue` ou `IntValue` au lieu de `DateTimeValue` :
```cs
// What you probably want:
DateTime birthday = sheet["E2"].DateTimeValue;
// What gives you "45292":
string birthday = sheet["E2"].StringValue;
```
`Cell.IsDateTime` vous indiquera si la cellule a été créée comme une date au départ, ce qui est utile pour les pipelines de validation où le format d'entrée n'est pas garanti.
### Les index numériques des cellules commencent à 0, mais les chaînes A1 commencent à 1
Couvert ci-dessus dans le paragraphe de la migration d'Interop, mais mérite d'être répété parce que cela piège même les gens qui n'ont jamais approché COM. `sheet[0, 0]` est la même cellule que `sheet["A1"]`. Mélanger les deux styles dans la même boucle est la manière dont les erreurs d'écart de un se glissent. Je choisis une forme par fichier et je m'y tiens ; La forme de chaîne `["A1"]` est celle que je privilégie parce qu'elle correspond à ce que vous voyez dans la feuille de calcul elle-même.
<a id="sample-project"></a>
### Projet d'exemple pour les chiffres de benchmark
Si vous voulez reproduire les chiffres de temps précédents, le banc d'essai est une petite application console .NET 9 :
```cs
// ReadExcelBenchmark/Program.cs (excerpt)
IronXL.License.LicenseKey = Environment.GetEnvironmentVariable("IRONXL_LICENSE_KEY");
var sw = Stopwatch.StartNew();
var workbook = WorkBook.Load("GDP.xlsx");
decimal sum = workbook.WorkSheets.First()["B2:B214"].Sum();
sw.Stop();
Console.WriteLine($"cold: {sw.Elapsed.TotalMilliseconds:F1} ms");
```
Exécutez-le sous `dotnet run -c Release`, générez les deux classeurs d'exemple lors du premier lancement, et vous pouvez remplacer vos propres fichiers pour voir comment les chiffres évoluent avec la taille et la complexité du fichier.
---
## Référence et ressources relatives aux objets
La [référence API IronXL](/csharp/excel/object-reference/api/) couvre chaque classe et méthode, y compris celles dont ce didacticiel ne traite pas.
Tutoriels supplémentaires pour les opérations Excel :
- [Créer des fichiers Excel par programmation](/csharp/excel/tutorials/create-excel-file-net/)
- [Guide de mise en forme et de style Excel](/csharp/excel/how-to/set-cell-data-format/)
- [Utilisation des formules Excel](/csharp/excel/how-to/edit-formulas/)
- [Tutoriel de création de graphiques Excel](/csharp/excel/how-to/csharp-excel-chart-create-edit-tutorial/)
## Résumé
`IronXL.Excel` lit et manipule les fichiers Excel aux formats XLS, XLSX, CSV et TSV. Il fonctionne sans [Microsoft Excel](https://products.office.com/en-us/excel) ou Interop sur la machine hôte.
Pour la manipulation de feuilles de calcul dans le cloud, vous pouvez également explorer la [bibliothèque cliente de l'API Google Sheets](https://developers.google.com/api-client-library/dotnet/apis/sheets/v4) for .NET, qui complète les fonctionnalités de fichiers locaux d'IronXL.
Prêt à intégrer l'automatisation Excel dans vos projets C# ? [Téléchargez IronXL](download-modal) ou découvrez [les options de licence](/csharp/excel/licensing/) pour une utilisation en production.
La première fois que j'ai dû lire un fichier Excel à partir d'un service .NET, j'ai utilisé Microsoft Interop et je l'ai presque immédiatement regretté. Il avait besoin d'Office installé sur le serveur, il fuyait des processus lorsqu'une exception était lancée en milieu de méthode, et il échouait sous toute sorte de charge. Nous avons construit IronXL car nous rencontrions constamment ces mêmes obstacles. Ce guide explique comment je lis réellement les fichiers XLS et XLSX en production aujourd'hui, y compris les pièges qui mordent le plus souvent les gens.
La plupart de ce qui suit est une lecture directe du format de fichier, aucune application Excel impliquée : chargez un classeur, extrayez des valeurs par adresse de cellule, validez des plages, poussez les données dans une base de données ou une API. La bibliothèque gère XLS et XLSX sans nécessiter Microsoft Office sur la machine.
Démarrage rapide : Lire une cellule avec IronXL en une ligne
Une seule ligne charge un classeur Excel et extrait une valeur d'une cellule. Pas d'Interop, pas de configuration, pas de processus Excel s'exécutant en arrière-plan.
1Install IronXL with NuGet Package Manager
PM > Install-Package IronXL.Excel
Install-Package IronXL.Excel
2Copiez et exécutez cet extrait de code.
var value = IronXL.WorkBook.Load("file.xlsx").GetWorkSheet(0)["A1"].StringValue;
var value = IronXL.WorkBook.Load("file.xlsx").GetWorkSheet(0)["A1"].StringValue;
C#
3Déployez pour tester sur votre environnement de production.
Commencez à utiliser IronXL dans votre projet dès aujourd'hui avec un essai gratuit
Comment configurer IronXL pour lire des fichiers Excel en C# ?
L'installation elle-même est une installation via NuGet et une directive using IronXL;. La bibliothèque gère à la fois .XLS et .XLSX, de sorte que le même chemin de code fonctionne pour les feuilles de calcul héritées et le format Open XML moderne.
Chargez et lisez les classeurs Excel en utilisant WorkBook.Load()
Accédez aux feuilles de calcul avec la méthode GetWorkSheet()
Lisez les valeurs des cellules en utilisant des adresses de style Excel comme sheet["A1"].Value
Valider et traiter les données de la feuille de calcul par programmation
Exporter les données vers des bases de données à l'aide d'Entity Framework
IronXL lit et édite les documents Microsoft Excel depuis C# sans dépendre du produit Office. Il ne nécessite pas Microsoft Excel installé, et il n'a pas besoin d'Interop. See the comparison with Microsoft.Office.Interop.Excel for the differences in approach and API surface.
Si vous venez d'Interop, le modèle mental est différent et vaut la peine d'être bien compris avant d'écrire du code. Interop lance un processus Excel.exe réel en arrière-plan et votre code automatise cette application via COM. IronXL lit directement les octets du fichier en mémoire et les présente sous forme d'objets. Pas de processus Excel, pas de pompe de message, pas de marshaling COM. La conséquence pratique que je vois piéger le plus de gens : Interop indexe les cellules à partir de [1, 1] (basé sur 1, tout comme l'interface utilisateur d'Excel), mais l'accès aux lignes/colonnes d'IronXL est basé sur 0. L'indexeur de chaînes ["A1"] correspond à l'interface utilisateur des feuilles de calcul dans les deux bibliothèques, donc lorsque vous pouvez rester dans la forme de chaîne, la migration se lit presque identiquement. Les bugs de décalage de un dans le sens longitudinal proviennent tous de l'indexeur numérique.
IronXL comprend :
Assistance produit dédiée assurée par nos ingénieurs .NET
Installation facile via Microsoft Visual Studio
Essai gratuit pour le développement. Licences de liteLicense
Les projets C# et VB.NET peuvent utiliser IronXL de la même manière pour lire ou créer des fichiers Excel.
Lecture des fichiers Excel .XLS et .XLSX avec IronXL
Voici le flux de travail essentiel pour lire des fichiers Excel à l'aide d'IronXL :
Utilisez la méthode WorkBook.Load() pour lire n'importe quel document XLS, XLSX ou CSV
Accédez aux valeurs des cellules en utilisant des adresses de style Excel : sheet["A11"].DecimalValue
using IronXL;using System;using System.Linq;// Load Excel workbook from file pathWorkBook workBook = WorkBook.Load("test.xlsx");// Access the first worksheet using LINQWorkSheet workSheet = workBook.WorkSheets.First();// Read integer value from cell A2int cellValue = workSheet["A2"].IntValue;Console.WriteLine($"Cell A2 value: {cellValue}");// Iterate through a range of cellsforeach (var cell in workSheet["A2:A10"]){Console.WriteLine("Cell {0} has value '{1}'", cell.AddressString, cell.Text);}// Advanced Operations with LINQ// Calculate sum using built_in Sum() methoddecimal sum = workSheet["A2:A10"].Sum();// Find maximum value using LINQdecimal max = workSheet["A2:A10"].Max(c => c.DecimalValue);// Output calculated resultsConsole.WriteLine($"Sum of A2:A10: {sum}");Console.WriteLine($"Maximum value: {max}");
using IronXL;
using System;
using System.Linq;
// Load Excel workbook from file path
WorkBook workBook = WorkBook.Load("test.xlsx");
// Access the first worksheet using LINQ
WorkSheet workSheet = workBook.WorkSheets.First();
// Read integer value from cell A2
int cellValue = workSheet["A2"].IntValue;
Console.WriteLine($"Cell A2 value: {cellValue}");
// Iterate through a range of cells
foreach (var cell in workSheet["A2:A10"])
{
Console.WriteLine("Cell {0} has value '{1}'", cell.AddressString, cell.Text);
}
// Advanced Operations with LINQ
// Calculate sum using built_in Sum() method
decimal sum = workSheet["A2:A10"].Sum();
// Find maximum value using LINQ
decimal max = workSheet["A2:A10"].Max(c => c.DecimalValue);
// Output calculated results
Console.WriteLine($"Sum of A2:A10: {sum}");
Console.WriteLine($"Maximum value: {max}");
ImportsIronXLImportsSystemImportsSystem.Linq' Load Excel workbook from file pathDim workBook AsWorkBook = WorkBook.Load("test.xlsx")' Access the first worksheet using LINQDim workSheet AsWorkSheet = workBook.WorkSheets.First()' Read integer value from cell A2Dim cellValue AsInteger = workSheet("A2").IntValueConsole.WriteLine($"Cell A2 value: {cellValue}")' Iterate through a range of cellsFor Each cell In workSheet("A2:A10")Console.WriteLine("Cell {0} has value '{1}'", cell.AddressString, cell.Text)Next' Advanced Operations with LINQ' Calculate sum using built_in Sum() methodDim sum AsDecimal = workSheet("A2:A10").Sum()' Find maximum value using LINQDim max AsDecimal = workSheet("A2:A10").Max(Function(c) c.DecimalValue)' Output calculated resultsConsole.WriteLine($"Sum of A2:A10: {sum}")Console.WriteLine($"Maximum value: {max}")
Imports IronXL
Imports System
Imports System.Linq
' Load Excel workbook from file path
Dim workBook As WorkBook = WorkBook.Load("test.xlsx")
' Access the first worksheet using LINQ
Dim workSheet As WorkSheet = workBook.WorkSheets.First()
' Read integer value from cell A2
Dim cellValue As Integer = workSheet("A2").IntValue
Console.WriteLine($"Cell A2 value: {cellValue}")
' Iterate through a range of cells
For Each cell In workSheet("A2:A10")
Console.WriteLine("Cell {0} has value '{1}'", cell.AddressString, cell.Text)
Next
' Advanced Operations with LINQ
' Calculate sum using built_in Sum() method
Dim sum As Decimal = workSheet("A2:A10").Sum()
' Find maximum value using LINQ
Dim max As Decimal = workSheet("A2:A10").Max(Function(c) c.DecimalValue)
' Output calculated results
Console.WriteLine($"Sum of A2:A10: {sum}")
Console.WriteLine($"Maximum value: {max}")
Le fragment de code présente les quatre opérations que vous utiliserez constamment : charger un classeur, lire une cellule par adresse, itérer une plage et exécuter des calculs sur une plage. WorkBook.Load() détecte le format du fichier à partir de l'extension, et la syntaxe de plage ["A2:A10"] correspond à la sélection de cellule que vous saisiriez directement dans Excel. Les plages sont IEnumerable<Cell>, donc LINQ fonctionne directement contre elles pour les sommes, les filtres, et les projections.
Quelle est la rapidité de cela en pratique ?
Pour vous donner un aperçu de la performance réaliste, j'ai écrit un petit projet console qui charge le même type de fichiers utilisés tout au long de ce tutoriel et chronomètre les opérations. Le banc d'essai se trouve dans un projet d'exemple ReadExcelBenchmark que vous pouvez exécuter vous-même. Sur une boîte Windows 11 exécutant .NET 9.0.7, les chiffres à travers plusieurs exécutions se situent approximativement ici :
Opération
Premier chargement à froid (processus frais)
Moyenne à chaud sur 10 itérations
Chargez GDP.xlsx (213 lignes) et faites la somme de la colonne B
~270 ms
~40 ms (plage de 25 à 70 ms)
Chargez People.xlsx (100 lignes) et validez chaque cellule avec regex
~30 ms
~28 ms
Le premier chiffre à froid est dominé par le chargement de l'assemblage et le préchauffage du JIT d'IronXL ; le second chiffre à froid est beaucoup plus bas car l'assemblage est déjà en mémoire à ce stade. Les exécutions à chaud se stabilisent dans une bande étroite une fois que le JIT a compilé les chemins fréquemment utilisés.
Si vous constatez des temps de chargement de plusieurs secondes sur des fichiers de cette taille, le coupable est presque toujours l'appel de WorkBook.Load() à l'intérieur d'une boucle plutôt qu'une fois en dehors. Chargez le classeur une fois, puis itérez les cellules ou lignes dont vous avez réellement besoin. Je vois ce schéma exact dans environ la moitié des tickets de support " IronXL est lent " que nous recevons.
Les exemples de code de ce tutoriel fonctionnent avec trois exemples de feuilles de calcul Excel qui illustrent différents scénarios de données :
Exemples de fichiers Excel (GDP.xlsx, People.xlsx et PopulationByState.xlsx) utilisés tout au long de ce tutoriel pour illustrer diverses opérations IronXL.
Comment puis-je installer la bibliothèque IronXL C# ?
Ajoutez la bibliothèque IronXL.Excel à un projet .NET via NuGet, ou en référencer directement le DLL.
Installation du package NuGet IronXL
Dans Visual Studio, cliquez avec le bouton droit sur votre projet et sélectionnez " Gérer les packages NuGet… "
Recherchez IronXL.Excel dans l'onglet de recherche
Cliquez sur le bouton Installer pour ajouter IronXL à votre projet.
L'installation d'IronXL via le gestionnaire de packages NuGet de Visual Studio assure une gestion automatique des dépendances.
Vous pouvez également installer IronXL à l'aide de la console du Package Manager :
Ouvrez la console du gestionnaire de packages (Outils → Gestionnaire de packages NuGet → Console du gestionnaire de packages)
Pour une installation manuelle, téléchargez la DLL IronXL .NET Excel et référencez-la directement dans votre projet Visual Studio.
Comment charger et lire un classeur Excel ?
La WorkBook classe représente un fichier Excel complet. Chargez les fichiers Excel en utilisant la méthode WorkBook.Load(), qui accepte les chemins de fichiers pour les formats XLS, XLSX, CSV, et TSV.
using IronXL;using System;using System.Linq;// Load Excel file from specified pathWorkBook workBook = WorkBook.Load(@"Spreadsheets\GDP.xlsx");Console.WriteLine("Workbook loaded successfully.");// Access specific worksheet by nameWorkSheet sheet = workBook.GetWorkSheet("Sheet1");// Read and display cell valuestring cellValue = sheet["A1"].StringValue;Console.WriteLine($"Cell A1 contains: {cellValue}");// Perform additional operations// Count non_empty cells in column Aint rowCount = sheet["A:A"].Count(cell => !cell.IsEmpty);Console.WriteLine($"Column A has {rowCount} non_empty cells");
using IronXL;
using System;
using System.Linq;
// Load Excel file from specified path
WorkBook workBook = WorkBook.Load(@"Spreadsheets\GDP.xlsx");
Console.WriteLine("Workbook loaded successfully.");
// Access specific worksheet by name
WorkSheet sheet = workBook.GetWorkSheet("Sheet1");
// Read and display cell value
string cellValue = sheet["A1"].StringValue;
Console.WriteLine($"Cell A1 contains: {cellValue}");
// Perform additional operations
// Count non_empty cells in column A
int rowCount = sheet["A:A"].Count(cell => !cell.IsEmpty);
Console.WriteLine($"Column A has {rowCount} non_empty cells");
ImportsIronXLImportsSystemImportsSystem.Linq' Load Excel file from specified pathDim workBook AsWorkBook = WorkBook.Load("Spreadsheets\GDP.xlsx")Console.WriteLine("Workbook loaded successfully.")' Access specific worksheet by nameDim sheet AsWorkSheet = workBook.GetWorkSheet("Sheet1")' Read and display cell valueDim cellValue AsString = sheet("A1").StringValueConsole.WriteLine($"Cell A1 contains: {cellValue}")' Perform additional operations' Count non_empty cells in column ADim rowCount AsInteger = sheet("A:A").Count(Function(cell) Not cell.IsEmpty)Console.WriteLine($"Column A has {rowCount} non_empty cells")
Imports IronXL
Imports System
Imports System.Linq
' Load Excel file from specified path
Dim workBook As WorkBook = WorkBook.Load("Spreadsheets\GDP.xlsx")
Console.WriteLine("Workbook loaded successfully.")
' Access specific worksheet by name
Dim sheet As WorkSheet = workBook.GetWorkSheet("Sheet1")
' Read and display cell value
Dim cellValue As String = sheet("A1").StringValue
Console.WriteLine($"Cell A1 contains: {cellValue}")
' Perform additional operations
' Count non_empty cells in column A
Dim rowCount As Integer = sheet("A:A").Count(Function(cell) Not cell.IsEmpty)
Console.WriteLine($"Column A has {rowCount} non_empty cells")
Chaque WorkBook contient plusieurs objets WorkSheet représentant des feuilles Excel individuelles. Accédez aux feuilles de calcul par nom en utilisant GetWorkSheet() :
using IronXL;using System;// Get worksheet by nameWorkSheet workSheet = workBook.GetWorkSheet("GDPByCountry");Console.WriteLine("Worksheet 'GDPByCountry' not found");// List available worksheetsforeach (var sheet in workBook.WorkSheets){Console.WriteLine($"Available: {sheet.Name}");}
using IronXL;
using System;
// Get worksheet by name
WorkSheet workSheet = workBook.GetWorkSheet("GDPByCountry");
Console.WriteLine("Worksheet 'GDPByCountry' not found");
// List available worksheets
foreach (var sheet in workBook.WorkSheets)
{
Console.WriteLine($"Available: {sheet.Name}");
}
ImportsIronXLImportsSystem' Get worksheet by nameDim workSheet AsWorkSheet = workBook.GetWorkSheet("GDPByCountry")Console.WriteLine("Worksheet 'GDPByCountry' not found")' List available worksheetsFor Each sheet In workBook.WorkSheetsConsole.WriteLine($"Available: {sheet.Name}")Next
Imports IronXL
Imports System
' Get worksheet by name
Dim workSheet As WorkSheet = workBook.GetWorkSheet("GDPByCountry")
Console.WriteLine("Worksheet 'GDPByCountry' not found")
' List available worksheets
For Each sheet In workBook.WorkSheets
Console.WriteLine($"Available: {sheet.Name}")
Next
Comment créer de nouveaux documents Excel en C# ?
Créez de nouveaux documents Excel en construisant un objet WorkBook avec le format de fichier de votre choix. IronXL prend en charge les formats XLSX modernes et XLS plus anciens.
using IronXL;// Create new XLSX workbook (recommended format)WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);// Set workbook metadataworkBook.Metadata.Author = "Your Application";workBook.Metadata.Comments = "Generated by IronXL";// Create new XLS workbook for legacy supportWorkBook legacyWorkBook = WorkBook.Create(ExcelFileFormat.XLS);// Save the workbookworkBook.SaveAs("NewDocument.xlsx");
using IronXL;
// Create new XLSX workbook (recommended format)
WorkBook workBook = WorkBook.Create(ExcelFileFormat.XLSX);
// Set workbook metadata
workBook.Metadata.Author = "Your Application";
workBook.Metadata.Comments = "Generated by IronXL";
// Create new XLS workbook for legacy support
WorkBook legacyWorkBook = WorkBook.Create(ExcelFileFormat.XLS);
// Save the workbook
workBook.SaveAs("NewDocument.xlsx");
ImportsIronXL' Create new XLSX workbook (recommended format)Private workBook AsWorkBook = WorkBook.Create(ExcelFileFormat.XLSX)' Set workbook metadataworkBook.Metadata.Author = "Your Application"workBook.Metadata.Comments = "Generated by IronXL"' Create new XLS workbook for legacy supportDim legacyWorkBook AsWorkBook = WorkBook.Create(ExcelFileFormat.XLS)' Save the workbookworkBook.SaveAs("NewDocument.xlsx")
Imports IronXL
' Create new XLSX workbook (recommended format)
Private workBook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
' Set workbook metadata
workBook.Metadata.Author = "Your Application"
workBook.Metadata.Comments = "Generated by IronXL"
' Create new XLS workbook for legacy support
Dim legacyWorkBook As WorkBook = WorkBook.Create(ExcelFileFormat.XLS)
' Save the workbook
workBook.SaveAs("NewDocument.xlsx")
Remarque : Utilisez ExcelFileFormat.XLS uniquement lorsque la compatibilité avec Excel 2003 et les versions antérieures est requise.
Comment ajouter des feuilles de calcul à un document Excel ?
Un WorkBook IronXL contient une collection de feuilles de calcul. Comprendre cette structure est utile lors de la création de fichiers Excel à plusieurs feuilles.
Représentation visuelle de la structure WorkBook contenant plusieurs objets WorkSheet dans IronXL.
Créez de nouvelles feuilles de calcul en utilisant CreateWorkSheet() :
using IronXL;// Create multiple worksheets with descriptive namesWorkSheet summarySheet = workBook.CreateWorkSheet("Summary");WorkSheet dataSheet = workBook.CreateWorkSheet("RawData");WorkSheet chartSheet = workBook.CreateWorkSheet("Charts");// Set the active worksheetworkBook.SetActiveTab(0); // Makes "Summary" the active sheet// Access default worksheet (first sheet)WorkSheet defaultSheet = workBook.DefaultWorkSheet;
using IronXL;
// Create multiple worksheets with descriptive names
WorkSheet summarySheet = workBook.CreateWorkSheet("Summary");
WorkSheet dataSheet = workBook.CreateWorkSheet("RawData");
WorkSheet chartSheet = workBook.CreateWorkSheet("Charts");
// Set the active worksheet
workBook.SetActiveTab(0); // Makes "Summary" the active sheet
// Access default worksheet (first sheet)
WorkSheet defaultSheet = workBook.DefaultWorkSheet;
ImportsIronXL' Create multiple worksheets with descriptive namesDim summarySheet AsWorkSheet = workBook.CreateWorkSheet("Summary")Dim dataSheet AsWorkSheet = workBook.CreateWorkSheet("RawData")Dim chartSheet AsWorkSheet = workBook.CreateWorkSheet("Charts")' Set the active worksheetworkBook.SetActiveTab(0) ' Makes "Summary" the active sheet' Access default worksheet (first sheet)Dim defaultSheet AsWorkSheet = workBook.DefaultWorkSheet
Imports IronXL
' Create multiple worksheets with descriptive names
Dim summarySheet As WorkSheet = workBook.CreateWorkSheet("Summary")
Dim dataSheet As WorkSheet = workBook.CreateWorkSheet("RawData")
Dim chartSheet As WorkSheet = workBook.CreateWorkSheet("Charts")
' Set the active worksheet
workBook.SetActiveTab(0) ' Makes "Summary" the active sheet
' Access default worksheet (first sheet)
Dim defaultSheet As WorkSheet = workBook.DefaultWorkSheet
Comment lire et modifier les valeurs des cellules ?
Lire et modifier une seule cellule
Accédez aux cellules individuelles via la propriété d'indexation de la feuille de calcul. La classe Cell d'IronXL fournit des propriétés de valeur fortement typées.
using IronXL;using System;using System.Linq;// Load workbook and get worksheetWorkBook workBook = WorkBook.Load("test.xlsx");WorkSheet workSheet = workBook.DefaultWorkSheet;// Access cell B1IronXL.Cell cell = workSheet["B1"].First();// Read cell value with type safetystring textValue = cell.StringValue;int intValue = cell.IntValue;decimal decimalValue = cell.DecimalValue;DateTime? dateValue = cell.DateTimeValue;// Check cell data typeif (cell.IsNumeric){Console.WriteLine($"Numeric value: {cell.DecimalValue}");}else if (cell.IsText){Console.WriteLine($"Text value: {cell.StringValue}");}
using IronXL;
using System;
using System.Linq;
// Load workbook and get worksheet
WorkBook workBook = WorkBook.Load("test.xlsx");
WorkSheet workSheet = workBook.DefaultWorkSheet;
// Access cell B1
IronXL.Cell cell = workSheet["B1"].First();
// Read cell value with type safety
string textValue = cell.StringValue;
int intValue = cell.IntValue;
decimal decimalValue = cell.DecimalValue;
DateTime? dateValue = cell.DateTimeValue;
// Check cell data type
if (cell.IsNumeric)
{
Console.WriteLine($"Numeric value: {cell.DecimalValue}");
}
else if (cell.IsText)
{
Console.WriteLine($"Text value: {cell.StringValue}");
}
ImportsIronXLImportsSystemImportsSystem.Linq' Load workbook and get worksheetDim workBook AsWorkBook = WorkBook.Load("test.xlsx")Dim workSheet AsWorkSheet = workBook.DefaultWorkSheet' Access cell B1Dim cell AsIronXL.Cell = workSheet("B1").First()' Read cell value with type safetyDim textValue AsString = cell.StringValueDim intValue AsInteger = cell.IntValueDim decimalValue AsDecimal = cell.DecimalValueDim dateValue AsDateTime? = cell.DateTimeValue' Check cell data typeIf cell.IsNumericThenConsole.WriteLine($"Numeric value: {cell.DecimalValue}")ElseIf cell.IsTextThenConsole.WriteLine($"Text value: {cell.StringValue}")End If
Imports IronXL
Imports System
Imports System.Linq
' Load workbook and get worksheet
Dim workBook As WorkBook = WorkBook.Load("test.xlsx")
Dim workSheet As WorkSheet = workBook.DefaultWorkSheet
' Access cell B1
Dim cell As IronXL.Cell = workSheet("B1").First()
' Read cell value with type safety
Dim textValue As String = cell.StringValue
Dim intValue As Integer = cell.IntValue
Dim decimalValue As Decimal = cell.DecimalValue
Dim dateValue As DateTime? = cell.DateTimeValue
' Check cell data type
If cell.IsNumeric Then
Console.WriteLine($"Numeric value: {cell.DecimalValue}")
ElseIf cell.IsText Then
Console.WriteLine($"Text value: {cell.StringValue}")
End If
La classe Cell propose plusieurs propriétés pour différents types de données, convertissant automatiquement les valeurs lorsque cela est possible. Pour plus d'opérations sur les cellules, consultez le tutoriel sur la mise en forme des cellules .
// Write different data types to cellsworkSheet["A1"].Value = "Product Name"; // StringworkSheet["B1"].Value = 99.95m; // DecimalworkSheet["C1"].Value = DateTime.Today; // DateworkSheet["D1"].Formula = "=B1*1.2"; // Formula // Format cellsworkSheet["B1"].FormatString = "$#,##0.00"; // Currency formatworkSheet["C1"].FormatString = "yyyy-MM-dd";// Date format // Save changesworkBook.Save();
// Write different data types to cells
workSheet["A1"].Value = "Product Name"; // String
workSheet["B1"].Value = 99.95m; // Decimal
workSheet["C1"].Value = DateTime.Today; // Date
workSheet["D1"].Formula = "=B1*1.2"; // Formula
// Format cells
workSheet["B1"].FormatString = "$#,##0.00"; // Currency format
workSheet["C1"].FormatString = "yyyy-MM-dd";// Date format
// Save changes
workBook.Save();
' Write different data types to cellsworkSheet("A1").Value = "Product Name" ' StringworkSheet("B1").Value = 99.95D ' DecimalworkSheet("C1").Value = DateTime.Today' DateworkSheet("D1").Formula = "=B1*1.2" ' Formula ' Format cellsworkSheet("B1").FormatString = "$#,##0.00" ' Currency formatworkSheet("C1").FormatString = "yyyy-MM-dd" ' Date format ' Save changesworkBook.Save()
' Write different data types to cells
workSheet("A1").Value = "Product Name" ' String
workSheet("B1").Value = 99.95D ' Decimal
workSheet("C1").Value = DateTime.Today ' Date
workSheet("D1").Formula = "=B1*1.2" ' Formula
' Format cells
workSheet("B1").FormatString = "$#,##0.00" ' Currency format
workSheet("C1").FormatString = "yyyy-MM-dd" ' Date format
' Save changes
workBook.Save()
Comment puis-je travailler avec des plages de cellules ?
La Range classe représente une collection de cellules, permettant des opérations en bloc sur les données Excel.
using IronXL;using Range = IronXL.Range;// Select range using Excel notationRange range = workSheet["D2:D101"];// Alternative: Use Range class for dynamic selectionRange dynamicRange = workSheet.GetRange("D2:D101"); // Row 2_101, Column D// Perform bulk operationsrange.Value = 0; // Set all cells to 0
using IronXL;
using Range = IronXL.Range;
// Select range using Excel notation
Range range = workSheet["D2:D101"];
// Alternative: Use Range class for dynamic selection
Range dynamicRange = workSheet.GetRange("D2:D101"); // Row 2_101, Column D
// Perform bulk operations
range.Value = 0; // Set all cells to 0
ImportsIronXL' Select range using Excel notationDim range AsRange = workSheet("D2:D101")' Alternative: Use Range class for dynamic selectionDim dynamicRange AsRange = workSheet.GetRange("D2:D101") ' Row 2_101, Column D' Perform bulk operationsrange.Value = 0 ' Set all cells to 0
Imports IronXL
' Select range using Excel notation
Dim range As Range = workSheet("D2:D101")
' Alternative: Use Range class for dynamic selection
Dim dynamicRange As Range = workSheet.GetRange("D2:D101") ' Row 2_101, Column D
' Perform bulk operations
range.Value = 0 ' Set all cells to 0
Traitement efficace des plages de valeurs à l'aide de boucles lorsque le nombre de cellules est connu :
// Data validation examplepublic class ValidationResult{ public intRow { get; set; } public stringPhoneError { get; set; } public stringEmailError { get; set; } public stringDateError { get; set; } public boolIsValid => string.IsNullOrEmpty(PhoneError) && string.IsNullOrEmpty(EmailError) && string.IsNullOrEmpty(DateError);}// Validate data in rows 2-101var results = new List<ValidationResult>();for (int row = 2; row <= 101; row++){ var result = new ValidationResult { Row = row }; // Get row data efficiently var phoneCell = workSheet[$"B{row}"]; var emailCell = workSheet[$"D{row}"]; var dateCell = workSheet[$"E{row}"]; // Validate phone number if (!IsValidPhoneNumber(phoneCell.StringValue)) result.PhoneError = "Invalid phone format"; // Validate email if (!IsValidEmail(emailCell.StringValue)) result.EmailError = "Invalid email format"; // Validate date if (!dateCell.IsDateTime) result.DateError = "Invalid date format"; results.Add(result);}// Helper methodsboolIsValidPhoneNumber(string phone) => System.Text.RegularExpressions.Regex.IsMatch(phone, @"^\d{3}-\d{3}-\d{4}$");boolIsValidEmail(string email) => email.Contains("@") && email.Contains(".");
// Data validation example
public class ValidationResult
{
public int Row { get; set; }
public string PhoneError { get; set; }
public string EmailError { get; set; }
public string DateError { get; set; }
public bool IsValid => string.IsNullOrEmpty(PhoneError) &&
string.IsNullOrEmpty(EmailError) &&
string.IsNullOrEmpty(DateError);
}
// Validate data in rows 2-101
var results = new List<ValidationResult>();
for (int row = 2; row <= 101; row++)
{
var result = new ValidationResult { Row = row };
// Get row data efficiently
var phoneCell = workSheet[$"B{row}"];
var emailCell = workSheet[$"D{row}"];
var dateCell = workSheet[$"E{row}"];
// Validate phone number
if (!IsValidPhoneNumber(phoneCell.StringValue))
result.PhoneError = "Invalid phone format";
// Validate email
if (!IsValidEmail(emailCell.StringValue))
result.EmailError = "Invalid email format";
// Validate date
if (!dateCell.IsDateTime)
result.DateError = "Invalid date format";
results.Add(result);
}
// Helper methods
bool IsValidPhoneNumber(string phone) =>
System.Text.RegularExpressions.Regex.IsMatch(phone, @"^\d{3}-\d{3}-\d{4}$");
bool IsValidEmail(string email) =>
email.Contains("@") && email.Contains(".");
' Data validation examplePublic Class ValidationResult Public Property RowAsInteger Public Property PhoneErrorAsString Public Property EmailErrorAsString Public Property DateErrorAsString PublicReadOnlyPropertyIsValidAsBoolean Get ReturnString.IsNullOrEmpty(PhoneError) AndAlsoString.IsNullOrEmpty(EmailError) AndAlsoString.IsNullOrEmpty(DateError)End Get End PropertyEnd Class' Validate data in rows 2-101Dim results As New List(OfValidationResult)()For row AsInteger = 2 To 101 Dim result As New ValidationResultWith {.Row = row} ' Get row data efficiently Dim phoneCell = workSheet($"B{row}") Dim emailCell = workSheet($"D{row}") Dim dateCell = workSheet($"E{row}") ' Validate phone number IfNotIsValidPhoneNumber(phoneCell.StringValue) Then result.PhoneError = "Invalid phone format" End If ' Validate email IfNotIsValidEmail(emailCell.StringValue) Then result.EmailError = "Invalid email format" End If ' Validate date IfNot dateCell.IsDateTimeThen result.DateError = "Invalid date format" End If results.Add(result)Next' Helper methodsPrivate Function IsValidPhoneNumber(phone AsString) AsBoolean ReturnSystem.Text.RegularExpressions.Regex.IsMatch(phone, "^\d{3}-\d{3}-\d{4}$")End FunctionPrivate Function IsValidEmail(email AsString) AsBoolean Return email.Contains("@") AndAlso email.Contains(".")End Function
' Data validation example
Public Class ValidationResult
Public Property Row As Integer
Public Property PhoneError As String
Public Property EmailError As String
Public Property DateError As String
Public ReadOnly Property IsValid As Boolean
Get
Return String.IsNullOrEmpty(PhoneError) AndAlso
String.IsNullOrEmpty(EmailError) AndAlso
String.IsNullOrEmpty(DateError)
End Get
End Property
End Class
' Validate data in rows 2-101
Dim results As New List(Of ValidationResult)()
For row As Integer = 2 To 101
Dim result As New ValidationResult With {.Row = row}
' Get row data efficiently
Dim phoneCell = workSheet($"B{row}")
Dim emailCell = workSheet($"D{row}")
Dim dateCell = workSheet($"E{row}")
' Validate phone number
If Not IsValidPhoneNumber(phoneCell.StringValue) Then
result.PhoneError = "Invalid phone format"
End If
' Validate email
If Not IsValidEmail(emailCell.StringValue) Then
result.EmailError = "Invalid email format"
End If
' Validate date
If Not dateCell.IsDateTime Then
result.DateError = "Invalid date format"
End If
results.Add(result)
Next
' Helper methods
Private Function IsValidPhoneNumber(phone As String) As Boolean
Return System.Text.RegularExpressions.Regex.IsMatch(phone, "^\d{3}-\d{3}-\d{4}$")
End Function
Private Function IsValidEmail(email As String) As Boolean
Return email.Contains("@") AndAlso email.Contains(".")
End Function
Comment ajouter des formules à une feuille de calcul Excel ?
Appliquez les formules Excel en utilisant la propriété Formula. IronXL prend en charge la syntaxe standard des formules Excel.
using IronXL;// Add formulas to calculate percentagesint lastRow = 50;for (int row = 2; row < lastRow; row++){ // Calculate percentage: current value / total workSheet[$"C{row}"].Formula = $"=B{row}/B{lastRow}"; // Format as percentage workSheet[$"C{row}"].FormatString = "0.00%";}// Add summary formulasworkSheet["B52"].Formula = "=SUM(B2:B50)"; // SumworkSheet["B53"].Formula = "=AVERAGE(B2:B50)"; // AverageworkSheet["B54"].Formula = "=MAX(B2:B50)"; // MaximumworkSheet["B55"].Formula = "=MIN(B2:B50)"; // Minimum // Force formula evaluationworkBook.EvaluateAll();
using IronXL;
// Add formulas to calculate percentages
int lastRow = 50;
for (int row = 2; row < lastRow; row++)
{
// Calculate percentage: current value / total
workSheet[$"C{row}"].Formula = $"=B{row}/B{lastRow}";
// Format as percentage
workSheet[$"C{row}"].FormatString = "0.00%";
}
// Add summary formulas
workSheet["B52"].Formula = "=SUM(B2:B50)"; // Sum
workSheet["B53"].Formula = "=AVERAGE(B2:B50)"; // Average
workSheet["B54"].Formula = "=MAX(B2:B50)"; // Maximum
workSheet["B55"].Formula = "=MIN(B2:B50)"; // Minimum
// Force formula evaluation
workBook.EvaluateAll();
ImportsIronXL' Add formulas to calculate percentagesDim lastRow AsInteger = 50For row AsInteger = 2 To lastRow - 1 ' Calculate percentage: current value / total workSheet($"C{row}").Formula = $"=B{row}/B{lastRow}" ' Format as percentage workSheet($"C{row}").FormatString = "0.00%"Next' Add summary formulasworkSheet("B52").Formula = "=SUM(B2:B50)" ' SumworkSheet("B53").Formula = "=AVERAGE(B2:B50)" ' AverageworkSheet("B54").Formula = "=MAX(B2:B50)" ' MaximumworkSheet("B55").Formula = "=MIN(B2:B50)" ' Minimum' Force formula evaluationworkBook.EvaluateAll()
Imports IronXL
' Add formulas to calculate percentages
Dim lastRow As Integer = 50
For row As Integer = 2 To lastRow - 1
' Calculate percentage: current value / total
workSheet($"C{row}").Formula = $"=B{row}/B{lastRow}"
' Format as percentage
workSheet($"C{row}").FormatString = "0.00%"
Next
' Add summary formulas
workSheet("B52").Formula = "=SUM(B2:B50)" ' Sum
workSheet("B53").Formula = "=AVERAGE(B2:B50)" ' Average
workSheet("B54").Formula = "=MAX(B2:B50)" ' Maximum
workSheet("B55").Formula = "=MIN(B2:B50)" ' Minimum
' Force formula evaluation
workBook.EvaluateAll()
Comment puis-je valider les données d'une feuille de calcul ?
Un cas d'utilisation courant que je vois est la validation des feuilles de calcul fournies par l'utilisateur avant d'importer les données dans une base de données. L'exemple ci-dessous vérifie les numéros de téléphone, les e-mails et les dates avec des expressions régulières et les vérifications de type intégrées d'IronXL.
using System.Text.RegularExpressions;using IronXL;// Validation implementationfor (int i = 2; i <= 101; i++){ var result = new PersonValidationResult { Row = i }; results.Add(result); // Get cells for current person var cells = workSheet[$"A{i}:E{i}"].ToList(); // Validate phone (column B) string phone = cells[1].StringValue; if (!Regex.IsMatch(phone, @"^\+?1?\d{10,14}$")) { result.PhoneNumberErrorMessage = "Invalid phone format"; } // Validate email (column D) string email = cells[3].StringValue; if (!Regex.IsMatch(email, @"^[^@\s]+@[^@\s]+\.[^@\s]+$")) { result.EmailErrorMessage = "Invalid email address"; } // Validate date (column E) if (!cells[4].IsDateTime) { result.DateErrorMessage = "Invalid date format"; }}
using System.Text.RegularExpressions;
using IronXL;
// Validation implementation
for (int i = 2; i <= 101; i++)
{
var result = new PersonValidationResult { Row = i };
results.Add(result);
// Get cells for current person
var cells = workSheet[$"A{i}:E{i}"].ToList();
// Validate phone (column B)
string phone = cells[1].StringValue;
if (!Regex.IsMatch(phone, @"^\+?1?\d{10,14}$"))
{
result.PhoneNumberErrorMessage = "Invalid phone format";
}
// Validate email (column D)
string email = cells[3].StringValue;
if (!Regex.IsMatch(email, @"^[^@\s]+@[^@\s]+\.[^@\s]+$"))
{
result.EmailErrorMessage = "Invalid email address";
}
// Validate date (column E)
if (!cells[4].IsDateTime)
{
result.DateErrorMessage = "Invalid date format";
}
}
ImportsSystem.Text.RegularExpressionsImportsIronXL' Validation implementationFor i AsInteger = 2 To 101 Dim result As New PersonValidationResultWith {.Row = i} results.Add(result) ' Get cells for current person Dim cells = workSheet($"A{i}:E{i}").ToList() ' Validate phone (column B) Dim phone AsString = cells(1).StringValue IfNotRegex.IsMatch(phone, "^\+?1?\d{10,14}$") Then result.PhoneNumberErrorMessage = "Invalid phone format" End If ' Validate email (column D) Dim email AsString = cells(3).StringValue IfNotRegex.IsMatch(email, "^[^@\s]+@[^@\s]+\.[^@\s]+$") Then result.EmailErrorMessage = "Invalid email address" End If ' Validate date (column E) IfNot cells(4).IsDateTimeThen result.DateErrorMessage = "Invalid date format" End IfNext i
Imports System.Text.RegularExpressions
Imports IronXL
' Validation implementation
For i As Integer = 2 To 101
Dim result As New PersonValidationResult With {.Row = i}
results.Add(result)
' Get cells for current person
Dim cells = workSheet($"A{i}:E{i}").ToList()
' Validate phone (column B)
Dim phone As String = cells(1).StringValue
If Not Regex.IsMatch(phone, "^\+?1?\d{10,14}$") Then
result.PhoneNumberErrorMessage = "Invalid phone format"
End If
' Validate email (column D)
Dim email As String = cells(3).StringValue
If Not Regex.IsMatch(email, "^[^@\s]+@[^@\s]+\.[^@\s]+$") Then
result.EmailErrorMessage = "Invalid email address"
End If
' Validate date (column E)
If Not cells(4).IsDateTime Then
result.DateErrorMessage = "Invalid date format"
End If
Next i
Enregistrer les résultats de validation dans une nouvelle feuille de calcul :
// Create results worksheetvar resultsSheet = workBook.CreateWorkSheet("ValidationResults");// Add headersresultsSheet["A1"].Value = "Row";resultsSheet["B1"].Value = "Valid";resultsSheet["C1"].Value = "Phone Error";resultsSheet["D1"].Value = "Email Error";resultsSheet["E1"].Value = "Date Error";// Style headersresultsSheet["A1:E1"].Style.Font.Bold = true;resultsSheet["A1:E1"].Style.SetBackgroundColor("#4472C4");resultsSheet["A1:E1"].Style.Font.Color = "#FFFFFF";// Output validation resultsfor (int i = 0; i < results.Count; i++){ var result = results[i]; int outputRow = i + 2; resultsSheet[$"A{outputRow}"].Value = result.Row; resultsSheet[$"B{outputRow}"].Value = result.IsValid ? "Yes" : "No"; resultsSheet[$"C{outputRow}"].Value = result.PhoneNumberErrorMessage ?? ""; resultsSheet[$"D{outputRow}"].Value = result.EmailErrorMessage ?? ""; resultsSheet[$"E{outputRow}"].Value = result.DateErrorMessage ?? ""; // Highlight invalid rows if (!result.IsValid) { resultsSheet[$"A{outputRow}:E{outputRow}"].Style.SetBackgroundColor("#FFE6E6"); }}// Auto-fit columnsfor (int col = 0; col < 5; col++){ resultsSheet.AutoSizeColumn(col);}// Save validated workbookworkBook.SaveAs(@"Spreadsheets\PeopleValidated.xlsx");
// Create results worksheet
var resultsSheet = workBook.CreateWorkSheet("ValidationResults");
// Add headers
resultsSheet["A1"].Value = "Row";
resultsSheet["B1"].Value = "Valid";
resultsSheet["C1"].Value = "Phone Error";
resultsSheet["D1"].Value = "Email Error";
resultsSheet["E1"].Value = "Date Error";
// Style headers
resultsSheet["A1:E1"].Style.Font.Bold = true;
resultsSheet["A1:E1"].Style.SetBackgroundColor("#4472C4");
resultsSheet["A1:E1"].Style.Font.Color = "#FFFFFF";
// Output validation results
for (int i = 0; i < results.Count; i++)
{
var result = results[i];
int outputRow = i + 2;
resultsSheet[$"A{outputRow}"].Value = result.Row;
resultsSheet[$"B{outputRow}"].Value = result.IsValid ? "Yes" : "No";
resultsSheet[$"C{outputRow}"].Value = result.PhoneNumberErrorMessage ?? "";
resultsSheet[$"D{outputRow}"].Value = result.EmailErrorMessage ?? "";
resultsSheet[$"E{outputRow}"].Value = result.DateErrorMessage ?? "";
// Highlight invalid rows
if (!result.IsValid)
{
resultsSheet[$"A{outputRow}:E{outputRow}"].Style.SetBackgroundColor("#FFE6E6");
}
}
// Auto-fit columns
for (int col = 0; col < 5; col++)
{
resultsSheet.AutoSizeColumn(col);
}
// Save validated workbook
workBook.SaveAs(@"Spreadsheets\PeopleValidated.xlsx");
ImportsSystem' Create results worksheetDim resultsSheet = workBook.CreateWorkSheet("ValidationResults")' Add headersresultsSheet("A1").Value = "Row"resultsSheet("B1").Value = "Valid"resultsSheet("C1").Value = "Phone Error"resultsSheet("D1").Value = "Email Error"resultsSheet("E1").Value = "Date Error"' Style headersresultsSheet("A1:E1").Style.Font.Bold = TrueresultsSheet("A1:E1").Style.SetBackgroundColor("#4472C4")resultsSheet("A1:E1").Style.Font.Color = "#FFFFFF"' Output validation resultsFor i AsInteger = 0 To results.Count - 1 Dim result = results(i) Dim outputRow AsInteger = i + 2 resultsSheet($"A{outputRow}").Value = result.Row resultsSheet($"B{outputRow}").Value = If(result.IsValid, "Yes", "No") resultsSheet($"C{outputRow}").Value = If(result.PhoneNumberErrorMessage, "") resultsSheet($"D{outputRow}").Value = If(result.EmailErrorMessage, "") resultsSheet($"E{outputRow}").Value = If(result.DateErrorMessage, "") ' Highlight invalid rows IfNot result.IsValidThen resultsSheet($"A{outputRow}:E{outputRow}").Style.SetBackgroundColor("#FFE6E6") End IfNext' Auto-fit columnsFor col AsInteger = 0 To 4 resultsSheet.AutoSizeColumn(col)Next' Save validated workbookworkBook.SaveAs("Spreadsheets\PeopleValidated.xlsx")
Imports System
' Create results worksheet
Dim resultsSheet = workBook.CreateWorkSheet("ValidationResults")
' Add headers
resultsSheet("A1").Value = "Row"
resultsSheet("B1").Value = "Valid"
resultsSheet("C1").Value = "Phone Error"
resultsSheet("D1").Value = "Email Error"
resultsSheet("E1").Value = "Date Error"
' Style headers
resultsSheet("A1:E1").Style.Font.Bold = True
resultsSheet("A1:E1").Style.SetBackgroundColor("#4472C4")
resultsSheet("A1:E1").Style.Font.Color = "#FFFFFF"
' Output validation results
For i As Integer = 0 To results.Count - 1
Dim result = results(i)
Dim outputRow As Integer = i + 2
resultsSheet($"A{outputRow}").Value = result.Row
resultsSheet($"B{outputRow}").Value = If(result.IsValid, "Yes", "No")
resultsSheet($"C{outputRow}").Value = If(result.PhoneNumberErrorMessage, "")
resultsSheet($"D{outputRow}").Value = If(result.EmailErrorMessage, "")
resultsSheet($"E{outputRow}").Value = If(result.DateErrorMessage, "")
' Highlight invalid rows
If Not result.IsValid Then
resultsSheet($"A{outputRow}:E{outputRow}").Style.SetBackgroundColor("#FFE6E6")
End If
Next
' Auto-fit columns
For col As Integer = 0 To 4
resultsSheet.AutoSizeColumn(col)
Next
' Save validated workbook
workBook.SaveAs("Spreadsheets\PeopleValidated.xlsx")
Comment exporter des données Excel vers une base de données ?
Utilisez IronXL avec Entity Framework pour exporter directement les données de vos feuilles de calcul vers des bases de données. Cet exemple illustre l'exportation de données de PIB national vers SQLite.
using System;using System.ComponentModel.DataAnnotations;using Microsoft.EntityFrameworkCore;using IronXL;// Define entity modelpublic class Country{ [Key] public GuidId { get; set; } = Guid.NewGuid(); [Required] [MaxLength(100)] public stringName { get; set; } [Range(0, double.MaxValue)] public decimalGDP { get; set; } public DateTimeImportedDate { get; set; } = DateTime.UtcNow;}
using System;
using System.ComponentModel.DataAnnotations;
using Microsoft.EntityFrameworkCore;
using IronXL;
// Define entity model
public class Country
{
[Key]
public Guid Id { get; set; } = Guid.NewGuid();
[Required]
[MaxLength(100)]
public string Name { get; set; }
[Range(0, double.MaxValue)]
public decimal GDP { get; set; }
public DateTime ImportedDate { get; set; } = DateTime.UtcNow;
}
ImportsSystemImportsSystem.ComponentModel.DataAnnotationsImportsMicrosoft.EntityFrameworkCoreImportsIronXL' Define entity modelPublic Class Country <Key> Public Property IdAsGuid = Guid.NewGuid() <Required> <MaxLength(100)> Public Property NameAsString <Range(0, Double.MaxValue)> Public Property GDPAsDecimal Public Property ImportedDateAsDateTime = DateTime.UtcNowEnd Class
Imports System
Imports System.ComponentModel.DataAnnotations
Imports Microsoft.EntityFrameworkCore
Imports IronXL
' Define entity model
Public Class Country
<Key>
Public Property Id As Guid = Guid.NewGuid()
<Required>
<MaxLength(100)>
Public Property Name As String
<Range(0, Double.MaxValue)>
Public Property GDP As Decimal
Public Property ImportedDate As DateTime = DateTime.UtcNow
End Class
Configurer le contexte Entity Framework pour les opérations de base de données :
public class CountryContext : DbContext{ public DbSet<Country> Countries { get; set; } protected override voidOnConfiguring(DbContextOptionsBuilder optionsBuilder) { // Configure SQLite connection optionsBuilder.UseSqlite("Data Source=CountryGDP.db"); // Enable sensitive data logging in development #ifDEBUG optionsBuilder.EnableSensitiveDataLogging(); #endif } protected override voidOnModelCreating(ModelBuilder modelBuilder) { // Configure decimal precision modelBuilder.Entity<Country>() .Property(c => c.GDP) .HasPrecision(18, 2); }}
public class CountryContext : DbContext
{
public DbSet<Country> Countries { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// Configure SQLite connection
optionsBuilder.UseSqlite("Data Source=CountryGDP.db");
// Enable sensitive data logging in development
#if DEBUG
optionsBuilder.EnableSensitiveDataLogging();
#endif
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// Configure decimal precision
modelBuilder.Entity<Country>()
.Property(c => c.GDP)
.HasPrecision(18, 2);
}
}
Public Class CountryContextInheritsDbContext Public Property CountriesAsDbSet(OfCountry)ProtectedOverrides Sub OnConfiguring(optionsBuilder AsDbContextOptionsBuilder) ' Configure SQLite connection optionsBuilder.UseSqlite("Data Source=CountryGDP.db") ' Enable sensitive data logging in development#IfDEBUGThen optionsBuilder.EnableSensitiveDataLogging()#End If End SubProtectedOverrides Sub OnModelCreating(modelBuilder AsModelBuilder) ' Configure decimal precision modelBuilder.Entity(OfCountry)() _ .Property(Function(c) c.GDP) _ .HasPrecision(18, 2) End SubEnd Class
Public Class CountryContext
Inherits DbContext
Public Property Countries As DbSet(Of Country)
Protected Overrides Sub OnConfiguring(optionsBuilder As DbContextOptionsBuilder)
' Configure SQLite connection
optionsBuilder.UseSqlite("Data Source=CountryGDP.db")
' Enable sensitive data logging in development
#If DEBUG Then
optionsBuilder.EnableSensitiveDataLogging()
#End If
End Sub
Protected Overrides Sub OnModelCreating(modelBuilder As ModelBuilder)
' Configure decimal precision
modelBuilder.Entity(Of Country)() _
.Property(Function(c) c.GDP) _
.HasPrecision(18, 2)
End Sub
End Class
Veuillez noter: Remarque : Pour utiliser différentes bases de données, installez le package NuGet approprié (par exemple, Microsoft.EntityFrameworkCore.SqlServer pour SQL Server) et modifiez la configuration de connexion en conséquence.
Importer des données Excel dans une base de données :
using System.Threading.Tasks;using IronXL;using Microsoft.EntityFrameworkCore;public async TaskImportGDPDataAsync(){ try { // Load Excel file var workBook = WorkBook.Load(@"Spreadsheets\GDP.xlsx"); var workSheet = workBook.GetWorkSheet("GDPByCountry"); using (var context = new CountryContext()) { // Ensure database exists await context.Database.EnsureCreatedAsync(); // Clear existing data (optional) await context.Database.ExecuteSqlRawAsync("DELETE FROM Countries"); // Import data with progress tracking int totalRows = 213; for (int row = 2; row <= totalRows; row++) { // Read country data var countryName = workSheet[$"A{row}"].StringValue; var gdpValue = workSheet[$"B{row}"].DecimalValue; // Skip empty rows if (string.IsNullOrWhiteSpace(countryName)) continue; // Create and add entity var country = new Country {Name = countryName.Trim(),GDP = gdpValue * 1_000_000 // Convert to actual value if in millions }; await context.Countries.AddAsync(country); // Save in batches for performance if (row % 50 == 0) { await context.SaveChangesAsync();Console.WriteLine($"Imported {row - 1} of {totalRows} countries"); } } // Save remaining records await context.SaveChangesAsync();Console.WriteLine($"Successfully imported {await context.Countries.CountAsync()} countries"); } } catch (Exception ex) {Console.WriteLine($"Import failed: {ex.Message}"); throw; }}
using System.Threading.Tasks;
using IronXL;
using Microsoft.EntityFrameworkCore;
public async Task ImportGDPDataAsync()
{
try
{
// Load Excel file
var workBook = WorkBook.Load(@"Spreadsheets\GDP.xlsx");
var workSheet = workBook.GetWorkSheet("GDPByCountry");
using (var context = new CountryContext())
{
// Ensure database exists
await context.Database.EnsureCreatedAsync();
// Clear existing data (optional)
await context.Database.ExecuteSqlRawAsync("DELETE FROM Countries");
// Import data with progress tracking
int totalRows = 213;
for (int row = 2; row <= totalRows; row++)
{
// Read country data
var countryName = workSheet[$"A{row}"].StringValue;
var gdpValue = workSheet[$"B{row}"].DecimalValue;
// Skip empty rows
if (string.IsNullOrWhiteSpace(countryName))
continue;
// Create and add entity
var country = new Country
{
Name = countryName.Trim(),
GDP = gdpValue * 1_000_000 // Convert to actual value if in millions
};
await context.Countries.AddAsync(country);
// Save in batches for performance
if (row % 50 == 0)
{
await context.SaveChangesAsync();
Console.WriteLine($"Imported {row - 1} of {totalRows} countries");
}
}
// Save remaining records
await context.SaveChangesAsync();
Console.WriteLine($"Successfully imported {await context.Countries.CountAsync()} countries");
}
}
catch (Exception ex)
{
Console.WriteLine($"Import failed: {ex.Message}");
throw;
}
}
ImportsSystem.Threading.TasksImportsIronXLImportsMicrosoft.EntityFrameworkCorePublicAsync Function ImportGDPDataAsync() AsTaskTry ' Load Excel file Dim workBook = WorkBook.Load("Spreadsheets\GDP.xlsx") Dim workSheet = workBook.GetWorkSheet("GDPByCountry")Using context = New CountryContext() ' Ensure database existsAwait context.Database.EnsureCreatedAsync() ' Clear existing data (optional)Await context.Database.ExecuteSqlRawAsync("DELETE FROM Countries") ' Import data with progress tracking Dim totalRows AsInteger = 213 For row AsInteger = 2 To totalRows ' Read country data Dim countryName = workSheet($"A{row}").StringValue Dim gdpValue = workSheet($"B{row}").DecimalValue ' Skip empty rows IfString.IsNullOrWhiteSpace(countryName) Then Continue For End If ' Create and add entity Dim country = New CountryWith { .Name = countryName.Trim(), .GDP = gdpValue * 1_000_000 ' Convert to actual value if in millions }Await context.Countries.AddAsync(country) ' Save in batches for performance If row Mod50 = 0 ThenAwait context.SaveChangesAsync()Console.WriteLine($"Imported {row - 1} of {totalRows} countries") End If Next ' Save remaining recordsAwait context.SaveChangesAsync()Console.WriteLine($"Successfully imported {Await context.Countries.CountAsync()} countries")EndUsingCatch ex AsExceptionConsole.WriteLine($"Import failed: {ex.Message}")ThrowEndTryEnd Function
Imports System.Threading.Tasks
Imports IronXL
Imports Microsoft.EntityFrameworkCore
Public Async Function ImportGDPDataAsync() As Task
Try
' Load Excel file
Dim workBook = WorkBook.Load("Spreadsheets\GDP.xlsx")
Dim workSheet = workBook.GetWorkSheet("GDPByCountry")
Using context = New CountryContext()
' Ensure database exists
Await context.Database.EnsureCreatedAsync()
' Clear existing data (optional)
Await context.Database.ExecuteSqlRawAsync("DELETE FROM Countries")
' Import data with progress tracking
Dim totalRows As Integer = 213
For row As Integer = 2 To totalRows
' Read country data
Dim countryName = workSheet($"A{row}").StringValue
Dim gdpValue = workSheet($"B{row}").DecimalValue
' Skip empty rows
If String.IsNullOrWhiteSpace(countryName) Then
Continue For
End If
' Create and add entity
Dim country = New Country With {
.Name = countryName.Trim(),
.GDP = gdpValue * 1_000_000 ' Convert to actual value if in millions
}
Await context.Countries.AddAsync(country)
' Save in batches for performance
If row Mod 50 = 0 Then
Await context.SaveChangesAsync()
Console.WriteLine($"Imported {row - 1} of {totalRows} countries")
End If
Next
' Save remaining records
Await context.SaveChangesAsync()
Console.WriteLine($"Successfully imported {Await context.Countries.CountAsync()} countries")
End Using
Catch ex As Exception
Console.WriteLine($"Import failed: {ex.Message}")
Throw
End Try
End Function
Comment importer des données d'API dans des feuilles de calcul Excel ?
Combinez IronXL avec des clients HTTP pour alimenter des feuilles de calcul avec des données API en temps réel. Cet exemple utilise RestClient.Net pour récupérer des données de pays.
using System;using System.Collections.Generic;using System.Net.Http;using System.Threading.Tasks;using Newtonsoft.Json;using IronXL;// Define data model matching API responsepublic class RestCountry{ public stringName { get; set; } public longPopulation { get; set; } public stringRegion { get; set; } public stringNumericCode { get; set; } public List<Language> Languages { get; set; }}public class Language{ public stringName { get; set; } public stringNativeName { get; set; }}// Fetch and process API datapublic async TaskImportCountryDataAsync(){ using var httpClient = new HttpClient(); try { // Call REST API var response = await httpClient.GetStringAsync("https://restcountries.com/v3.1/all"); var countries = JsonConvert.DeserializeObject<List<RestCountry>>(response); // Create new workbook var workBook = WorkBook.Create(ExcelFileFormat.XLSX); var workSheet = workBook.CreateWorkSheet("Countries"); // Add headers with styling string[] headers = { "Country", "Population", "Region", "Code", "Language 1", "Language 2", "Language 3" }; for (int col = 0; col < headers.Length; col++) { var headerCell = workSheet[0, col]; headerCell.Value = headers[col]; headerCell.Style.Font.Bold = true; headerCell.Style.SetBackgroundColor("#366092"); headerCell.Style.Font.Color = "#FFFFFF"; } // Import country data awaitProcessCountryData(countries, workSheet); // Save workbook workBook.SaveAs("CountriesFromAPI.xlsx"); } catch (Exception ex) {Console.WriteLine($"API import failed: {ex.Message}"); }}
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;
using IronXL;
// Define data model matching API response
public class RestCountry
{
public string Name { get; set; }
public long Population { get; set; }
public string Region { get; set; }
public string NumericCode { get; set; }
public List<Language> Languages { get; set; }
}
public class Language
{
public string Name { get; set; }
public string NativeName { get; set; }
}
// Fetch and process API data
public async Task ImportCountryDataAsync()
{
using var httpClient = new HttpClient();
try
{
// Call REST API
var response = await httpClient.GetStringAsync("https://restcountries.com/v3.1/all");
var countries = JsonConvert.DeserializeObject<List<RestCountry>>(response);
// Create new workbook
var workBook = WorkBook.Create(ExcelFileFormat.XLSX);
var workSheet = workBook.CreateWorkSheet("Countries");
// Add headers with styling
string[] headers = { "Country", "Population", "Region", "Code", "Language 1", "Language 2", "Language 3" };
for (int col = 0; col < headers.Length; col++)
{
var headerCell = workSheet[0, col];
headerCell.Value = headers[col];
headerCell.Style.Font.Bold = true;
headerCell.Style.SetBackgroundColor("#366092");
headerCell.Style.Font.Color = "#FFFFFF";
}
// Import country data
await ProcessCountryData(countries, workSheet);
// Save workbook
workBook.SaveAs("CountriesFromAPI.xlsx");
}
catch (Exception ex)
{
Console.WriteLine($"API import failed: {ex.Message}");
}
}
ImportsSystemImportsSystem.Collections.GenericImportsSystem.Net.HttpImportsSystem.Threading.TasksImportsNewtonsoft.JsonImportsIronXL' Define data model matching API responsePublic Class RestCountry Public Property NameAsString Public Property PopulationAsLong Public Property RegionAsString Public Property NumericCodeAsString Public Property LanguagesAsList(OfLanguage)End ClassPublic Class Language Public Property NameAsString Public Property NativeNameAsStringEnd Class' Fetch and process API dataPublicAsync Function ImportCountryDataAsync() AsTaskUsing httpClient As New HttpClient()Try ' Call REST API Dim response AsString = Await httpClient.GetStringAsync("https://restcountries.com/v3.1/all") Dim countries AsList(OfRestCountry) = JsonConvert.DeserializeObject(OfList(OfRestCountry))(response) ' Create new workbook Dim workBook AsWorkBook = WorkBook.Create(ExcelFileFormat.XLSX) Dim workSheet AsWorkSheet = workBook.CreateWorkSheet("Countries") ' Add headers with styling Dim headers AsString() = {"Country", "Population", "Region", "Code", "Language 1", "Language 2", "Language 3"} For col AsInteger = 0 To headers.Length - 1 Dim headerCell = workSheet(0, col) headerCell.Value = headers(col) headerCell.Style.Font.Bold = True headerCell.Style.SetBackgroundColor("#366092") headerCell.Style.Font.Color = "#FFFFFF" Next ' Import country dataAwaitProcessCountryData(countries, workSheet) ' Save workbook workBook.SaveAs("CountriesFromAPI.xlsx")Catch ex AsExceptionConsole.WriteLine($"API import failed: {ex.Message}")EndTryEndUsingEnd Function
Imports System
Imports System.Collections.Generic
Imports System.Net.Http
Imports System.Threading.Tasks
Imports Newtonsoft.Json
Imports IronXL
' Define data model matching API response
Public Class RestCountry
Public Property Name As String
Public Property Population As Long
Public Property Region As String
Public Property NumericCode As String
Public Property Languages As List(Of Language)
End Class
Public Class Language
Public Property Name As String
Public Property NativeName As String
End Class
' Fetch and process API data
Public Async Function ImportCountryDataAsync() As Task
Using httpClient As New HttpClient()
Try
' Call REST API
Dim response As String = Await httpClient.GetStringAsync("https://restcountries.com/v3.1/all")
Dim countries As List(Of RestCountry) = JsonConvert.DeserializeObject(Of List(Of RestCountry))(response)
' Create new workbook
Dim workBook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim workSheet As WorkSheet = workBook.CreateWorkSheet("Countries")
' Add headers with styling
Dim headers As String() = {"Country", "Population", "Region", "Code", "Language 1", "Language 2", "Language 3"}
For col As Integer = 0 To headers.Length - 1
Dim headerCell = workSheet(0, col)
headerCell.Value = headers(col)
headerCell.Style.Font.Bold = True
headerCell.Style.SetBackgroundColor("#366092")
headerCell.Style.Font.Color = "#FFFFFF"
Next
' Import country data
Await ProcessCountryData(countries, workSheet)
' Save workbook
workBook.SaveAs("CountriesFromAPI.xlsx")
Catch ex As Exception
Console.WriteLine($"API import failed: {ex.Message}")
End Try
End Using
End Function
L'API renvoie des données JSON au format suivant :
Exemple de réponse JSON de l'API REST Countries affichant des informations hiérarchiques sur les pays.
Traiter et écrire les données de l'API dans Excel :
private async TaskProcessCountryData(List<RestCountry> countries, WorkSheet workSheet){ for (int i = 0; i < countries.Count; i++) { var country = countries[i]; int row = i + 1; // Start from row 1 (after headers) // Write basic country data workSheet[$"A{row}"].Value = country.Name; workSheet[$"B{row}"].Value = country.Population; workSheet[$"C{row}"].Value = country.Region; workSheet[$"D{row}"].Value = country.NumericCode; // Format population with thousands separator workSheet[$"B{row}"].FormatString = "#,##0"; // Add up to 3 languages for (int langIndex = 0; langIndex < Math.Min(3, country.Languages?.Count ?? 0); langIndex++) { var language = country.Languages[langIndex]; string columnLetter = ((char)('E' + langIndex)).ToString(); workSheet[$"{columnLetter}{row}"].Value = language.Name; } // Add conditional formatting for regions if (country.Region == "Europe") { workSheet[$"C{row}"].Style.SetBackgroundColor("#E6F3FF"); } else if (country.Region == "Asia") { workSheet[$"C{row}"].Style.SetBackgroundColor("#FFF2E6"); } // Show progress every 50 countries if (i % 50 == 0) {Console.WriteLine($"Processed {i} of {countries.Count} countries"); } } // Auto-size all columns for (int col = 0; col < 7; col++) { workSheet.AutoSizeColumn(col); }}
private async Task ProcessCountryData(List<RestCountry> countries, WorkSheet workSheet)
{
for (int i = 0; i < countries.Count; i++)
{
var country = countries[i];
int row = i + 1; // Start from row 1 (after headers)
// Write basic country data
workSheet[$"A{row}"].Value = country.Name;
workSheet[$"B{row}"].Value = country.Population;
workSheet[$"C{row}"].Value = country.Region;
workSheet[$"D{row}"].Value = country.NumericCode;
// Format population with thousands separator
workSheet[$"B{row}"].FormatString = "#,##0";
// Add up to 3 languages
for (int langIndex = 0; langIndex < Math.Min(3, country.Languages?.Count ?? 0); langIndex++)
{
var language = country.Languages[langIndex];
string columnLetter = ((char)('E' + langIndex)).ToString();
workSheet[$"{columnLetter}{row}"].Value = language.Name;
}
// Add conditional formatting for regions
if (country.Region == "Europe")
{
workSheet[$"C{row}"].Style.SetBackgroundColor("#E6F3FF");
}
else if (country.Region == "Asia")
{
workSheet[$"C{row}"].Style.SetBackgroundColor("#FFF2E6");
}
// Show progress every 50 countries
if (i % 50 == 0)
{
Console.WriteLine($"Processed {i} of {countries.Count} countries");
}
}
// Auto-size all columns
for (int col = 0; col < 7; col++)
{
workSheet.AutoSizeColumn(col);
}
}
PrivateAsync Function ProcessCountryData(countries AsList(OfRestCountry), workSheet AsWorkSheet) AsTask For i AsInteger = 0 To countries.Count - 1 Dim country = countries(i) Dim row AsInteger = i + 1 ' Start from row 1 (after headers) ' Write basic country data workSheet($"A{row}").Value = country.Name workSheet($"B{row}").Value = country.Population workSheet($"C{row}").Value = country.Region workSheet($"D{row}").Value = country.NumericCode ' Format population with thousands separator workSheet($"B{row}").FormatString = "#,##0" ' Add up to 3 languages For langIndex AsInteger = 0 ToMath.Min(3, If(country.Languages?.Count, 0)) - 1 Dim language = country.Languages(langIndex) Dim columnLetter AsString = ChrW(AscW("E"c) + langIndex).ToString() workSheet($"{columnLetter}{row}").Value = language.Name Next ' Add conditional formatting for regions If country.Region = "Europe" Then workSheet($"C{row}").Style.SetBackgroundColor("#E6F3FF") ElseIf country.Region = "Asia" Then workSheet($"C{row}").Style.SetBackgroundColor("#FFF2E6") End If ' Show progress every 50 countries If i Mod50 = 0 ThenConsole.WriteLine($"Processed {i} of {countries.Count} countries") End If Next ' Auto-size all columns For col AsInteger = 0 To 6 workSheet.AutoSizeColumn(col) NextEnd Function
Private Async Function ProcessCountryData(countries As List(Of RestCountry), workSheet As WorkSheet) As Task
For i As Integer = 0 To countries.Count - 1
Dim country = countries(i)
Dim row As Integer = i + 1 ' Start from row 1 (after headers)
' Write basic country data
workSheet($"A{row}").Value = country.Name
workSheet($"B{row}").Value = country.Population
workSheet($"C{row}").Value = country.Region
workSheet($"D{row}").Value = country.NumericCode
' Format population with thousands separator
workSheet($"B{row}").FormatString = "#,##0"
' Add up to 3 languages
For langIndex As Integer = 0 To Math.Min(3, If(country.Languages?.Count, 0)) - 1
Dim language = country.Languages(langIndex)
Dim columnLetter As String = ChrW(AscW("E"c) + langIndex).ToString()
workSheet($"{columnLetter}{row}").Value = language.Name
Next
' Add conditional formatting for regions
If country.Region = "Europe" Then
workSheet($"C{row}").Style.SetBackgroundColor("#E6F3FF")
ElseIf country.Region = "Asia" Then
workSheet($"C{row}").Style.SetBackgroundColor("#FFF2E6")
End If
' Show progress every 50 countries
If i Mod 50 = 0 Then
Console.WriteLine($"Processed {i} of {countries.Count} countries")
End If
Next
' Auto-size all columns
For col As Integer = 0 To 6
workSheet.AutoSizeColumn(col)
Next
End Function
Pièges courants
Quelques éléments mordent les gens assez souvent pour mériter leur propre section.
Les cellules vides renvoient 0, pas null
Cela m'a pris de court au début. Appeler sheet["A1"].IntValue (ou DecimalValue ou DoubleValue) sur une cellule vide retourne 0, pas null. Si vous faites la somme ou la moyenne d'une colonne avec des trous, les blancs deviennent silencieusement des zéros et faussent le résultat. Je protège désormais les lectures sur toute feuille où les valeurs manquantes sont possibles :
var cell = sheet["B5"];if (!cell.IsEmpty){ total += cell.DecimalValue;}
var cell = sheet["B5"];
if (!cell.IsEmpty)
{
total += cell.DecimalValue;
}
Dim cell = sheet("B5")IfNot cell.IsEmptyThen total += cell.DecimalValueEnd If
Dim cell = sheet("B5")
If Not cell.IsEmpty Then
total += cell.DecimalValue
End If
Cell.IsEmpty est bon marché, donc par défaut je l'utilise chaque fois que la feuille est fournie par l'utilisateur plutôt que générée par la machine.
Les dates reviennent sous forme de numéros de série si vous demandez le mauvais type
Excel enregistre les dates sous forme de numéros de série en interne (45292 signifie 2024-01-01, par exemple). La question la plus fréquente sur la gestion des dates dans notre boîte de réception de support est " pourquoi ma date s'affiche-t-elle comme 45292 ? " La réponse est presque toujours que la cellule a été lue comme StringValue ou IntValue au lieu de DateTimeValue :
// What you probably want:DateTime birthday = sheet["E2"].DateTimeValue;// What gives you "45292":string birthday = sheet["E2"].StringValue;
// What you probably want:
DateTime birthday = sheet["E2"].DateTimeValue;
// What gives you "45292":
string birthday = sheet["E2"].StringValue;
' What you probably want:Dim birthday AsDateTime = sheet("E2").DateTimeValue' What gives you "45292":Dim birthday AsString = sheet("E2").StringValue
' What you probably want:
Dim birthday As DateTime = sheet("E2").DateTimeValue
' What gives you "45292":
Dim birthday As String = sheet("E2").StringValue
Cell.IsDateTime vous indiquera si la cellule a été créée comme une date au départ, ce qui est utile pour les pipelines de validation où le format d'entrée n'est pas garanti.
Les index numériques des cellules commencent à 0, mais les chaînes A1 commencent à 1
Couvert ci-dessus dans le paragraphe de la migration d'Interop, mais mérite d'être répété parce que cela piège même les gens qui n'ont jamais approché COM. sheet[0, 0] est la même cellule que sheet["A1"]. Mélanger les deux styles dans la même boucle est la manière dont les erreurs d'écart de un se glissent. Je choisis une forme par fichier et je m'y tiens ; La forme de chaîne ["A1"] est celle que je privilégie parce qu'elle correspond à ce que vous voyez dans la feuille de calcul elle-même.
Projet d'exemple pour les chiffres de benchmark
Si vous voulez reproduire les chiffres de temps précédents, le banc d'essai est une petite application console .NET 9 :
Imports System
Imports System.Diagnostics
Imports IronXL
License.LicenseKey = Environment.GetEnvironmentVariable("IRONXL_LICENSE_KEY")
Dim sw As Stopwatch = Stopwatch.StartNew()
Dim workbook = WorkBook.Load("GDP.xlsx")
Dim sum As Decimal = workbook.WorkSheets.First()("B2:B214").Sum()
sw.Stop()
Console.WriteLine($"cold: {sw.Elapsed.TotalMilliseconds:F1} ms")
Exécutez-le sous dotnet run -c Release, générez les deux classeurs d'exemple lors du premier lancement, et vous pouvez remplacer vos propres fichiers pour voir comment les chiffres évoluent avec la taille et la complexité du fichier.
Référence et ressources relatives aux objets
La référence API IronXL couvre chaque classe et méthode, y compris celles dont ce didacticiel ne traite pas.
Tutoriels supplémentaires pour les opérations Excel :
IronXL.Excel lit et manipule les fichiers Excel aux formats XLS, XLSX, CSV et TSV. Il fonctionne sans Microsoft Excel ou Interop sur la machine hôte.
Pour la manipulation de feuilles de calcul dans le cloud, vous pouvez également explorer la bibliothèque cliente de l'API Google Sheets for .NET, qui complète les fonctionnalités de fichiers locaux d'IronXL.
Comment puis-je lire des fichiers Excel en C# sans utiliser Microsoft Office ?
Vous pouvez utiliser IronXL pour lire des fichiers Excel en C# sans besoin de Microsoft Office. IronXL fournit des méthodes comme WorkBook.Load() pour ouvrir des fichiers Excel et vous permet d'accéder et de manipuler les données avec une syntaxe intuitive.
Quels formats de fichiers Excel peuvent être lus en C# ?
Avec IronXL, vous pouvez lire les formats de fichiers XLS et XLSX en C#. La bibliothèque détecte automatiquement le format de fichier et le traite en conséquence en utilisant la méthode WorkBook.Load().
Comment valider les données Excel en C# ?
IronXL vous permet de valider les données Excel par programme en C# en parcourant les cellules et en appliquant une logique telle que des expressions régulières pour les e-mails ou des fonctions de validation personnalisées. Vous pouvez générer des rapports en utilisant CreateWorkSheet().
Comment puis-je exporter des données d'Excel vers une base de données SQL en C# ?
Pour exporter des données d'Excel vers SQL, utilisez IronXL avec WorkBook.Load() et GetWorkSheet(), puis parcourez les cellules pour transférer les données via Entity Framework.
Puis-je intégrer la fonctionnalité Excel avec des applications ASP.NET Core ?
Oui, IronXL prend en charge l'intégration avec des applications ASP.NET Core. Vous pouvez utiliser les classes WorkBook et WorkSheet dans vos contrôleurs pour gérer les téléchargements de fichiers Excel, générer des rapports, et plus encore.
Est-il possible d'ajouter des formules aux tableurs Excel en C# ?
IronXL vous permet d'ajouter des formules aux tableurs Excel par programme. Vous pouvez définir une formule avec la propriété Formula, comme cell.Formula = "=SUM(A1:A10)" et calculer les résultats avec workBook.EvaluateAll().
Comment puis-je remplir des fichiers Excel avec des données provenant d'une API REST ?
Pour remplir des fichiers Excel avec des données provenant d'une API REST, utilisez IronXL avec un client HTTP pour récupérer les données de l'API, puis écrivez-les dans Excel à l'aide de méthodes comme sheet['A1'].Value. IronXL gère le formatage et la structure Excel.
Quelles sont les options de licence pour utiliser des bibliothèques Excel dans des environnements de production ?
IronXL propose un essai gratuit à des fins de développement, tandis que les licences de production commencent à partir de 749 $. Ces licences incluent un support technique dédié et permettent le déploiement dans divers environnements sans nécessiter de licences Office supplémentaires.
Is it possible to validate Excel data with IronXL before importing it into a database?
Yes, you can validate spreadsheet data by using IronXL to iterate over the cell values, check for expected formats or values, and log any discrepancies before executing a database import.
Can IronXL be used in both C# and VB.NET projects?
Yes, IronXL can be utilized in both C# and VB.NET projects without any difference in functionality, allowing for smooth Excel file operations across these .NET languages.
Jacob Mellor est directeur de la technologie chez Iron Software et un ingénieur visionnaire pionnier de la technologie C# PDF. En tant que développeur à l'origine de la base de code centrale d'Iron Software, il a façonné l'architecture des produits de l'entreprise depuis sa création, la transformant aux côtés du PDG Cameron Rimington en une entreprise de plus de 50 personnes au service de la NASA, de Tesla et d'agences gouvernementales mondiales.