2124 votes

Créer un fichier Excel (.XLS et .XLSX) à partir de C#

Comment créer une feuille de calcul Excel avec C# ?

Idéalement, j'aimerais avoir une source ouverte pour ne pas avoir à ajouter de dépendances tierces à mon code, et j'aimerais éviter d'utiliser Excel directement pour créer le fichier (en utilisant l'automatisation OLE).

La solution du fichier .CSV est facile et c'est la façon dont je gère actuellement cette question, mais je voudrais contrôler les formats de sortie.


EDIT : Je suis toujours en train de les examiner pour voir quelle est la meilleure alternative pour ma solution. Interop fonctionnera, mais il faut qu'Excel soit sur la machine que vous utilisez. La méthode OLEDB est également intrigante, mais elle n'apportera pas grand chose de plus que ce que je peux faire avec des fichiers CSV. Je vais me pencher davantage sur le format xml 2003, mais cela implique également une exigence > Excel 2003 pour le fichier.

Je suis actuellement à la recherche d'un portage de l'outil Excel Writer de PEAR (bibliothèque PHP) qui permettra d'obtenir des données et un formatage XLS de qualité, et ce dans le format compatible Excel_97 que toutes les versions modernes d'Excel supportent. Le PEAR Excel Writer est ici : PEAR - Rédacteur Excel

64 votes

@Mike L'élément "sans nécessiter l'installation d'Excel" n'a rien à voir avec le fait d'être professionnel. C'est une question de dépendances. Le texte original de la question était formulé comme suit : "Idéalement, je voudrais une source ouverte pour ne pas avoir à ajouter de dépendances tierces à mon code, et je voudrais éviter d'utiliser Excel directement pour créer le fichier (en utilisant OLE Automation.)" C'est dommage que la question ait été simplifiée de façon drastique.

8 votes

En supposant que vous essayiez de faire quelque chose sans bibliothèque ou code externe, je ne peux pas parler pour les fichiers xls, mais pour les fichiers xlsx, pourquoi ne pas commencer par prendre un fichier existant, le renommer en fichier zip et explorer son contenu ? Un peu de rétro-ingénierie vous en apprendra beaucoup. Il y a plusieurs fichiers xml et fichiers rels différents dans les divers dossiers et sous-dossiers. Essayez de les explorer et voyez si vous pouvez les reproduire ou si vous pouvez trouver de la documentation sur les différents espaces de noms/schémas xml.

1167voto

Mike Webb Points 3654

Vous pouvez utiliser une bibliothèque appelée ExcelLibrary. Il s'agit d'une bibliothèque gratuite et open source publiée sur Google Code :

Bibliothèque Excel

Cela semble être un portage de l'ExcelWriter PHP que vous avez mentionné ci-dessus. Il n'écrit pas encore au nouveau format .xlsx, mais ils travaillent à l'ajout de cette fonctionnalité.

Il est très simple, petit et facile à utiliser. De plus, il possède un DataSetHelper qui vous permet d'utiliser des DataSets et des DataTables pour travailler facilement avec des données Excel.

ExcelLibrary semble encore ne fonctionner que pour l'ancien format Excel (fichiers .xls), mais il est possible qu'elle ajoute à l'avenir un support pour les nouveaux formats 2007/2010.

Vous pouvez également utiliser EPPlus qui ne fonctionne que pour les fichiers au format Excel 2007/2010 (fichiers .xlsx).

Il y a quelques bogues connus avec chaque bibliothèque, comme indiqué dans les commentaires. Dans l'ensemble, EPPlus semble être le meilleur choix au fil du temps. Elle semble être plus activement mise à jour et documentée.

En outre, comme l'a noté @АртёмЦарионов ci-dessous, EPPlus a un support pour les tableaux croisés dynamiques et ExcelLibrary peut avoir un certain support ( Problème de tableau croisé dynamique dans ExcelLibrary )

Voici quelques liens pour une référence rapide :
Bibliothèque Excel - GNU Lesser GPL
EPPlus - Licence publique générale de bibliothèque GNU (LGPL)

Voici quelques exemples de code pour ExcelLibrary :

Voici un exemple qui prend des données d'une base de données et crée un classeur à partir de celles-ci. Notez que le code de la bibliothèque Excel est la seule ligne en bas :

//Create the data set and table
DataSet ds = new DataSet("New_DataSet");
DataTable dt = new DataTable("New_DataTable");

//Set the locale for each
ds.Locale = System.Threading.Thread.CurrentThread.CurrentCulture;
dt.Locale = System.Threading.Thread.CurrentThread.CurrentCulture;

//Open a DB connection (in this example with OleDB)
OleDbConnection con = new OleDbConnection(dbConnectionString);
con.Open();

//Create a query and fill the data table with the data from the DB
string sql = "SELECT Whatever FROM MyDBTable;";
OleDbCommand cmd = new OleDbCommand(sql, con);
OleDbDataAdapter adptr = new OleDbDataAdapter();

adptr.SelectCommand = cmd;
adptr.Fill(dt);
con.Close();

//Add the table to the data set
ds.Tables.Add(dt);

