IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Recherche librairire pour éditer un fichier excel sans excel


Sujet :

C#

  1. #1
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut Recherche librairire pour éditer un fichier excel sans excel
    Bonjour,

    Je recherche une librairie à utiliser en C# (autre que OpenXML) pour ouvrir un document excel et insérer du texte dans des emplacement définit à l'avance.

    J'ai une structure qui contient par exemple :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    <configs>
       <config name = "Toto">
          <valeur>
             <col>1</col>
             <row>3</row>
             <texte>Bla Bla</texte>
          </valeur>
          <valeur>
             <col>1</col>
             <row>4</row>
             <texte>Bla Bla Bla</texte>
          </valeur>
       </config>
       <config name = "Tata">
          <valeur>
             <col>4</col>
             <row>5</row>
             <texte>Bla Bla</texte>
          </valeur>
          <valeur>
             <col>4</col>
             <row>6</row>
             <texte>Bla Bla Bla</texte>
          </valeur>
          <valeur>
             <col>4</col>
             <row>7</row>
             <texte>Bla Bla Bla</texte>
          </valeur>
       </config>
    </configs>

    L'attribut "name" dans chaque config correspondra au nom d'une feuille dans le classeur (qui est normalement déjà sensé exister)
    Pour chaque valeur "Col" et "Row" forme la cellule dans laquelle je dois placer la valeur contenue dans "Texte" au sein de la feuille.

    Pourriez-vous me conseiller une librairie (de préférence simple à utiliser, en tout cas plus simple que OpenXML) sachant que j'ai le droit d'utiliser une librairie à partir du moment où elle sont libre ou sous l'une de ces licences :
    Licence Apache
    Licences BSD et New BSD
    Licence CDDL (Common Development and Distribution Licence) 1.0
    Licence CPOL (Code Project Open License)
    Licence Ms-PL (Microsoft Public Licence)
    Licence Microsoft Patterns & Practices
    Licence MIT
    Mozilla Public License 1.1
    Licence W3C
    Domaine Public

  2. #2
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    J'en ai utilisé 2 :
    - NPOI : API pas top (ne colle pas à celle de l'interop, pas de GetCell natif (mais créer une méthode d'extension est facile)...) mais sinon rien à dire, licence Apache je crois
    - EPPLUS : reprend l'API de l'interop mais performances dégueulasses si plus d'une colonne ! (constaté en octobre de l'année dernière donc ça a pu changer)
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  3. #3
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    EPPlus est justement la librairie que mon prédécesseur a utilisé et que je dois remplacer car elle est sous licence GPL.
    Je vais jeter un œil à NPOI.

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    J'ai essayé d'adapter une exemple de lecture trouvé sur le site de NPOI pour tenter d'écrire.
    filename fait référence à un fichier qui existe dans un répertoire où j'ai les droits de lire et d'écrire. Ce classeur n'est pas protégé.
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    using (FileStream stream =  File.OpenWrite(filename))
                {
                    try
                    {
                        IWorkbook workbook = WorkbookFactory.Create(stream);
     
                        ISheet sheet = workbook.GetSheet("Test");
                        IRow row = worksheet.GetRow(1);
                        ICell cell = row.GetCell(1);
                        cell.SetCellValue("popo");
                    }
                    catch (Exception e)
                    {
                        MessageBox.Show(e.Message);
                    }
     
     
                }

    Je plante sur la ligne utilisant le WorkbookFactory avec le message "Stream does not support reading."
    J'ai également essayé ceci, mais je n'ai même pas de texte dans la boite de message.
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    using (FileStream stream = new FileStream(filename,FileMode.Open, FileAccess.ReadWrite))
    Idem en utilisant WorkBookFactory avec le filename directement.

  5. #5
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Et avec using (FileStream stream = File.Open(filename, FileMode.Open)) ?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  6. #6
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Effectivement, si je ne précise pas le ModeAccess, ça ne plante pas. Malheureusement ça n'enregistre pas les changements non plus. à moins que j'ai fait une boulette quelque part.

    J'ai créer une nouvelle méthode toute simple pout être certain qu'il n'y a pas quelque chose qui interfère
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public void ExportDataWithNPOI2(String connexionString, String filename)
            {
                using (FileStream stream = new FileStream(filename, FileMode.Open))
                {
                    try
                    {
                        IWorkbook workbook = WorkbookFactory.Create(stream);
                        ISheet worksheet = GetNPoiSheet(workbook, "Info_Juri");
     
                        IRow workrow = GetNPoiRow(worksheet, 1);
                        ICell cell = GetNPoiCell(workrow, 1);
     
                        cell.SetCellValue("Bla bla");
     
                        workbook.Write(stream);
                    }
                    catch (Exception e)
                    {
                        MessageBox.Show(e.Message);
                    }
                }
            }

    Le détail des GetNPoiXXX
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    private ISheet GetNPoiSheet(IWorkbook workbook, String name)
            {
                ISheet internalSheet = workbook.GetSheet(name);
                if (internalSheet == null)
                    internalSheet = workbook.CreateSheet(name);
     
                return internalSheet;
            }
     
            private IRow GetNPoiRow(ISheet worksheet, int row)
            {
                IRow internalRaw = worksheet.GetRow(row);
                if (internalRaw == null)
                    internalRaw = worksheet.CreateRow(row);
     
                return internalRaw;
            }
     
            private ICell GetNPoiCell(IRow row, int column)
            {
                ICell internalCell = row.GetCell(column);
                if (internalCell == null)
                    internalCell = row.CreateCell(column);
     
                return internalCell;
            }

  7. #7
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Tu peux jeter un œil sur ClosedXML http://closedxml.codeplex.com/

    et sur EPPLUS http://epplus.codeplex.com/

    Ce sont des projets de logiciels libres


    Oupss ! Je n'avais pas tout lu, et j'ai manqué la réponse au sujet de EPPLUS.

    J'en ai profité pour vérifier celle de ClosedXML : c'est celle du MIT

    ClosedXML a besoin de la dll DocumentFormatOpenXML pour fonctionner

    Je ne suis pas allé plus loin que cela, mais j'ai fait une recherche sur NuGet, si jamais, cela t'intéresse

    http://www.nuget.org/packages?q=excel+xml
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  8. #8
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Pragmateek, je viens de remplacer la Factory par l'utilisation direct d'un objet XSSFWorkbook et géré moi-même les streams
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.ReadWrite);
    IWorkbook workbook = new XSSFWorkbook(stream);
    stream.Close();
     
    ISheet worksheet = workbook.GetSheet("Info_Juri");
    IRow row = worksheet.GetRow(0);
    ICell cell = row.GetCell(0);
    cell.SetCellValue("TOTO");
     
     
    stream = new FileStream(filename, FileMode.OpenOrCreate);
    workbook.Write(stream);
    stream.Close();

    ça ne plante plus et mes modifications sont enregistrés puisque la date du document change. Malheureusement, le fichier XLSX est illisible selon Excel.
    ça fonctionne si j'ouvre un fichier XLS et que j'enregistre un XLS en utilisant HSSFWorkbook.

    clementmarcotte, je viens d'essayer ClosedXml et ça à l'air de tourner correctement.
    Merci à tous les deux.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Générer un fichier word ou excel en php
    Par Taz_8626 dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 10/05/2011, 09h57
  2. Lire une fichier XLS sans excel
    Par petitcoucou31 dans le forum API, COM et SDKs
    Réponses: 10
    Dernier message: 06/10/2008, 15h03
  3. [E-03] Lire un fichier XML d'Excel sans Excel
    Par mioux dans le forum Excel
    Réponses: 2
    Dernier message: 02/01/2008, 13h35
  4. [Débutant] Java pour éditer un fichier XML
    Par Endy dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 09/06/2006, 13h15
  5. [VBA-E] Macro pour convertir un fichier texte en excel
    Par Nicolas67 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 15/05/2006, 14h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo