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





create file (25)


Quelques automatisations Excel utiles en C #, vous pouvez trouver à partir du lien suivant.

http://csharp.net-informations.com/excel/csharp-excel-tutorial.htm

boulonner.

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?




Vous pouvez utiliser OLEDB pour créer et manipuler des fichiers Excel. Cochez ceci: Lecture et écriture Excel en utilisant 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 autres liens:







Le moyen le plus simple et le plus rapide de créer un fichier Excel à partir de C # est d'utiliser l'outil de productivité Open XML. L'outil de productivité Open XML est livré avec l'installation Open XML SDK. L'outil reverse engineering n'importe quel fichier Excel en code C #. Le code C # peut ensuite être utilisé pour générer de nouveau ce fichier.

Un aperçu du processus impliqué est:

  1. Installez le SDK Open XML avec l'outil.
  2. Créez un fichier Excel en utilisant le dernier client Excel avec le look désiré. Nommez-le DesiredLook.xlsx .
  3. Avec l'outil ouvrir DesiredLook.xlsx et cliquez sur le bouton Reflect Code près du haut.
  4. Le code C # de votre fichier sera généré dans le volet droit de l'outil. Ajoutez ceci à votre solution C # et générez des fichiers avec l'apparence souhaitée.

En prime, cette méthode fonctionne pour tous les fichiers Word et PowerPoint. En tant que développeur C #, vous allez ensuite apporter des modifications au code pour l'adapter à vos besoins.

J'ai développé une application WPF simple sur github qui fonctionnera sous Windows à cette fin. Il existe une classe d'espace réservé appelée GeneratedClass laquelle vous pouvez coller le code généré. Si vous revenez en arrière une version du fichier, il va générer un fichier Excel comme ceci:




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)




public class GridViewExportUtil
{
    public static void Export(string fileName, GridView gv)
    {
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.AddHeader(
            "content-disposition", string.Format("attachment; filename={0}", fileName));
        HttpContext.Current.Response.ContentType = "application/ms-excel";

        using (StringWriter sw = new StringWriter())
        {
            using (HtmlTextWriter htw = new HtmlTextWriter(sw))
            {
                //  Create a form to contain the grid
                Table table = new Table();

                //  add the header row to the table
                if (gv.HeaderRow != null)
                {
                    GridViewExportUtil.PrepareControlForExport(gv.HeaderRow);
                    table.Rows.Add(gv.HeaderRow);
                }

                //  add each of the data rows to the table
                foreach (GridViewRow row in gv.Rows)
                {
                    GridViewExportUtil.PrepareControlForExport(row);
                    table.Rows.Add(row);
                }

                //  add the footer row to the table
                if (gv.FooterRow != null)
                {
                    GridViewExportUtil.PrepareControlForExport(gv.FooterRow);
                    table.Rows.Add(gv.FooterRow);
                }

                //  render the table into the htmlwriter
                table.RenderControl(htw);

                //  render the htmlwriter into the response
                HttpContext.Current.Response.Write(sw.ToString());
                HttpContext.Current.Response.End();
            }
        }
    }

    /// <summary>
    /// Replace any of the contained controls with literals
    /// </summary>
    /// <param name="control"></param>
    private static void PrepareControlForExport(Control control)
    {
        for (int i = 0; i < control.Controls.Count; i++)
        {
            Control current = control.Controls[i];
            if (current is LinkButton)
            {
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as LinkButton).Text));
            }
            else if (current is ImageButton)
            {
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as ImageButton).AlternateText));
            }
            else if (current is HyperLink)
            {
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as HyperLink).Text));
            }
            else if (current is DropDownList)
            {
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as DropDownList).SelectedItem.Text));
            }
            else if (current is CheckBox)
            {
                control.Controls.Remove(current);
                control.Controls.AddAt(i, new LiteralControl((current as CheckBox).Checked ? "True" : "False"));
            }

            if (current.HasControls())
            {
                GridViewExportUtil.PrepareControlForExport(current);
            }
        }
    }
}