//Here's the easy part. Create the Excel worksheet from the data set
ExcelLibrary.DataSetHelper.CreateWorkbook("MyExcelFile.xls", ds);

La création du fichier Excel est aussi simple que cela. Vous pouvez également créer manuellement des fichiers Excel, mais c'est la fonctionnalité ci-dessus qui m'a vraiment impressionné.

267 votes

ExcelLibrary a été remplacée par l'exceptionnelle EPPlus - epplus.codeplex.com . Jan le met à jour régulièrement. Je l'ai utilisé et c'est l'un des meilleurs projets open source avec lequel nous avons travaillé.

3 votes

Il convient de noter qu'ExcelLibrary a beaucoup de problèmes de performance lorsqu'il s'agit de grands ensembles de données (plus de 5000 lignes avec beaucoup de colonnes). Je suis en train de faire une modification lourde de la base de code au travail afin que nous puissions l'utiliser dans un projet.

0 votes

EPPlus semble beaucoup moins bogué qu'ExcelLibrary, MAIS il est GPL et donc seulement une solution pour les projets open source.

643voto

Jan Källman Points 201

Si le format xlsx vous convient, essayez mon projet codeplex. EPPlus . Je l'ai commencé avec la source d'ExcelPackage, mais aujourd'hui c'est une réécriture totale. Supporte les plages, le style des cellules, les graphiques, les formes, les images, les plages de noms, le filtre automatique et beaucoup d'autres choses.

82 votes

La licence est maintenant LGPL, notes de version ici : epplus.codeplex.com/releases/view/79802

17 votes

Les exemples étaient utiles. J'ai pu modifier mon code en passant de la bibliothèque interop de Microsoft (horriblement lente) à cette bibliothèque (version 4.x) en quelques heures. Mon point de référence écrit un fichier avec deux onglets et environ 750 000 cellules. En utilisant MS interop, cela a pris 13 minutes. Avec EPPlus, il a fallu 10 secondes, soit une accélération d'environ 80x. Je suis très content !

0 votes

@JanKällman Vous devriez mettre à jour votre page CodePlex pour montrer que vous disposez de ces méthodes : LoadFromCollection<T> , LoadFromDataTable etc. (trouvé via aquí )

218voto

Pellared Points 578

Et qu'en est-il de l'utilisation d'Open XML SDK 2.0 pour Microsoft Office ?

Quelques avantages :

  • Il n'est pas nécessaire d'installer Office
  • Fabriqué par Microsoft = documentation MSDN décente
  • Une seule dll .Net à utiliser dans le projet
  • Le SDK est livré avec de nombreux outils tels que diff, validateur, etc.

Liens :

5 votes

Il est important de noter que la DLL correspondante fait un peu plus de 5 Mo et est limitée aux formats Office 2007. Mais c'est certainement la solution la plus simple et la plus rapide qui fonctionne pour moi.

19 votes

Je vous informe que la version 2.5 est disponible et peut être téléchargée. aquí .

14 votes

Le SDK modélise le XML en classes, de sorte que chaque balise XML est mise en correspondance avec une balise, et vous devez ensuite construire correctement la hiérarchie des classes (chaque instance possède une collection d'instances/balises enfants). Cela signifie que vous devez connaître la structure XML d'un fichier Excel, ce qui est très compliqué. Il est beaucoup plus facile d'utiliser un wrapper tel que EPPlus, mentionné ci-dessus, qui simplifie les choses.

178voto

Leniel Macaferi Points 38324

J'ai utilisé avec succès les projets open source suivants :

  • ExcelPackage pour les formats OOXML (Office 2007)

  • NPOI pour le format .XLS (Office 2003). NPOI 2.0 (Alpha) prend également en charge XLSX.

Jetez un coup d'œil aux articles de mon blog :

Création de feuilles de calcul Excel .XLS et .XLSX en C#

NPOI avec tableau Excel et graphique dynamique

7 votes

Une note sur le NPOI - Les références de ligne et de colonne sont basées sur zéro. Cela fonctionne bien pour alimenter un modèle existant.

117voto

Panos Points 11429

Vous pouvez utiliser OLEDB pour créer et manipuler des fichiers Excel. Vérifiez cela : Lecture et écriture d'Excel à l'aide d'OLEDB .

Exemple typique :

using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\temp\\test.xls;Extended Properties='Excel 8.0;HDR=Yes'"))
{
  conn.Open();
  OleDbCommand cmd = new OleDbCommand("CREATE TABLE [Sheet1] ([Column1] string, [Column2] string)", conn);
  cmd.ExecuteNonQuery();
}

EDIT - Quelques liens supplémentaires :

4 votes

Quelqu'un peut-il confirmer si cela fonctionne en x64 ? Je suis presque sûr que Jet ne fonctionne que si votre application est compilée ou exécutée en mode 32 bits.

2 votes

Je viens de tester cette connexion et elle a échoué sur un Windows Server 2008 R2 x64 RC, il semble que l'on doive installer le pilote système Office 2007 : Data Connectivity Components [ microsoft.com/downloads/

27 votes

Soyez très prudent avec cette fonction -- c'est un gros et vilain gadget (par exemple, il lui arrive de deviner le type de colonne et de rejeter toutes les données qui ne correspondent pas).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X