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 :

Creation d'un fichier Excel à partir d'une ListView


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 125
    Par défaut Creation d'un fichier Excel à partir d'une ListView
    Bonjour,

    Dans le cadre d'un portage VB 6 vers C#, je cherche une solution rapide pour exporter une ListView (la ObjectListView CF ici) vers Excel:

    La liste peut-être assez impossante (5 à 6000 lignes et env. 20 Col)
    et l'affichage du fichier doit-être le plus rapide possible (la version VB fait ça en environ 2 secondes).

    La solution VB est la suivante:
    -créer un fichier CSV
    -l'ouvrir avec Excel (en mode non visible)
    -demander à Excel d'enregistrer en xls
    -faire un peut de formatage
    -Afficher Excel

    J'ai passé 2 jours tenter ça en C#, mais j'ai fini par abandonner: l'Automation étant trop mal documenté, impossible de trouver les parametres qu'il faut pour ouvrir le CSV comme il faut dans Excel.

    Je me suis donc tourné vers OleDb pour tout créer from Scratch direct en XLS, mais là (en dehors du fait que je sois obligé de parcourir mes objets un par un puisque c'est une ListView), autre problème: j'ai des simples quotes qui apparaissent dans mes champs texte...

    J'avoue que je commence à désespérer..

    QUESTION:
    -Quelqu'un aurait-il une solution élégante pour faire ça ?




    Merci d'avance pour toute aide / idée / proposition... !

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Par défaut
    passe par les composants COM de office.

    Microsoft.Office.Interop.Excel;

    tu créé un EXCEL et le remplit en 20lignes de codes

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 125
    Par défaut
    C'était effecivement ma première idée, mais j'avais peur que ce soit long s'il y a beaucoup de données..

    Par ailleurs, comme c'est en environement pro, j'essaie de ne pas installer d'autre DLL que celles des postes et j'avais donc effectivement tenté de travailler avec les composants COM "Microsoft Excel 11.0 Object Library". Mais j'avoue qu'après pas mal de tests, passer son temps à chercher quel "object" va pour quel paramètre, et toujours avoir des messages d'erreur abscons, j'ai fini par abandonner...
    Est-ce tu connais un tuto qui donne des exemples qui marchent avec cette version des composants COM ?

    Sinon, je vois aussi que dans les References .Net, j'ai les entrées "Microsoft.Office.Interop.Excel" version 11.0 et 12.0
    Quelles différences avec les composants COM ? Est-ce que c'est utilisable "facilement" sur des postes sans Visual Studio ?

    Merci d'avance

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Par défaut
    Vite fait:

    Tu importe juste la v12 et c'est partie

    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Microsoft.Office.Interop.Excel;
     
    using Excel = Microsoft.Office.Interop.Excel;
     
    namespace test
    {
        public class ToExcel
        {
     
     
            public ToExcel()
            {
                Excel.Application ObjExcel = new Microsoft.Office.Interop.Excel.Application();
     
                string model = @"C:\template.xls";
                string pathDestination = @"C:\target.xls";
     
                Excel.Workbook ObjWorkBookTemp = ObjExcel.Workbooks.Open(model, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
                Excel.Worksheet wh1 = (Excel.Worksheet)ObjWorkBookTemp.Sheets[1];
     
                //wh1.get_Range("A" + 1, Type.Missing).Value2 = string.Format("COUCOU");
     
                ObjWorkBookTemp.SaveAs(pathDestination, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
     
                ObjWorkBookTemp.Close(false, Type.Missing, Type.Missing);
            }
     
     
        }
    }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 125
    Par défaut
    Merci de prendre de ton temps ash.ice.loky, tout seul, je commençait à perdre patience...

    J'ai testé ce que tu proposes et je retombe sur une erreur (que je commence à voir un peu trop souvent):
    Ancien format ou bibliothèque de types non valide. (Exception de HRESULT : 0x80028018 (TYPE_E_INVDATAREAD))
    au moment de l'open(..)
    Je précise que j'ai créé un fichier excel "template.xls" vide pour le test...
    (Mon Excel étant celui d'office 2003).

    Any suggestion ?

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 493

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 125
    Par défaut
    Bonjour,

    J'ai effectivement fini par me rabattre sur la solution OleDB; il me semble que c'est un peu plus long (pas encore testé sur d'énormes Tables pour autant...), mais ça a l'avantage de marcher !!
    Je fais, pour l'instant, mes requètes "à la main" (avec un zoli StringBuilder ) du coup, j'ai encore des problèmes pour ajouter des dates reconnues par Excel...
    Mais à la vue de ta source bacelar, je vais remplacer ça par des InsertCommand.Parameters.Add, ya peut-être moyen que ca accélère les choses (et surtout que ce soit plus clean pour les insert !!).

    Je laisse le thread ouvert jusqu'à ce que mes insert marchent completement, mais j'espère que ça ne soit qu'une formalité maintenant !
    J'en profiterais pour faire un retour sur les perf...

    Merci beaucoup pour votre aide !

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 125
    Par défaut
    Bonjour,

    Dernier retour avant de fermer le thread:
    - Je commence par créer le fichier avec OleDb
    J'ai fini par réussir à faire mes insert de tous types: j'utilise des requetes avec parametres "INSERT .... VALUES (?, ?...)" complétés par des OleDbParameter que je type à chaque fois et ça marche nickel, plus de problème de date qui n'est pas reconnue par un excel d'un autre langue ou autre...

    La seconde partie de mon traitement consiste à ouvrir le fichier ainsi créé puis modifier le fichier gràce à Excel en Interop (activer les autoFilter, mettre les headers en gras, etc..)
    J'avoue que je suis toujours incapable d'expliquer pourquoi ça marche dans mon soft ( j'ai fais un POC pour tester, mais dans le POC, avec EXACTEMENT le meme code ça marche pas !! J'imagine que c'est un problème de reference, mais je ne trouve pas ce qui cloche..).
    J'ai vérifié et essayé de changer chacune des references, mais rien n'y fait.

    Bref, les INSET, avec OleDb, les modifs, avec Interop... et des prières !

    - Si quelqu'un a le meme style de probleme, je suis joignable par MP..
    - Si quelqu'un connait un système qui permette de manipuler des fichiers Excel (de toutes les versions), sans utiliser COM et qui marche tout le temps, je suis aussi joignable par MP !!!

    Merci encore pour votre aide

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/01/2009, 22h37
  2. création fichier Excel à partir d'une application WPF
    Par modafine dans le forum Windows Presentation Foundation
    Réponses: 8
    Dernier message: 01/08/2008, 08h53
  3. Ouverture de fichier Excel à partir d'une page en PHP
    Par leclone dans le forum Langage
    Réponses: 15
    Dernier message: 03/01/2007, 18h00
  4. Réponses: 1
    Dernier message: 23/09/2006, 14h12
  5. Réponses: 4
    Dernier message: 02/05/2005, 20h25

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