Créer Excel en C# sans Microsoft Office : la magie sous le capot

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : pourquoi "sans Office" et qu'y a-t-il à l'intérieur ?

\n\n

Si vous avez déjà cherché comment générer un fichier Excel en C#, vous êtes probablement tombé sur la célèbre question sur Stack Overflow avec des dizaines de milliers de vues. Et la principale difficulté est la phrase "without installing Microsoft Office". Pourquoi ? Parce que traîner des objets COM, dépendre de la version d'Excel sur le serveur et attraper des erreurs comme "Retrieving the COM class factory for component... failed" est un chemin vers l'enfer pour un développeur.

\n\n

Mais comment créer des fichiers .XLSX et .XLS alors ? La réponse réside dans la structure même du format. Excel moderne (depuis 2007) est en fait une simple archive ZIP contenant des fichiers XML à l'intérieur. Oui, vous avez bien entendu : prenez n'importe quel .xlsx, renommez-le en .zip, ouvrez-le — et vous verrez des dossiers xl, _rels, docProps et une multitude de documents XML. Chaque feuille, chaque cellule, chaque style est un XML soigneusement structuré. L'ancien format .XLS est un format binaire (BIFF), mais il existe aussi des solutions open-source pour celui-ci.

\n\n

Dans cet article, nous allons regarder sous le capot de ce processus : analyser les bibliothèques populaires, écrire du code concret et comprendre ce qui se passe réellement lorsque nous appelons Save(). C'est parti !

\n\n

1. Les trois piliers C# pour travailler avec Excel sans Office

\n\n

Aujourd'hui, il y a trois principaux candidats qui résolvent le problème "prêts à l'emploi". Chacun d'eux travaille directement avec le format, sans passer par Office installé.

\n\n

1.1. EPPlus (licence LGPL / Propriétaire)

\n

La bibliothèque la plus populaire pour .NET. Initialement gratuite, elle est passée à une licence payante pour un usage commercial à partir de la version 5.0. Cependant, pour des fins éducatives et des petits projets, elle peut encore être utilisée (la version 4.5.3.3 est la dernière gratuite). EPPlus fonctionne uniquement avec .XLSX.

\n\n

Comment ça fonctionne sous le capot : EPPlus utilise System.IO.Packaging (cette fameuse archive ZIP) et génère des fichiers XML conformément à la spécification Office Open XML (OOXML). Il peut créer des styles, des formules, des graphiques — tout ce que vous voyez dans Excel.

\n\n

1.2. ClosedXML

\n

Gratuite, open-source (licence MIT). Fonctionne également uniquement avec .XLSX. Elle se distingue par une API très conviviale qui rappelle le travail avec Excel lui-même : vous travaillez avec Workbook, Worksheet, Cell. Sous le capot — le même Open XML, mais ClosedXML prend en charge toute la routine de création de la structure XML.

\n\n

1.3. NPOI

\n

Port de la célèbre bibliothèque Java Apache POI. Le principal avantage est qu'elle peut fonctionner à la fois avec .XLSX (via XSSFWorkbook) et avec l'ancien .XLS (via HSSFWorkbook). Gratuite, open-source (Apache 2.0). Idéale si vous avez besoin de prendre en charge les formats legacy.

\n\n

Sous le capot pour .XLS : NPOI écrit directement les données binaires au format BIFF8. C'est plus complexe que le XML, mais cela ne nécessite pas de compression.

\n\n

2. Écrivons du code : créons un fichier Excel de trois manières

\n\n

Créons un rapport simple avec des en-têtes et des données. Voici des exemples pour chaque bibliothèque.

\n\n

2.1. Exemple avec ClosedXML (le plus simple)

\n\n
using ClosedXML.Excel;\n\n// Créer un classeur\nusing (var workbook = new XLWorkbook())\n{\n    // Ajouter une feuille\n    var worksheet = workbook.Worksheets.Add("Rapport");\n\n    // En-têtes\n    worksheet.Cell(1, 1).Value = "Nom";\n    worksheet.Cell(1, 2).Value = "Âge";\n    worksheet.Cell(1, 3).Value = "Ville";\n\n    // Données\n    worksheet.Cell(2, 1).Value = "Anna";\n    worksheet.Cell(2, 2).Value = 28;\n    worksheet.Cell(2, 3).Value = "Moscou";\n\n    worksheet.Cell(3, 1).Value = "Ivan";\n    worksheet.Cell(3, 2).Value = 35;\n    worksheet.Cell(3, 3).Value = "Saint-Pétersbourg";\n\n    // Style pour les en-têtes\n    var headerRange = worksheet.Range("A1:C1");\n    headerRange.Style.Font.Bold = true;\n    headerRange.Style.Fill.BackgroundColor = XLColor.LightGray;\n\n    // Ajustement automatique de la largeur des colonnes\n    worksheet.Columns().AdjustToC                

Blogs

Book Recommendations