Salut cette solution est d'exporter votre vue de la grille à votre fichier Excel, il pourrait vous aider







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




IKVM + POI

Ou, vous pouvez utiliser l'Interop ...




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 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.




Vous pouvez utiliser une bibliothèque appelée ExcelLibrary. C'est une bibliothèque gratuite et open source publiée sur Google Code:

ExcelLibrary

Cela ressemble à un port de PHP ExcelWriter que vous avez mentionné ci-dessus. Il n'écrira pas encore le nouveau format .xlsx, mais ils travaillent sur l'ajout de cette fonctionnalité.

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

ExcelLibrary ne semble toujours fonctionner que pour le format Excel (fichiers .xls) plus ancien, mais pourrait ajouter du 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. En tout, EPPlus semble être le meilleur choix au fil du temps. Il semble être plus activement mis à jour et documenté aussi bien.

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

Voici quelques liens pour une référence rapide:
ExcelLibrary - GNU Lesser GPL
EPPlus - Licence Publique Générale EPPlus GNU (LGPL)

Voici un exemple de code pour ExcelLibrary:

Voici un exemple prenant des données d'une base de données et en créant un classeur. Notez que le code ExcelLibrary 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);

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




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.




Syncfusion Essential XlsIO peut le faire. Il n'a aucune dépendance sur Microsoft Office et dispose également d'un support spécifique pour différentes plates-formes.

Échantillon de code:

//Creates a new instance for ExcelEngine.
ExcelEngine excelEngine = new ExcelEngine();
//Loads or open an existing workbook through Open method of IWorkbooks
IWorkbook workbook = excelEngine.Excel.Workbooks.Open(fileName);
//To-Do some manipulation|
//To-Do some manipulation
//Set the version of the workbook.
workbook.Version = ExcelVersion.Excel2013;
//Save the workbook in file system as xlsx format
workbook.SaveAs(outputFileName);

La suite complète de contrôles est disponible gratuitement via le programme de licence communautaire si vous êtes admissible (moins de 1 million USD de revenus). Note: Je travaille pour Syncfusion.




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.




Voici un moyen de le faire avec LINQ to XML, avec un exemple de code:

Importez et exportez rapidement des données Excel avec LINQ to XML

C'est un peu complexe, car vous devez importer des espaces de noms et ainsi de suite, mais cela vous permet d'éviter les dépendances externes.

(Aussi, bien sûr, c'est VB .NET, pas C #, mais vous pouvez toujours isoler le contenu VB .NET dans son propre projet pour utiliser XML Literals, et faire tout le reste en C #.)




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.




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:




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};
    }
}



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.




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.







Quelques options que j'ai utilisées:

Si XLSX est un must: ExcelPackage est un bon début mais est mort lorsque le développeur a cessé de travailler dessus. ExML a repris à partir de là et ajouté quelques fonctionnalités. ExML n'est pas une mauvaise option, je l'utilise encore dans quelques sites de production.

Cependant, pour tous mes nouveaux projets, j'utilise NPOI , le port .NET d' Apache POI . NPOI 2.0 (Alpha) prend également en charge XLSX.




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.




Le problème le plus important en ce qui concerne les numéros de version de C # est le fait qu’elle n’est pas liée à une version du .NET Framework, ce qui semble être dû aux versions synchronisées entre Visual Studio et le .NET Framework.

La version de C # est en fait liée au compilateur, pas au framework. Par exemple, dans Visual Studio 2008, vous pouvez écrire C # 3.0 et la cible .NET Framework 2.0, 3.0 et 3.5. La nomenclature C # 3.0 décrit la version de la syntaxe du code et des fonctionnalités prises en charge de la même manière que ANSI C89, C90, C99 décrit la syntaxe / les fonctionnalités du code C.

Examinez Mono et vous verrez que Mono 2.0 (la plupart du temps implémentée de la version 2.0 du .NET Framework à partir des spécifications ECMA) prend en charge la syntaxe et les fonctionnalités de C # 3.0.





c# .net excel file-io