none
Création fichier Excel + dataBase RRS feed

  • Question

  • Bonjour,

     

    Voici donc un code:

    private void toolStripButton5_Click(object sender, EventArgs e)

    {

    dataBase mydatabase = new dataBase("localhost", "theproject", "root");

    int dateDayMySQL = DateTime.Now.Day;

    string sDay = dateDayMySQL.ToString();

    int dateMonthMySQL = DateTime.Now.Month;

    string sMonth = dateMonthMySQL.ToString();

    int dateYearMySQL = DateTime.Now.Year;

    string sYear = dateYearMySQL.ToString();

    bool connectionDeleteStatus = mydatabase.SelectRecette("SELECT xdb_recette.name," +

    " GROUP_CONCAT(xdb_element.name SEPARATOR ', '), ROUND(SUM(qt*xdb_element.price) / sum(qt)*2,1)/2" +

    " FROM xdb_recetteComposant" +

    " LEFT JOIN xdb_element ON xdb_element.id = xdb_recetteComposant.element" +

    " LEFT JOIN xdb_recette ON xdb_recette.id = xdb_recetteComposant.recette" +

    " GROUP BY recette");

    //Création du fichier excel - ou lecture si existant !

    Microsoft.Office.Interop.Excel.ApplicationClass oExcelApp = new Microsoft.Office.Interop.Excel.ApplicationClass();

    FileStream writer = File.Create(@"" + sDay + "-" + sMonth + "-" + sYear + "-Recettes detaillées.xls");

    }

     

     

    L'objectif ici est de récupéré les valeurs de la requête SQL (a l'aide d'une boucle fort, pour avoir toutes les recettes de la table), et de bien les classer dans un fichier xls.

     

    Mais il me semble que a partir de ici:FileStream writer = File.Create(@"" + sDay + "-" + sMonth + "-" + sYear + "-Recettes detaillées.xls");

     

    je commence à manquer de logique :]

     

    Mes soucis sont:

    - Ce code est surement faux car je ne dis pas ou l'enregistrer, je voudrais que sa enregistre dans le répertoir d'installation.

     

    - Je Ne récupère pas toutes les recettes

     

    - Je ne remplis pas la fiche excel.

     

    - Il serait aussi préférable que ce dernier code "repère" les recettes modifié, modifies les lignes concernées, et ajout celle qui n'existe pas dans le fichier.

     

    Je n'ai cependant aucune idée de comment réaliser tout ça. :/

     

    Meilleures salutations !

     

    lundi 9 juin 2008 08:13

