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

WinDev Discussion :

EPPlus, comment utiliser cet assemblage .NET pour manipuler des fichiers Excel ? [WD18]


Sujet :

WinDev

  1. #1
    Candidat au Club
    Homme Profil pro
    Responsable produit
    Inscrit en
    mars 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Responsable produit

    Informations forums :
    Inscription : mars 2016
    Messages : 5
    Points : 4
    Points
    4
    Par défaut EPPlus, comment utiliser cet assemblage .NET pour manipuler des fichiers Excel ?
    Bonjour,

    Avant de vous exposer mon problème, je précise que je ne souhaite pas une solution de contournement (pilotage d'Excel, autre assemblage .NET, etc...).


    J'ai tenté, en vain, d'utiliser l'assemblage .NET EPPlus dans un projet WinDev. (http://epplus.codeplex.com/)
    Cet assemblage permet de manipuler (modifier, créer) des fichiers Excel au format OpenXML.

    J'ai essayé de reproduire cet exemple C# en WLangage :



    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    FileInfo newFile = new FileInfo(outputDir.FullName + @"\sample1.xlsx");
    if (newFile.Exists)
    {
    newFile.Delete(); // ensures we create a new workbook
    newFile = new FileInfo(outputDir.FullName + @"\sample1.xlsx");
    }
    using (ExcelPackage package = new ExcelPackage(newFile))
    {
    // add a new worksheet to the empty workbook
    ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Inventory");
    //Add the headers
    worksheet.Cells[1, 1].Value = "ID";
    worksheet.Cells[1, 2].Value = "Product";
    worksheet.Cells[1, 3].Value = "Quantity";
    worksheet.Cells[1, 4].Value = "Price";
    worksheet.Cells[1, 5].Value = "Value";
     
    //Add some items...
    worksheet.Cells["A2"].Value = 12001;
    worksheet.Cells["B2"].Value = "Nails";
    worksheet.Cells["C2"].Value = 37;
    worksheet.Cells["D2"].Value = 3.99;
     
    worksheet.Cells["A3"].Value = 12002;
    worksheet.Cells["B3"].Value = "Hammer";
    worksheet.Cells["C3"].Value = 5;
    worksheet.Cells["D3"].Value = 12.10;
     
    worksheet.Cells["A4"].Value = 12003;
    worksheet.Cells["B4"].Value = "Saw";
    worksheet.Cells["C4"].Value = 12;
    worksheet.Cells["D4"].Value = 15.37;
     
    //Create an autofilter for the range
    worksheet.Cells["A1:E4"].AutoFilter = true;
     
    worksheet.Cells.AutoFitColumns(0); //Autofit columns for all cells
     
    // Change the sheet view to show it in page layout mode
    worksheet.View.PageLayoutView = true;
     
    // save our new workbook and we are done!
    package.Save();
     
    }



    J'ai donc fait ceci dans WinDev :

    Code : 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    LOCAL
    clFichier est un FileInfo ("c:\epplus_test.xlsx")
    clXlsPack est un ExcelPackage(clFichier)
    pclXlsFeuille est un ExcelWorksheet dynamique
     
     
    pclXlsFeuille = clXlsPack.Workbook.Worksheets.Add("Inventory")
     
    //Add the headers
    pclXlsFeuille.Cells[1, 1].Value = "ID"
    pclXlsFeuille.Cells[1, 2].Value = "Product"
    pclXlsFeuille.Cells[1, 3].Value = "Quantity"
    pclXlsFeuille.Cells[1, 4].Value = "Price"
    pclXlsFeuille.Cells[1, 5].Value = "Value"
     
    //Add some items...
    pclXlsFeuille.Cells["A2"].Value = 12001
    pclXlsFeuille.Cells["B2"].Value = "Nails"
    pclXlsFeuille.Cells["C2"].Value = 37
    pclXlsFeuille.Cells["D2"].Value = 3.99
     
    pclXlsFeuille.Cells["A3"].Value = 12002
    pclXlsFeuille.Cells["B3"].Value = "Hammer"
    pclXlsFeuille.Cells["C3"].Value = 5
    pclXlsFeuille.Cells["D3"].Value = 12.10
     
    pclXlsFeuille.Cells["A4"].Value = 12003
    pclXlsFeuille.Cells["B4"].Value = "Saw"
    pclXlsFeuille.Cells["C4"].Value = 12
    pclXlsFeuille.Cells["D4"].Value = 15.37
     
    //Create an autofilter for the range
    pclXlsFeuille.Cells["A1:E4"].AutoFilter = Vrai
    pclXlsFeuille.Cells.AutoFitColumns(0) //Autofit columns for all cells
     
    // Change the sheet view to show it in page layout mode
    pclXlsFeuille.View.PageLayoutView = Vrai
     
    // save our new workbook and we are done!
    clXlsPack.Save()

    Le problème c'est que j'ai l'erreur de compilation suivante sur chaque ligne où j'affecte une valeur au membre Cells de pclXlsFeuille :
    Erreur :Le membre 'Cells' de la classe 'ExcelWorksheet' est constant : il n'est donc accessible qu'en lecture hors des méthodes de la classe 'ExcelWorksheet'.


    Aurais-je commis une erreur ?
    Est-ce que quelqu'un aurait une solution, s'il vous plaît ?

    Merci.

  2. #2
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    juin 2003
    Messages
    4 664
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2003
    Messages : 4 664
    Points : 8 065
    Points
    8 065
    Par défaut
    Essaye en remplaçant tes points par des double-chevrons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pclXlsFeuille>>Cells[1, 1]>>Value = "ID"
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  3. #3
    Candidat au Club
    Homme Profil pro
    Responsable produit
    Inscrit en
    mars 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Responsable produit

    Informations forums :
    Inscription : mars 2016
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par frenchsting Voir le message
    Essaye en remplaçant tes points par des double-chevrons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pclXlsFeuille>>Cells[1, 1]>>Value = "ID"
    Merci.
    C'est une bonne idée.
    Malheureusement cela ne fonctionne pas : Erreur :Opérateur '>>' interdit.

    Je pense que les doubles chevrons s'utilisent uniquement avec des objets de type automation, OLE ou ActiveX.

  4. #4
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    décembre 2008
    Messages
    3 329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2008
    Messages : 3 329
    Points : 8 034
    Points
    8 034
    Par défaut
    hello,
    pour écrire des valeurs dans des cellules, tu peux utiliser la méthode setValue comme ceci par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // écriture de la chaîne "ID" dans la cellule A1 du classeur
    pclXlsFeuille.setValue("A1", "ID")
    // ou 
    // pclXlsFeuille.setValue(1,1, "ID")
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  5. #5
    Candidat au Club
    Homme Profil pro
    Responsable produit
    Inscrit en
    mars 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Responsable produit

    Informations forums :
    Inscription : mars 2016
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    hello,
    pour écrire des valeurs dans des cellules, tu peux utiliser la méthode setValue comme ceci par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // écriture de la chaîne "ID" dans la cellule A1 du classeur
    pclXlsFeuille.setValue("A1", "ID")
    // ou 
    // pclXlsFeuille.setValue(1,1, "ID")
    Ami calmant, J.P

    Merci ça fonctionne parfaitement

    Mais il me reste une erreur que je n'ai pas réussi à résoudre sur la fonction qui permet d'appliquer un filtre sur les cellules de ma première ligne (A1, B1, C1 et D1).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //Create an autofilter for the range
    pclXlsFeuille.Cells["A1:D1"].AutoFilter = Vrai
    Si tu as une idée je suis preneur.

  6. #6
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    décembre 2008
    Messages
    3 329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2008
    Messages : 3 329
    Points : 8 034
    Points
    8 034
    Par défaut
    hello,
    finalement j'ai trouvé un équivalent qui fonctionne à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pclXlsFeuille.Cells["A1"].Value = "ID"
    c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pclXlsFeuille.Cells.get_Item("A1").Value = "ID"
    donc tu peux faire pour l'autofiltre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pclXlsFeuille.Cells.get_Item("A1:D1").AutoFilter = Vrai
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  7. #7
    Candidat au Club
    Homme Profil pro
    Responsable produit
    Inscrit en
    mars 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Responsable produit

    Informations forums :
    Inscription : mars 2016
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Well done J.P !
    Ça fonctionne au poil.
    Avec ça je devrais réussir à exploiter correctement cet assemblage dans WinDev.

    Pour la petite histoire j'étais parti au départ pour utiliser une autre bibliothèque qui s'appelle SpreadSheetLight (http://spreadsheetlight.com/), que j'avais parfaitement réussi à faire fonctionner.
    Malheureusement je me suis rendu compte qu'elle ne permettait pas (encore) de générer des tableaux croisés dynamiques.
    Je me suis donc rabattu sur EPPlus qui, apparemment, le permet.
    EPPlus semble avoir une communauté plus étendue d'utilisateurs, ce qui est toujours un plus.

    Merci pour vos réponses.
    Et surtout merci à toi J.P.

  8. #8
    Membre actif
    Inscrit en
    octobre 2013
    Messages
    274
    Détails du profil
    Informations forums :
    Inscription : octobre 2013
    Messages : 274
    Points : 248
    Points
    248
    Par défaut
    bonjour

    quelles sont les avantages et inconvénients par rapport à la classe cexcel (d'origine ou remaniée comme beaucoup l'ont fait). ?

  9. #9
    Candidat au Club
    Homme Profil pro
    Responsable produit
    Inscrit en
    mars 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Responsable produit

    Informations forums :
    Inscription : mars 2016
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par fffttt Voir le message
    bonjour

    quelles sont les avantages et inconvénients par rapport à la classe cexcel (d'origine ou remaniée comme beaucoup l'ont fait). ?

    La classe cExcel est une classe qui pilote Excel, c'est à dire que Excel doit être installé sur le poste où se trouve le programme.
    Les assemblages .NET, comme EPPlus ou SpreadSheetLight, utilisent les bibliothèques du SDK OpenXML de Microsoft qui permettent de manipuler (créer, modifier...) des fichiers au format OpenXML (*.xlsx pour Excel) et donc de ne pas avoir à installer excel sur les postes qui utilisent le programme. Très pratique pour des applications installés sur des serveurs (services windows) ou les sites web (en WebDev) par exemple.

  10. #10
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2004
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2004
    Messages : 2 267
    Points : 3 728
    Points
    3 728
    Par défaut
    Très intéressant. Merci.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : septembre 2019
    Messages : 11
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par f.riche Voir le message
    Well done J.P !
    Ça fonctionne au poil.
    Avec ça je devrais réussir à exploiter correctement cet assemblage dans WinDev.

    Pour la petite histoire j'étais parti au départ pour utiliser une autre bibliothèque qui s'appelle SpreadSheetLight (http://spreadsheetlight.com/), que j'avais parfaitement réussi à faire fonctionner.
    Malheureusement je me suis rendu compte qu'elle ne permettait pas (encore) de générer des tableaux croisés dynamiques.
    Je me suis donc rabattu sur EPPlus qui, apparemment, le permet.
    EPPlus semble avoir une communauté plus étendue d'utilisateurs, ce qui est toujours un plus.

    Merci pour vos réponses.
    Et surtout merci à toi J.P.
    Bonjour,

    Désolé de dépoussiérer le sujet, mais je cherche à faire fonctionner la bibliothèque SpreadSheetLight dans Webdev 28, sans succès.
    Je bloque à l'ouverture du fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    FichierSource, FichierDestination est une chaîne
     
    FichierSource = fRepWeb() + "\excel\Classeur1.xlsx"
    FichierDestination = fRepWeb() + "\excel\Classeur_modifie.xlsx"
     
    clFichier est un SLDocument(FichierSource)
    La dernière ligne me donne une erreur :
    System.Reflection.TargetInvocationException: Une exception a été levée par la cible d'un appel. ---> System.IO.FileNotFoundException: Impossible de charger le fichier ou l'assembly 'DocumentFormat.OpenXml, Version=2.11.3.0, Culture=neutral, PublicKeyToken=8fb06cb64d019a17' ou une de ses dépendances. Le fichier spécifié est introuvable.
    à SpreadsheetLight.SLDocument.OpenExistingSpreadsheet(String SheetNameOnOpen)
    à SpreadsheetLight.SLDocument..ctor(String SpreadsheetFileName)

    Peux-tu me donner un exemple de code, à minima pour ouvrir un fichier xlsx existant ?
    Merci d'avance.

    Christian.

  12. #12
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    juin 2003
    Messages
    4 664
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2003
    Messages : 4 664
    Points : 8 065
    Points
    8 065
    Par défaut
    Bonjour,

    Je ne vais pas répondre à ta demande car je ne connais pas (assez) WebDev et pas du tout spreadSheetLight. Plusieurs points :
    - Tu aurais dû faire un nouveau sujet (et mettre celui-ci en lien). Il est tagué "résolu" et les utilisateurs du forum pensent que tu as la solution.
    - C'est une demande WebDev. Il y a une partie du forum qui y est consacrée.
    - Tu utilises WebDev 28. As-tu contacté le ST ?
    - Tu utilises WebDev 28. Il est toujours délicat d'utiliser la version qui vient de sortir car il y a souvent des soucis tant que les correctifs n'ont pas été mis en place.

    Pour ton souci proprement dit, il y a sûrement un endroit où tu dois copier la dll spreadSheetLight pour qu'elle soit prise en compte par le serveur.
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  13. #13
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : septembre 2019
    Messages : 11
    Points : 10
    Points
    10
    Par défaut
    Merci pour ton retour.

    Finalement, j'utilise la même bibliothèque que notre ami @f.riche, et ça a l'air de fonctionner, même si j'ai une erreur à l'ouverture de l'excel, erreur générée par une une formule de validation d'une liste.
    Pour les autres listes, ça fonctionne, et je n'en demande pas plus.
    Promis, j'ouvrirai un nouveau sujet à la bonne place si jamais je ne m'en sort pas.

    Christian.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/12/2021, 17h13
  2. Réponses: 4
    Dernier message: 15/04/2016, 12h06
  3. Réponses: 2
    Dernier message: 14/05/2006, 19h36

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