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



Answers

Si vous êtes satisfait du format xlsx, essayez mon projet GitHub codéplex . EPPlus . Commencé avec la source de ExcelPackage, mais aujourd'hui c'est une réécriture totale. Prend en charge les gammes, le style de cellule, les graphiques, les formes, les images, les noms de domaine, l'autofiltre et bien d'autres choses.

Question

Comment puis-je créer une feuille de calcul Excel avec C # sans nécessiter l'installation d'Excel sur la machine qui exécute le code?




Je veux juste ajouter une autre référence à une solution tierce qui traite directement votre problème: http://www.officewriter.com

(Disclaimer: je travaille pour SoftArtisans, la société qui fabrique OfficeWriter)




Une option extrêmement légère peut être d'utiliser des tables HTML. Il suffit de créer des balises de tête, de corps et de table dans un fichier et de les enregistrer en tant que fichier avec une extension .xls. Il existe des attributs spécifiques à Microsoft que vous pouvez utiliser pour styliser la sortie, y compris les formules.

Je me rends compte que vous ne pouvez pas coder cela dans une application web, mais voici un example de la composition d'un fichier Excel via une table HTML. Cette technique peut être utilisée si vous codez une application de console, une application de bureau ou un service.




J'ai récemment utilisé FlexCel.NET et FlexCel.NET trouvé que c'était une excellente bibliothèque! Je ne dis pas cela sur trop de produits logiciels. Il est inutile de donner ici l'argumentaire de vente, vous pouvez lire toutes les fonctionnalités sur leur site Web.

C'est un produit commercial, mais vous obtenez la source complète si vous l'achetez. Donc je suppose que vous pourriez le compiler dans votre assemblée si vous le vouliez vraiment. Sinon, c'est juste un assemblage supplémentaire pour xcopy - pas de configuration ou d'installation ou quelque chose comme ça.

Je ne pense pas que vous trouveriez un moyen de le faire sans les bibliothèques tierces car le framework .NET, évidemment, n'a pas de support intégré et OLE Automation est juste un monde de douleur.




Avez-vous déjà essayé sylk?

Nous avions l'habitude de générer des excelsheets dans asp classique comme sylk et en ce moment nous cherchons aussi un excelgenerater.

Les avantages pour sylk sont, vous pouvez mettre en forme les cellules.




La solution commerciale, SpreadsheetGear for .NET, le fera.

Vous pouvez voir des exemples ASP.NET (C # et VB) en direct here et télécharger une version d'évaluation here .

Disclaimer: Je possède SpreadsheetGear LLC




Vous pouvez créer des fichiers Excel bien formatés en utilisant cette bibliothèque: http://officehelper.codeplex.com/documentation
Voir ci-dessous l'échantillon:

using (ExcelHelper helper = new ExcelHelper(TEMPLATE_FILE_NAME, GENERATED_FILE_NAME))
{
    helper.Direction = ExcelHelper.DirectionType.TOP_TO_DOWN;
    helper.CurrentSheetName = "Sheet1";
    helper.CurrentPosition = new CellRef("C3");

    //the template xlsx should contains the named range "header"; use the command "insert"/"name".
    helper.InsertRange("header");

    //the template xlsx should contains the named range "sample1";
    //inside this range you should have cells with these values:
    //<name> , <value> and <comment>, which will be replaced by the values from the getSample()
    CellRangeTemplate sample1 = helper.CreateCellRangeTemplate("sample1", new List<string> {"name", "value", "comment"}); 
    helper.InsertRange(sample1, getSample());

    //you could use here other named ranges to insert new cells and call InsertRange as many times you want, 
    //it will be copied one after another;
    //even you can change direction or the current cell/sheet before you insert

    //typically you put all your "template ranges" (the names) on the same sheet and then you just delete it
    helper.DeleteSheet("Sheet3");
}        

où l'échantillon ressemble à ceci:

private IEnumerable<List<object>> getSample()
{
    var random = new Random();

    for (int loop = 0; loop < 3000; loop++)
    {
        yield return new List<object> {"test", DateTime.Now.AddDays(random.NextDouble()*100 - 50), loop};
    }
}






Vous pouvez jeter un oeil à http://www.gemboxsoftware.com/GBSpreadsheetFree.htm .

Ils ont une version gratuite avec toutes les fonctionnalités, mais limitée à 150 lignes par feuille et 5 feuilles par classeur, si cela répond à vos besoins.

Je n'ai pas encore eu besoin de l'utiliser, mais j'ai l'air intéressant.




OpenXML est également une bonne alternative qui permet d'éviter l'installation de MS Excel sur le serveur. Le SDK 2.0 Open XML fourni par Microsoft simplifie la manipulation des packages Open XML et des éléments de schéma Open XML sous-jacents dans un package. L'interface API (Open XML Application Programming Interface) encapsule de nombreuses tâches courantes que les développeurs effectuent sur les packages Open XML.

Check this out OpenXML: alternative qui évite d'installer MS Excel sur le serveur




Vous voudrez peut-être vérifier les classes d'interopérabilité . Vous ne dites pas OLE (ce qui n'est pas le cas), mais les classes interop sont très faciles à utiliser.