Toutes les réponses

  • Bonjour,

     

    Excel est un format particulier, vous ne pouvez donc pas le créer comme un fichier texte brute (à moins que vous connaissez par coeur comment est formé un fichier Excel).

     

    Vous avez 4 choix pour enregistrer au format excel :

    • Considérer le fichier excel comme une base de données :
    • Piloter excel (cela nécessite d'avoir Excel installé sur le poste).
    • Générer du xml au format Excel 2007.
    • Passer par une bibliothèque tiers

    Cordialement

    lundi 9 juin 2008 08:27
    Modérateur
  • Bonjour,

     

    Le client à excel sur son ordi.

     

     

    lundi 9 juin 2008 08:36
  • Bonjour mogwaisharp,

     

    Comme le dit Gilles, il existe plusieurs méthode pour réaliser ceci. L'une d'elle est l'utilisation d'un fichier xml. IL y a plusieurs avantages à procéder de cette manière :

     

    - Le framework dispose de nombreuses méthodes pour traiter les informations au format Xml

    - Combiner à un fichier XSL vous pourrez facilement mettre en forme vos données vers Excel

    - Excel possède la méthode OpenXML

     

    Pour ce faire vous pouvez procéder de la manière suivante :

     

    Code Snippet

    //Récupération des donnnées et chargement du DataSet

    SqlConnection myConnection = new SqlConnection(connectionString);

    SqlCommand myCommand = new SqlCommand(cmdString, myConnection);

    SqlDataAdapter myDataAdapter = new SqlDataAdapter(myCommand);

    DataSet ds = new DataSet();

    myDataAdapter.Fill(ds);

     

    //Nous créons un fichier xml à partir de notre dataset avec la méthode WriteXml

    System.IO.FileStream myFileStream = new System.IO.FileStream("C:\\contact.xml", System.IO.FileMode.Create);

    System.Xml.XmlTextWriter xtw = new System.Xml.XmlTextWriter(myFileStream, System.Text.Encoding.Unicode);

    xtw.WriteProcessingInstruction("xml", "version='1.0'");

    ds.WriteXml(xtw);

    xtw.Close();

     

    //Nous pouvons utiliser la méthode OpenXML pour ouvrir notre fichier Xml dans Excel

    Microsoft.Office.Interop.Excel.Application myExcel = new Microsoft.Office.Interop.Excel.Application();

    myExcel.Workbooks._OpenXML("C:\\contact.xml",Missing.Value);

    myExcel.Visible = true;

     

     

    Pour alléger le code je n'ai volontairement pas mis de test ...

     

    La méthode _OpenXML permet de recevoir le chemin d'un fichier xsl (à la place de Missing.Value)

     

    J'espère que cela vous aidera.

     

    Amicalement,

     

     

     

    lundi 9 juin 2008 10:28
  • Salut,

     

    Il me dit pour tout les Sql (command, dataAdaptater) qu'il n'existe pas, et si je fais MySQL... la même chose, alors que j'utilise MySQLDriversCS

     

     

    Est-ce qu'il me faut inclure le driver MySQL officiel?

     

    mardi 10 juin 2008 07:09
  •  

    Bonjour Mogwaisharp,

     

    Pour vous connecter à MySQL, je vous invite à lire :

     

    http://morpheus.developpez.com/mysqldotnet/

     

    Pour le reste assurez-vous de bien faire référence aux dll souhaitées et d'utiliser le using correspondant.

     

    Amicalement,

     

     

     

     

    mardi 10 juin 2008 07:24
  • Bonjour,

     

    J'ai deja la connection d'établi avec:

    dataBase mydatabase = new dataBase("localhost", "theproject", "root");

     qui est relié à dataBase.cs

     

    et mes requetes SQL (ici celle qui doit être executé)

    bool connectionDeleteStatus = mydatabase.SelectRecette("SELECT xdb_recette.name," +

    " GROUP_CONCAT(xdb_element.name SEPARATOR ', '), ROUND(SUM(qt*xdb_element.price) / sum(qt)*2,1)/2" +

    " FROM xdb_recetteComposant" +

    " LEFT JOIN xdb_element ON xdb_element.id = xdb_recetteComposant.element" +

    " LEFT JOIN xdb_recette ON xdb_recette.id = xdb_recetteComposant.recette" +

    " GROUP BY recette");

     

     

    fonctionne dans les autres cas de figure.

    mardi 10 juin 2008 07:38
  • En fait il faut que tu reprennes le code de Mathieu après le fill et que tu rajoutes une référence à ta table. Ca devrait donner à la louche un truc dans ce genre:

     

     

     

    Code Snippet

    private void toolStripButton5_Click(object sender, EventArgs e)

    {

    dataBase mydatabase = new dataBase("localhost", "theproject", "root");

    int dateDayMySQL = DateTime.Now.Day;

    string sDay = dateDayMySQL.ToString();

    int dateMonthMySQL = DateTime.Now.Month;

    string sMonth = dateMonthMySQL.ToString();

    int dateYearMySQL = DateTime.Now.Year;

    string sYear = dateYearMySQL.ToString();

    bool connectionDeleteStatus = mydatabase.SelectRecette("SELECT xdb_recette.name," +

    " GROUP_CONCAT(xdb_element.name SEPARATOR ', '), ROUND(SUM(qt*xdb_element.price) / sum(qt)*2,1)/2" +

    " FROM xdb_recetteComposant" +

    " LEFT JOIN xdb_element ON xdb_element.id = xdb_recetteComposant.element" +

    " LEFT JOIN xdb_recette ON xdb_recette.id = xdb_recetteComposant.recette" +

    " GROUP BY recette");

    //Nous créons un fichier xml à partir de notre dataset avec la méthode WriteXml

    System.IO.FileStream myFileStream = new System.IO.FileStream("C:\\contact.xml", System.IO.FileMode.Create);

    System.Xml.XmlTextWriter xtw = new System.Xml.XmlTextWriter(myFileStream, System.Text.Encoding.Unicode);

    xtw.WriteProcessingInstruction("xml", "version='1.0'");

    mydatabase.myTable.WriteXml(xtw);

    xtw.Close();

     

    //Nous pouvons utiliser la méthode OpenXML pour ouvrir notre fichier Xml dans Excel

    Microsoft.Office.Interop.Excel.Application myExcel = new Microsoft.Office.Interop.Excel.Application();

    myExcel.Workbooks._OpenXML("C:\\contact.xml",Missing.Value);

    myExcel.Visible = true;

    }

     

     

    Le seul truc donc je ne me souviens plus trop c'est ton mytable comment il s'écrit donc fait attention à cette ligne:

    mydatabase.myTable.WriteXml(xtw);

     

    A++

     

    PS: pareil aujourd'hui entre 13h et 14h si tu veux (j'ai ma roadmap jusqu'à octobre et je vais pas chômer  donc j'aurai pas des masses de temps)

    mardi 10 juin 2008 08:12
  • Salut,

     

    merci pour vos aides !

     

    Dernière erreurs:

     

    Erreur 4 Le nom 'Missing' n'existe pas dans le contexte actuel.

     

    xD

     

    Meilleure salutation

     

    mardi 10 juin 2008 08:21
  • Re bonjour,

     

    Il faut utiliser le namespace System.Reflection. (lorsque cela arrive, il ne faut hésiter à utiliser l'explorateur d'objet ^^)

     

    Bonne continuation

    mardi 10 juin 2008 08:36
  • Bonjour,

     

    Merci pour vos réponses ! Le bouton fonctionne sauf que l'exportation n'est pas tout à fait correct !

     

    En effet, il devrait me sortir

     

    Ma recette + total

    mes produits qui compose la recette

     

    Ma recette2 + total

    etc.

     

     

    hors, voila ce que j'obtiens:

    /DocumentElement
    /MonDataTable/GROUP_CONCAT_x0028_xdb_element.name_x0020_SEPARATOR_x0020__x0027__x002C__x0020__x0027__x0029_ /MonDataTable/name /MonDataTable/ROUND_x0028_SUM_x0028_qt_x002A_xdb_element.price_x0029__x0020__x002F__x0020_sum_x0028_qt_x0029__x002A_2_x002C_1_x0029__x002F_2 /MonDataTable/ROUND_x0028_SUM_x0028_qt_x002A_xdb_element.price_x0029__x0020__x002F__x0020_sum_x0028_qt_x0029__x002A_2_x002C_1_x0029__x002F_2/#agg
    cG9tbWUsIHRvdXJuZXNvbCwgZmxldXIgZGUgbHlz Ma recette 45.3 45.3
    cG9tbWUsIHRvdXJuZXNvbCwgZmxldXIgZGUgbHlz Recette de pomme de terre frite 11.95 11.95

     

    mardi 10 juin 2008 08:41
  •  

    Ce n'est pas une erreur,

     

    Regarde comment est structuré ton fichier XML.

     

    Il faut que tu te fasses un fichier xsl, pour mettre en forme les colonnes (ou plus) de ton fichier Excel.

     

    http://www.w3.org/Style/XSL/

     

    Bon courage, tu as bientôt terminé,

     

     

    Amicalement,

     

     

     

    mardi 10 juin 2008 09:14
  • Salut,

     

    Voici mon fichier xml

    <DocumentElement>

     <MonDataTable>
    <name>Ma recette</name>
    <GROUP_CONCAT_x0028_xdb_element.name_x0020_SEPARATOR_x0020__x0027__x002C__x0020__x0027__x0029_>cG9tbWUsIHRvdXJuZXNvbCwgZmxldXIgZGUgbHlz</GROUP_CONCAT_x0028_xdb_element.name_x0020_SEPARATOR_x0020__x0027__x002C__x0020__x0027__x0029_>
    <ROUND_x0028_SUM_x0028_qt_x002A_xdb_element.price_x0029__x0020__x002F__x0020_sum_x0028_qt_x0029__x002A_2_x002C_1_x0029__x002F_2>45.3</ROUND_x0028_SUM_x0028_qt_x002A_xdb_element.price_x0029__x0020__x002F__x0020_sum_x0028_qt_x0029__x002A_2_x002C_1_x0029__x002F_2>
    </MonDataTable>

     <MonDataTable>
    <name>Recette de pomme de terre frite</name>
    <GROUP_CONCAT_x0028_xdb_element.name_x0020_SEPARATOR_x0020__x0027__x002C__x0020__x0027__x0029_>cG9tbWUsIHRvdXJuZXNvbCwgZmxldXIgZGUgbHlz</GROUP_CONCAT_x0028_xdb_element.name_x0020_SEPARATOR_x0020__x0027__x002C__x0020__x0027__x0029_>
    <ROUND_x0028_SUM_x0028_qt_x002A_xdb_element.price_x0029__x0020__x002F__x0020_sum_x0028_qt_x0029__x002A_2_x002C_1_x0029__x002F_2>11.95</ROUND_x0028_SUM_x0028_qt_x002A_xdb_element.price_x0029__x0020__x002F__x0020_sum_x0028_qt_x0029__x002A_2_x002C_1_x0029__x002F_2>
    </MonDataTable>
    </DocumentElement>

     

    Le problème c'est que les valeur cG9tbWUsIHRvdXJuZXNvbCwgZmxldXIgZGUgbHlz and compagny n'existe pas.

     

    mardi 10 juin 2008 09:39
  • Bonjour,

     

    J'ai finalement choisis ce code:

     

    private void toolStripButton5_Click(object sender, EventArgs e)

    {

    dataBase mydatabase = new dataBase("localhost", "theproject", "root");

    int dateDayMySQL = DateTime.Now.Day;

    string sDay = dateDayMySQL.ToString();

    int dateMonthMySQL = DateTime.Now.Month;

    string sMonth = dateMonthMySQL.ToString();

    int dateYearMySQL = DateTime.Now.Year;

    string sYear = dateYearMySQL.ToString();

    bool connectionDeleteStatus = mydatabase.SelectRecette("SELECT xdb_recette.name," +

    " GROUP_CONCAT(xdb_element.name SEPARATOR ', '), ROUND(SUM(qt*xdb_element.price) / sum(qt)*2,1)/2" +

    " FROM xdb_recetteComposant" +

    " LEFT JOIN xdb_element ON xdb_element.id = xdb_recetteComposant.element" +

    " LEFT JOIN xdb_recette ON xdb_recette.id = xdb_recetteComposant.recette" +

    " GROUP BY recette");

    Workbook wb = new Workbook();

    Worksheet ws = wb.Worksheets.Add("Recette");

    WorksheetStyle wsBold = wb.Styles.Add("10");

    wsBold.Font.Bold = true;

    ws.Table.Columns.Add(new WorksheetColumn(200));

    ws.Table.Columns.Add(new WorksheetColumn(150));

    ws.Table.Columns.Add(new WorksheetColumn(150));

    WorksheetRow wr = new WorksheetRow();

    WorksheetCell wcRecette = new WorksheetCell("Recette", DataType.String, "10");

    WorksheetCell wcProduits = new WorksheetCell("Produits", DataType.String, "10");

    WorksheetCell wcPrix = new WorksheetCell("Prix", DataType.String, "10");

    wr.Cells.Add(wcRecette);

    wr.Cells.Add(wcProduits);

    wr.Cells.Add(wcPrix);

    ws.Table.Rows.Add(wr);

    foreach (DsCustomers.CustomersRow row in dsCustomers1.Customers.Rows)

    {

    wr = new WorksheetRow();

    // ajout d’une cellule à une ligne

    wr.Cells.Add(row.CompanyName);

    wr.Cells.Add(row.ContactName);

    wr.Cells.Add(row.ContactTitle);

    ws.Table.Rows.Add(wr);

    }

    wb.Save(sfdExcelFile.FileName);

    }

     

     

    Dont la source ce situ ici: http://www.labo-dotnet.com/Articles/Office/Spreadsheet%20ML%20et%20génération%20de%20fichier%20Excel/Création%20d%20un%20document%20Excel%20en%20dotNET/4/1547.aspx

     

    Cependant, voici mon erreur:

    Erreur 4 Le nom 'dsCustomers1' n'existe pas dans le contexte actuel

    ligne:

    foreach (DsCustomers.CustomersRow row in dsCustomers1.Customers.Rows)

     

    Erreur 5 Le type ou le nom d'espace de noms 'DsCustomers' est introuvable (une directive using ou une référence d'assembly est-elle manquante ?) 

     

    ligne:

    foreach (DsCustomers.CustomersRow row in dsCustomers1.Customers.Rows)


    Erreur 6 Le nom 'sfdExcelFile' n'existe pas dans le contexte actuel

    ligne:

    wb.Save(sfdExcelFile.FileName);

     

     

    Meilleure salutation !


    mardi 10 juin 2008 11:58
  •  

    T'as pas mal de code à changer ici:

     

    commence par changer:

    Code Snippet

    foreach (DsCustomers.CustomersRow row in dsCustomers1.Customers.Rows)

    {

    wr = new WorksheetRow();

    // ajout d’une cellule à une ligne

    wr.Cells.Add(row.CompanyName);

    wr.Cells.Add(row.ContactName);

    wr.Cells.Add(row.ContactTitle);

    ws.Table.Rows.Add(wr);

    }

     

     

     

    par

    Code Snippet

    foreach (DataRow row in mydatabase.mytable.rows)

    {

    wr = new WorksheetRow();

    // ajout d’une cellule à une ligne

    wr.Cells.Add(row["Recette"].ToString());

    wr.Cells.Add(row["Produit"].ToString());

    wr.Cells.Add(row["Prix"].ToString());

    ws.Table.Rows.Add(wr);

    }

     

     

    Fait attention au majuscules/minuscules mais globalement ça devrait être bon.

     

    ah et remplace sfdExcelFile.FileName par @"c:\test.xls" pour commencer (tu fera un file dialog après).

    mardi 10 juin 2008 12:58
  • Salut,

     

    Merci pour ta réponse, il compile correctement, mais n'execute pas juste:

     

    La colonne 'Recette' n'appartient pas à la table MonDataTable.

     

    ligne:

    wr.Cells.Add(row["Recette"].ToString());

    wr.Cells.Add(row["Produit"].ToString());

    wr.Cells.Add(row["Prix"].ToString());

     

     

    Pourquoi?

     

    Meilleures salutations

    mardi 10 juin 2008 13:10
  • c'est ce qui correspond au retour de ton select mais comme tu n'as pas de as c'est plus dure. Remplace dans les row par 0, 1 2 comme par exemple:

    wr.Cells.Add(row[0].ToString());

    wr.Cells.Add(row[1].ToString());

    wr.Cells.Add(row[2].ToString());

     

    Ca respecte l'ordre de ton select.
    mardi 10 juin 2008 13:20
  • Salut !

     

    Ca fonctionne, presque ^^

     

    Recette

    Produits

    Prix

    Ma recette

    System.Byte[]

    45.3

    Recette de pomme de terre frite

    System.Byte[]

    11.95

     

    Systen,Byte[] devrait en réalité être les produits jor banane, fleur de lys, thé noir.

     

    tu vois comment?

     

    mardi 10 juin 2008 13:24
  • Ca à l'air d'être un problème de sql (http://www.discussweb.com/database-support/1401-group_concat-mysql.html

    ) qui te fait une sortie dans un format bizarre.

     

    Il faudrait faire un cast as string je suppose comme expliqué dans la discussion. Ou alors il va falloir que tu browse chaque "item" tu tableau de byte pour recréer la chaine  (regarde dans l'aide du côté de new string(char[]value) ).
    mardi 10 juin 2008 13:42
  • On peut pas faire:

    wr.Cells.Add(row["+ SELECT xdb_recetteComposant.name LEFT JOIN xdb_recette WHERE id= recetteQuiSincrementeAuFurEtAMesurDeLaBoucle?+"].ToString());

     

    mardi 10 juin 2008 13:52
  • Bonjour,

     

     

    Je rappelle peut être que frmViewRecette contient juste le nom de la recette et le prix (ces 2 objets sont affichés dans ma table excel), mais que les produits sont dans frmViewDetailsRecette.

     

    Peut être est-ce là le problème?

     

    mercredi 11 juin 2008 06:53
  • Salut,

     

    Mise à jour,

     

    Enfait la requête est trop longue, il faudrait réussir à faire ça:

     

    GROUP_CONCAT(xdb_element.name SEPARATOR ', ')

     mais en plus petit....

     

    La requête complète:

    bool connectionDeleteStatus = mydatabase.SelectRecette("SELECT xdb_recette.name," +

    " GROUP_CONCAT(xdb_element.name SEPARATOR ', '), ROUND(SUM(qt*xdb_element.price) / sum(qt)*2,1)/2" +

    " FROM xdb_recetteComposant" +

    " LEFT JOIN xdb_element ON xdb_element.id = xdb_recetteComposant.element" +

    " LEFT JOIN xdb_recette ON xdb_recette.id = xdb_recetteComposant.recette" +

    " GROUP BY recette");

    mercredi 11 juin 2008 08:12
  • Solution:

    Faut cast(requete) AS CHAR)

     

    mercredi 11 juin 2008 09:41