none
Exporter Datagrid vers xls ou xlsx RRS feed

  • Question

  • Bonjour à tous,

    Sur mon projet, je fais l'export d'un Datagrid vers un fichier xls et ensuite, je dois lire ce fichier Excel (qui doit être complété par l'utilisateur).

    Voila comment je crée mon fichier Excel :

    private void CreateMatrice(object sender, RoutedEventArgs e)
            {
                try
                {
                    var Destination = DestinationFichierMatrice();
                    
                    DataGridMatrice.SelectAllCells();
                    DataGridMatrice.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader;
                    ApplicationCommands.Copy.Execute(null, DataGridMatrice);
                    String resultat = (string)Clipboard.GetData(DataFormats.CommaSeparatedValue);
                    String result = (string)Clipboard.GetData(DataFormats.Text);
                    DataGridMatrice.UnselectAllCells();
                    System.IO.StreamWriter file = new System.IO.StreamWriter(Destination + @"\MatriceDSN.xls");
                    file.WriteLine(result.Replace(',', ' '));
                    file.Close();
    
                    System.Windows.Forms.MessageBox.Show("Le Fichier a bien été généré.");
                }
                catch { System.Windows.Forms.MessageBox.Show("Le fichier n'a pas été généré."); }
            }

    Quand on ouvre ce fichier Excel, on a toujours le message "Le format de l'extension du fichier "MatriceDNS" ne correspond pas. Le fichier peut présenter un risque ou avoir été endommagé. Ne l'ouvre pas, à moins que la que la sources soit fiable. Voulez-vous quand même l'ouvrir ?"

    Excel l'ouvre bien mais quand le lis le fichier dans mon programme, pour lui la première case, c'est toute la ligne entière, les champs n'étant séparés que par un espace.

    y a-t-il une autre méthode pour générer un fichier Excel plus "moderne" car avec cette méthode, je ne génère que des fichiers Excel 97-2003 ?

    Pour info, voila comment le lis mon fichier :

    public partial class MainWindow : System.Windows.Window
        {
            string Codesalarié, codsociete, ...;
    
            public void ajoutinfo()
            {
                Excel.Application xlApp;
                Excel.Workbook xlWorkBook;
                Excel.Worksheet xlWorkSheet;
                Excel.Range range;
                object misValue = System.Reflection.Missing.Value;
                int ligne = 0;
                int colonne = 0;
    
    
                xlApp = new Excel.Application();
    
                string chemin = FichierMatriceLB.Content.ToString();
                if (chemin != "")
                {
                    try
                    {
                        xlWorkBook = xlApp.Workbooks.Open(chemin, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
                        xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
    
                        range = xlWorkSheet.UsedRange;
    
                        //MessageBox.Show("Lignes : " + Convert.ToString(range.Rows.Count)); //nombre de lignes dans le fichier
                        //MessageBox.Show("colonnes : " + Convert.ToString(range.Columns.Count)); //nombre de colonnes dans le fichier
    
                        string[] ligne_fichier = new string[50];
                        for (ligne = 1; ligne <= range.Rows.Count; ligne++)
                        {
                            for (colonne = 1; colonne <= range.Columns.Count; colonne++)
                            {
                                ligne_fichier[colonne] = Convert.ToString((range.Cells[ligne, colonne] as Excel.Range).Value2);
    
                            }
                            if (ligne_fichier[1] == IdentifiantLigne)
                            {
                                //MessageBox.Show("test egalité");
                                //on recupere les données du tableau excel
                                int i = 1;
                                Codesalarié = ligne_fichier[i]; i++;
                                codsociete = ligne_fichier[i]; i++;
                                ...
                            }
    
                        }
    
                        xlWorkBook.Close(true, misValue, misValue);
                        xlApp.Quit();
    
                        releaseObject(xlWorkSheet);
                        releaseObject(xlWorkBook);
                        releaseObject(xlApp);
                    }
                    catch (Exception e) { MessageBox.Show("Impossible de lire le fichier " + e); }
                }
            }
    
            private void releaseObject(object obj)
            {
                try
                {
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                    obj = null;
                }
                catch (Exception ex)
                {
                    obj = null;
                    MessageBox.Show("Unable to release the Object " + ex.ToString());
                }
                finally
                {
                    GC.Collect();
                }
            }
    
            //selection du fichier Excel
            private string ouverture_fichier()
            {
                OpenFileDialog fichier;
                fichier = new OpenFileDialog();
                fichier.Filter = "Fichiers Excel (*.xls)|*.xls|Fichier xlsx (*.xlsx)|*.xlsx|Fichier csv (*.csv)|*.csv";
                fichier.InitialDirectory = "c:\\";
                fichier.Title = "Selection du fichier contenant les informations à rajouter";
                fichier.ShowDialog();
                string fichierexcel = fichier.FileName;
                return fichierexcel;
            }
    



    "Un bon technicien n'est pas un technicien qui pense tout savoir" Lallemand Sébastien MCITP EA Windows Server 2008 R2 Apprenti développeur C# EF

    mardi 13 janvier 2015 09:24

Réponses

  • Bonjour,

    Votre code initial ne crée pas un fichier Excel mais un fichier csv (fichier texte dont les valeurs sont séparés par des , ou des tab ou des ;). Votre fichier MatriceDSN.xls devrait plutôt s'appeler MatriceDSN.csv.

    Maintenant, Excel sait lire les fichiers csv d'ou le message d'avertissement au moment de l'ouverture.

    Pour la création, modification de fichiers Office x (xlsx, docx, etc.) vous avez plusieurs solutions :

    1/ OpenXML avec son SDK mais vous verrez rapidement que c'est le cauchermar ;-).

    2/ Utiliser des composants tiers qui comprennent ces formats. Pour Excel, vous avez par exemple le produit Open Source NPOI


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    vendredi 16 janvier 2015 08:13

Toutes les réponses

  • En solution de contournement, j'ai convertie mon fichier xls en xlsx

    Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
    excelApp.Visible = false;
    
    Microsoft.Office.Interop.Excel.Workbook eWorkbook = excelApp.Workbooks.Open("C:\\Temp.xls", 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);
    
    eWorkbook.SaveAs("C:\\Temp2.xlsx", Microsoft.Office.Interop.Excel.XlFileFormat.xlOpenXMLWorkbook, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
    
    eWorkbook.Close(false, Type.Missing, Type.Missing);
    



    MCITP EA Windows Server 2008 R2 MCSA Windows Server 2012 Apprenti développeur C# EF WPF

    mardi 13 janvier 2015 14:45
  • Bonjour,

    Votre code initial ne crée pas un fichier Excel mais un fichier csv (fichier texte dont les valeurs sont séparés par des , ou des tab ou des ;). Votre fichier MatriceDSN.xls devrait plutôt s'appeler MatriceDSN.csv.

    Maintenant, Excel sait lire les fichiers csv d'ou le message d'avertissement au moment de l'ouverture.

    Pour la création, modification de fichiers Office x (xlsx, docx, etc.) vous avez plusieurs solutions :

    1/ OpenXML avec son SDK mais vous verrez rapidement que c'est le cauchermar ;-).

    2/ Utiliser des composants tiers qui comprennent ces formats. Pour Excel, vous avez par exemple le produit Open Source NPOI


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    vendredi 16 janvier 2015 08:13