Vous pourriez être impressionné si vous ne les avez pas essayés.

S'il vous plaît soyez averti de la stance de Microsoft à ce sujet:

Microsoft ne recommande pas et ne prend actuellement pas en charge l'automatisation des applications Microsoft Office à partir d'une application ou d'un composant client non assisté et non interactif (notamment ASP, ASP.NET, DCOM et NT Services), car Office peut présenter un comportement instable et / ou blocage lorsque Office est exécuté dans cet environnement.




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

Quelques avantages:

  • Ne nécessite pas Office installé
  • Fait par Microsoft = documentation MSDN décent
  • Juste un. Net dll à utiliser dans le projet
  • SDK est livré avec de nombreux outils comme diff, validateur, etc

Liens:




Certains fournisseurs de composants tiers tels que Infragistics ou Syncfusion fournissent de très bonnes fonctionnalités d'exportation Excel qui ne nécessitent pas l'installation de Microsoft Excel.

Étant donné que ces fournisseurs fournissent également des composants de grille d'interface utilisateur avancés, ces composants sont particulièrement utiles si vous souhaitez que le style et la présentation d'une exportation Excel imitent l'état actuel d'une grille dans l'interface utilisateur de votre application.

Si votre exportation est destinée à être exécutée côté serveur en mettant l'accent sur les données à exporter et sans lien vers l'interface utilisateur, alors je voudrais aller à l'une des options open source libres (par exemple ExcelLibrary).

J'ai déjà été impliqué dans des projets qui tentaient d'utiliser l'automatisation côté serveur sur la suite Microsoft Office. Basé sur cette expérience, je recommanderais fortement contre cette approche.




Les diverses bibliothèques XML Office 2003 disponibles fonctionnent plutôt bien pour les fichiers Excel plus petits. Cependant, je trouve que la taille d'un grand classeur enregistré au format XML est un problème. Par exemple, un classeur avec lequel je travaillerais équivaudrait à 40 Mo dans le nouveau format XLSX (et il est vrai que le format XLSX est plus serré) devient un fichier XML de 360 ​​Mo.

En ce qui concerne mes recherches, il y a deux paquets commerciaux qui permettent la sortie vers les anciens formats de fichiers binaires. Elles sont:

Ni sont bon marché (500USD et 800USD respectivement, je pense). mais les deux fonctionnent indépendamment d'Excel lui-même.

Ce que je serais curieux de savoir est le module de sortie Excel pour les goûts d'OpenOffice.org. Je me demande s'ils peuvent être portés de Java vers .Net.




Voici une bibliothèque C # entièrement gratuite, qui vous permet d'exporter depuis un DataSet , DataTable ou List<> dans un fichier .xlsx Excel 2007 authentique, en utilisant les bibliothèques OpenXML:

http://mikesknowledgebase.com/pages/CSharp/ExportToExcel.htm

Le code source complet est fourni - gratuitement - avec des instructions et une application de démonstration.

Après avoir ajouté cette classe à votre application, vous pouvez exporter votre DataSet vers Excel en une seule ligne de code:

CreateExcelFile.CreateExcelDocument(myDataSet, "C:\\Sample.xlsx");

Ça ne devient pas plus simple que ça ...

Et cela n'exige même pas qu'Excel soit présent sur votre serveur.




Links