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

Windows Forms Discussion :

Export DataTable Win Form vers Excel 2003


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 24
    Points : 18
    Points
    18
    Par défaut Export DataTable Win Form vers Excel 2003
    Bonjour,

    je sais, c'est un sujet plus de mille fois abordé, mais je bute alors je sollicite votre aide.

    OBJET : Exporter un datatable d'un winform (windows form) avec ses entêtes de colonnes vers EXCEL.

    Langage : C#
    IDe : VS 2005

    Problème : entre toutes les références , entre les export xml et xls classic , enter les codes pour asp.net et pour les autres projets, je me mélange les "crayons".

    Les références que j'ai essayées :
    - Microsoft.Office.Tools.Excel
    - Microsoft.Office.Core
    - Microsoft.Visualstudio.Tools.Applications.Runtime
    plus
    - using System.Data.oleDb;
    - using System.IO;......

    Pour l'heure je récupère un DataTable (que j'exporte déjà en pdf) et je voudrais le plus simplement du monde l'exporter vers un fichier Excel que je crée pour l'occasion.

    Quelques soit la piste suivie (références...), j'ai buté sur quelque chose.
    J'aime même vu que je ne pouvais faire référence à un index de colonne pour parcourir les colonne d'un DataTable ! C'est étonnant !
    Alors que c'est possible pour les DataSet ou DataRow[].

    Bref, si quelqu'un a une solution en C# toute simple pour, depuis mon appli Windows, créer un fichier Excel et l'alimenter, je serai ravi.


    Merci d'avance
    David

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 24
    Points : 18
    Points
    18
    Par défaut précision sur ma question
    RE bonjour,

    J'ai l'impression qu'avec OleDb on devrait s'en sortir mais je n'aiaps réussi.
    Autrement, j'espère qu'on doit y arriver avec Microsoft.Office.Tools.Excel. sinon à quoi cela sert cette biblio.

    Sur la toile, je trouve pas mal de code avec des "Excel.Application" mais moi impossible de trouver la référence qu'il faut pour cela.

    A +

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 337
    Points : 456
    Points
    456
    Par défaut
    pour utiliser Excel.Application, il faut ajouter la référence Microsoft.Office.Interop.Excel.


    puis dans tes using tu rajoutes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using Excel = Microsoft.Office.Interop.Excel;
    Pour le reste il y a plein de tutos, tu auras juste a boucler sur ta datatable et à remplir les cellules de ton excell, si tu as d'autres problèmes fais moi signe.

    a+

  4. #4
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Il y a une moyen tres simple de faire qui satisfait beaucoup de cas

    Tu cree une perite methode génerique de parcours ta datatable
    Tu sauve le nom des colones et le contenu des cellulles en text tab délimité
    Tu nomme ton fichier machin.xls

    Excell l'ouvrira automatiquement

    ATTENTION : faire tres attention que la premiere colonne ne s'appelle pas "ID" et la renommer le cas échéant

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 24
    Points : 18
    Points
    18
    Par défaut c# DataTable Excel export import
    Bonjour,

    Merci à vous pour vos réponses.

    J'ai une bonne nouvelle, j'ai trouvé des solutions efficaces.

    Avant de les implémenter, il faut ajouter la référence COM : "Microsoft Excel 12.0 Object Library".


    1ère Solution Elle est assez claire et facile
    Source : http://msmvps.com/blogs/deborahk/arc...-to-excel.aspx


    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
     
    In C#:
     
    using Excel = Microsoft.Office.Interop.Excel; 
    using System.Reflection;
     
    Excel.Application oXL; 
    Excel.Workbook oWB; 
    Excel.Worksheet oSheet; 
    Excel.Range oRange; 
     
    // Start Excel and get Application object. 
    oXL = new Excel.Application(); 
     
    // Set some properties 
    oXL.Visible = true; 
    oXL.DisplayAlerts = false; 
     
    // Get a new workbook. 
    oWB = oXL.Workbooks.Add(Missing.Value); 
     
    // Get the active sheet 
    oSheet = (Excel.Worksheet)oWB.ActiveSheet ; 
    oSheet.Name = "Customers"; 
     
    // Process the DataTable 
    // BE SURE TO CHANGE THIS LINE TO USE *YOUR* DATATABLE 
    DataTable dt = Customers.RetrieveAsDataTable(); 
     
    int rowCount = 1; 
    foreach (DataRow dr in dt.Rows) 
    { 
        rowCount += 1; 
        for (int i = 1; i < dt.Columns.Count+1; i++) 
        { 
            // Add the header the first time through 
            if (rowCount==2) 
            { 
                oSheet.Cells[1, i] = dt.Columns[i - 1].ColumnName; 
            } 
            oSheet.Cells[rowCount, i] = dr[i - 1].ToString(); 
        } 
    } 
     
    // Resize the columns 
    oRange = oSheet.get_Range(oSheet.Cells[1, 1], 
                  oSheet.Cells[rowCount, dt.Columns.Count]); 
    oRange.EntireColumn.AutoFit(); 
     
    // Save the sheet and close 
    oSheet = null; 
    oRange = null; 
    oWB.SaveAs("test.xls", Excel.XlFileFormat.xlWorkbookNormal, 
        Missing.Value, Missing.Value, Missing.Value, Missing.Value, 
        Excel.XlSaveAsAccessMode.xlExclusive, 
        Missing.Value, Missing.Value, Missing.Value, 
        Missing.Value, Missing.Value); 
    oWB.Close(Missing.Value, Missing.Value, Missing.Value); 
    oWB = null; 
    oXL.Quit(); 
     
    // Clean up 
    // NOTE: When in release mode, this does the trick 
    GC.WaitForPendingFinalizers(); 
    GC.Collect(); 
    GC.WaitForPendingFinalizers(); 
    GC.Collect();

    2ème Solution Plus courte, épurée, mais j'ai choisi la 1ère.
    Le copier/coller est sale.
    Source : http://www.daniweb.com/forums/thread213015.html

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
                    // Create an Excel object and add workbook...                Excel.ApplicationClass excel = new Excel.ApplicationClass();                Excel.Workbook workbook = excel.Application.Workbooks.Add(true); // true for object template???                 // Add column headings...                int iCol = 0;                foreach (DataColumn c in dt.Columns)                {                    iCol++;                    excel.Cells[1, iCol] = c.ColumnName;                }                // for each row of data...                int iRow = 0;                foreach (DataRow r in dt.Rows)                {                    iRow++;                     // add each row's cell data...                    iCol = 0;                    foreach (DataColumn c in dt.Columns)                    {                        iCol++;                        excel.Cells[iRow + 1, iCol] = r[c.ColumnName];                    }                }                 // Global missing reference for objects we are not defining...                object missing = System.Reflection.Missing.Value;                 // If wanting to Save the workbook...                workbook.SaveAs("MyExcelWorkBook.xls",                    Excel.XlFileFormat.xlXMLSpreadsheet, missing, missing,                    false, false, Excel.XlSaveAsAccessMode.xlNoChange,                    missing, missing, missing, missing, missing);                 // If wanting to make Excel visible and activate the worksheet...                excel.Visible = true;                Excel.Worksheet worksheet = (Excel.Worksheet)excel.ActiveSheet;                ((Excel._Worksheet)worksheet).Activate();                 // If wanting excel to shutdown...                ((Excel._Application)excel).Quit();
    A plus les amis.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 24
    Points : 18
    Points
    18
    Par défaut méthode avec ou sans instanciation de Excel
    RE bonjour,


    en fait ma solution instancie Excel, ce qui est plus lourd que de ne pas l'instancier.

    J'aurai bien utilisé une méthode plus légère mais j'en ai pas trouvée de propre.

    Donc voilà. Mais si vous en avez une sans instancier Excel, j'aimerai bien que vous la notiez dans ce poste.


    Merci et à la prochaine.


    David

  7. #7
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    J'aurai bien utilisé une méthode plus légère mais j'en ai pas trouvée de propre.

    Donc voilà. Mais si vous en avez une sans instancier Excel, j'aimerai bien que vous la notiez dans ce poste.
    Je t'en avais donné une toute simple !

    Mais bon ....
    Je sais par experience que les développeurs considerent que le talent s'exprime dans la complexité de la solution développée et qu'une solution simple n'est pas digne d'etre abordée !

    Pourquoi faire compliqué quand on peut faire encore plus compliqué

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 24
    Points : 18
    Points
    18
    Par défaut pbesoin deplus de précisions
    D'accord Olibara,


    bien,

    mais peux-tu me donner le code ou la ligne pour
    Tu sauve le nom des colones et le contenu des cellulles en text tab délimité
    Tu nomme ton fichier machin.xls
    Merci.
    David

  9. #9
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Par exemple
    (c'est mon jour de bonté)

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
           StreamWriter sw = new StreamWriter(dlgFile.FileName, false, Encoding.Default);
            StringBuilder sb = new StringBuilder("");
     
            for (int i = 0; i < dt.Columns.Count; i++)
            {
              string lbl = dt.Columns[i].Caption;
              if (sb.Length > 0)
              {
                sb.Append("\t");
              }
              else
              {
                // Astuce pour eviter un bug EXCEL si les deux premier char d'un txt sont ID
                if (lbl.StartsWith("ID"))
                {
                  lbl = lbl.Replace("ID", " id");
                }
              }
              sb.Append(lbl);
            }
     
            sw.WriteLine(sb.ToString());
     
            for (int r = 0; r < dt.Rows.Count; r++)
            {
              sb.Length = 0;
              for (int i = 0; i < dt.Columns.Count; i++)
              {
                if (sb.Length > 0)
                {
                  sb.Append("\t");
                }
                string S = dt.Rows[r][i].ToString();
                char []ctrl=new char[] {'\r','\n','\t'};
                int n=S.IndexOfAny(ctrl);
                if (n>-1)
                {
                  char x=S[n];
                  // Un peu brutal mais c'est en amont qu'il faut empecher ce blème !!
                  // Le but ici c'est d'éviter des betise dans le fichier xls exporté
                  string sx = x.ToString();
                  S = S.Replace("\r\n", ";");
                  S = S.Replace("\t", ";");
                  S = S.Replace("\r", ";");
                  S = S.Replace("\n", ";");
                }
                sb.Append(S);
              }
              sw.WriteLine(sb.ToString());
            }
            sw.Close();

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 202
    Points : 101
    Points
    101
    Par défaut
    Citation Envoyé par Teatimerelax Voir le message
    Bonjour,

    Merci à vous pour vos réponses.

    J'ai une bonne nouvelle, j'ai trouvé des solutions efficaces.

    Avant de les implémenter, il faut ajouter la référence COM : "Microsoft Excel 12.0 Object Library".


    1ère Solution Elle est assez claire et facile
    Source : http://msmvps.com/blogs/deborahk/arc...-to-excel.aspx


    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
     
    In C#:
     
    using Excel = Microsoft.Office.Interop.Excel; 
    using System.Reflection;
     
    Excel.Application oXL; 
    Excel.Workbook oWB; 
    Excel.Worksheet oSheet; 
    Excel.Range oRange; 
     
    // Start Excel and get Application object. 
    oXL = new Excel.Application(); 
     
    // Set some properties 
    oXL.Visible = true; 
    oXL.DisplayAlerts = false; 
     
    // Get a new workbook. 
    oWB = oXL.Workbooks.Add(Missing.Value); 
     
    // Get the active sheet 
    oSheet = (Excel.Worksheet)oWB.ActiveSheet ; 
    oSheet.Name = "Customers"; 
     
    // Process the DataTable 
    // BE SURE TO CHANGE THIS LINE TO USE *YOUR* DATATABLE 
    DataTable dt = Customers.RetrieveAsDataTable(); 
     
    int rowCount = 1; 
    foreach (DataRow dr in dt.Rows) 
    { 
        rowCount += 1; 
        for (int i = 1; i < dt.Columns.Count+1; i++) 
        { 
            // Add the header the first time through 
            if (rowCount==2) 
            { 
                oSheet.Cells[1, i] = dt.Columns[i - 1].ColumnName; 
            } 
            oSheet.Cells[rowCount, i] = dr[i - 1].ToString(); 
        } 
    } 
     
    // Resize the columns 
    oRange = oSheet.get_Range(oSheet.Cells[1, 1], 
                  oSheet.Cells[rowCount, dt.Columns.Count]); 
    oRange.EntireColumn.AutoFit(); 
     
    // Save the sheet and close 
    oSheet = null; 
    oRange = null; 
    oWB.SaveAs("test.xls", Excel.XlFileFormat.xlWorkbookNormal, 
        Missing.Value, Missing.Value, Missing.Value, Missing.Value, 
        Excel.XlSaveAsAccessMode.xlExclusive, 
        Missing.Value, Missing.Value, Missing.Value, 
        Missing.Value, Missing.Value); 
    oWB.Close(Missing.Value, Missing.Value, Missing.Value); 
    oWB = null; 
    oXL.Quit(); 
     
    // Clean up 
    // NOTE: When in release mode, this does the trick 
    GC.WaitForPendingFinalizers(); 
    GC.Collect(); 
    GC.WaitForPendingFinalizers(); 
    GC.Collect();

    2ème Solution Plus courte, épurée, mais j'ai choisi la 1ère.
    Le copier/coller est sale.
    Source : http://www.daniweb.com/forums/thread213015.html

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
                    // Create an Excel object and add workbook...                Excel.ApplicationClass excel = new Excel.ApplicationClass();                Excel.Workbook workbook = excel.Application.Workbooks.Add(true); // true for object template???                 // Add column headings...                int iCol = 0;                foreach (DataColumn c in dt.Columns)                {                    iCol++;                    excel.Cells[1, iCol] = c.ColumnName;                }                // for each row of data...                int iRow = 0;                foreach (DataRow r in dt.Rows)                {                    iRow++;                     // add each row's cell data...                    iCol = 0;                    foreach (DataColumn c in dt.Columns)                    {                        iCol++;                        excel.Cells[iRow + 1, iCol] = r[c.ColumnName];                    }                }                 // Global missing reference for objects we are not defining...                object missing = System.Reflection.Missing.Value;                 // If wanting to Save the workbook...                workbook.SaveAs("MyExcelWorkBook.xls",                    Excel.XlFileFormat.xlXMLSpreadsheet, missing, missing,                    false, false, Excel.XlSaveAsAccessMode.xlNoChange,                    missing, missing, missing, missing, missing);                 // If wanting to make Excel visible and activate the worksheet...                excel.Visible = true;                Excel.Worksheet worksheet = (Excel.Worksheet)excel.ActiveSheet;                ((Excel._Worksheet)worksheet).Activate();                 // If wanting excel to shutdown...                ((Excel._Application)excel).Quit();
    A plus les amis.
    J'ai utilisé cette première solution également mais j'ai ceci en erreur :

    L'exception RuntimeBinderException n'a pas été gérée
    'Object' ne contient pas de définition pour get_Range
    ça parle quelqu'un ?

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

Discussions similaires

  1. Exporter des données de forms vers excel
    Par stephane1973 dans le forum Forms
    Réponses: 5
    Dernier message: 15/10/2008, 04h26
  2. asp.net export vers excel 2003
    Par splach dans le forum ASP
    Réponses: 2
    Dernier message: 19/03/2008, 12h27
  3. [Export] De Access vers Excel (2003)
    Par matfeb dans le forum VBA Access
    Réponses: 6
    Dernier message: 03/03/2008, 15h07
  4. SOucis d'export vers excel 2003
    Par nico18987 dans le forum SharePoint
    Réponses: 0
    Dernier message: 05/09/2007, 09h45
  5. Problem avec l'export vers excel 2003
    Par nico18987 dans le forum SharePoint
    Réponses: 4
    Dernier message: 26/04/2007, 16h57

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