Partage
  • Partager sur Facebook
  • Partager sur Twitter

Documentations-Informations C#-VB(A)-Excel

Sujet résolu
    5 juillet 2018 à 10:03:58

    Bonjour tout le monde,

    Je suis en alternance cette année et j'ai développé un logiciel de recherche et d'analyse pour des essais de machines de BTP. A présent il me reste 2 mois pour développer la partie "analyse" je m'explique :

    Mon logiciel est codé en C# WPF et je communique avec une BDD sur SQL Server 2014 Express grâce à l'ORM EntityFramework. Toutes les données des essais sont stockées dans cette base de données (pour faire simple). Par la suite, j'effectue des requêtes LINQ pour afficher les données dans un DataGrid. J'ai un bouton pour exporter le contenu du DataGrid dans un fichier Excel.

    A présent, j'aimerai pouvoir réaliser un script Excel (codé en VBA si j'ai bien compris) qui s'exécute à l'activation d'un bouton sur mon application C# pour créer des graphiques (nuages de points, histogrammes, etc.). J'aimerai avoir quelques informations quand à la méthode à appliquer et des documentations concernant les scripts VBA, car je n'en ai jamais fait (mais la syntaxe a l'air simple).

    Je vous joins ma fonction d'export sur Excel afin de savoir si on peut créer un graphique directement à la création de ce fichier.

    Bonne journée !

    private void ExportToExcel()
            {
                dg_test.SelectAll();
                dg_test.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader;
                ApplicationCommands.Copy.Execute(null, dg_test);
                String resultat = (string)System.Windows.Clipboard.GetData(System.Windows.DataFormats.CommaSeparatedValue);
                String result = (string)System.Windows.Clipboard.GetData(System.Windows.DataFormats.Text);
                dg_test.UnselectAllCells();
                SaveFileDialog savefiledlg1 = new SaveFileDialog();
                savefiledlg1.DefaultExt = ".xls";
                savefiledlg1.Filter = "xls(*.xls*) |*.xls* | Tous(*.*)|*.* ";
                savefiledlg1.RestoreDirectory = true;
                savefiledlg1.FilterIndex = 1;
                savefiledlg1.InitialDirectory = "C:\\Users\\"+ System.Environment.UserName + "\\Desktop";
                savefiledlg1.Title = "Sauvegardez votre fichier Excel";
                if (savefiledlg1.ShowDialog() == DialogResult.OK)
                {
                    using (System.IO.Stream myStream = savefiledlg1.OpenFile())
                    {
                        using (System.IO.StreamWriter file1 = new System.IO.StreamWriter(myStream))
                        {
                            file1.WriteLine(result);
                            file1.Close();
                            System.Windows.MessageBox.Show(" Le DataGrid a été sauvegardé avec succès avec l'extension .xls à l'adresse suivante : " + savefiledlg1.FileName + ".");
                        }
                    }
                }
                else
                {
                    MessageBox.Show("Une erreur inconnue est survenue ou vous avez annulé l'opération de sauvegarde");
                }
                
            }
    • Partager sur Facebook
    • Partager sur Twitter
      6 juillet 2018 à 15:18:14

      Salut,

      Qu'est-ce que tu as essayé de faire ?

      Ton code enregistre vraiment un fichier au format xls ?

      Pour ton problème lui-même, je dirais qu'il vaut mieux tout faire en C# (je dis ça sans vraiment de fondements mais quitte à créer un fichier Excel avec C# autant rester en C# pour le reste, d'autres pourront peut-être me corriger).

      Du coup tu peux peut-être commencer par quelque chose comme ça : http://csharp.net-informations.com/excel/csharp-excel-chart.htm

      • Partager sur Facebook
      • Partager sur Twitter
        9 juillet 2018 à 11:08:48

        Salut Stormweaker,

        Pour l'instant j'essaye de développer un script en VBA pour créer un nuage de points selon toutes les plages non vides du classeur actif.

        Il enregistre un fichier et je sélectionne l'extension par défault en xls.

        Ton lien m'as amené à pas mal d'informations je vais regarder ça en détail !

        A plus tard !

        Edit :
        Re !

        Après avoir regardé des dizaines de forums et d'infos sur la création de graphiques sur Excel à partir de C# je me retrouve un peu perdu.

        Explicitement, je n'arrive pas à un réaliser un nuage de points selon des données déjà inclues dans le fichier Excel.

        J'ai plusieurs problèmes qui sont :

        Je possède Excel 2013 et Visual Studio 2017, j'ai des soucis d'ouverture de fichier Excel sur C# car le format n'est pas adapté ou est un "SYLK". J'enregistre mon fichier Excel en XLSX mais mon application Excel apprécie pas le format alors que c'est celui de base.

        Quand j'arrive à ouvrir le fichier (en xls du coup..), je souhaites récupérer leur données mais je n'arrive pas à récupérer l'ensemble des cellules non vides pour réaliser mon chart.

        xlWorkBook = xlApp.Workbooks.Add(misValue);
                    xlWorkSheet = (Excel.Worksheet) xlWorkBook.Worksheets.get_Item(1);
        
        //Je n'ai pas réussi à comprendre ces 2 lignes de code, sont-elle responsable de l'ouverture du fichier Excel ? 
        
        chartRange = xlWorkSheet.get_Range("A1", "d5");
        
        // cette ligne corresponds à la récupération de la plage de données contenu dans le fichier Excel, le nombres de lignes ET 
        de colonnes varient pour chaque Excel comment définir une "plage de données" dynamique ?

        -
        Edité par Kadoow 9 juillet 2018 à 16:26:20

        • Partager sur Facebook
        • Partager sur Twitter
          10 juillet 2018 à 14:57:41

          private void Button_Click_1(object sender, RoutedEventArgs e)
                  {
                      Excel.Application xlApp;
                      Excel.Workbook xlWorkBook;
                      Excel.Worksheet xlWorkSheet;
                      object misValue = System.Reflection.Missing.Value;
          
                      OpenFileDialog open = new OpenFileDialog();
                      if (open.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                      {
          
                          xlApp = new Excel.Application();
                          xlWorkBook = xlApp.Workbooks.Add(open.FileName);
                          xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
          
          
                          Excel.Range chartRange;
          
                          Excel.ChartObjects xlCharts = (Excel.ChartObjects)xlWorkSheet.ChartObjects(Type.Missing);
                          Excel.ChartObject myChart = (Excel.ChartObject)xlCharts.Add(10, 80, 300, 250);
                          Excel.Chart chartPage = myChart.Chart;
          
                          chartRange = xlWorkSheet.get_Range("A1", "d5");
                          chartPage.SetSourceData(chartRange, misValue);
                          chartPage.ChartType = Excel.XlChartType.xlColumnClustered;
          
                          xlWorkBook.SaveAs("csharp.net-informations.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
                          xlWorkBook.Close(true, misValue, misValue);
                          xlApp.Quit();
          
                          releaseObject(xlWorkSheet);
                          releaseObject(xlWorkBook);
                          releaseObject(xlApp);
          
                          MessageBox.Show("Excel file created , you can find the file c:\\csharp.net-informations.xls");
                      }
                  }
          
                  private void releaseObject(object obj)
                  {
                      try
                      {
                          System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                          obj = null;
                      }
                      catch (Exception ex)
                      {
                          obj = null;
                          MessageBox.Show("Exception Occured while releasing object " + ex.ToString());
                      }
                      finally
                      {
                          GC.Collect();
                      }
                  }


          Bonjour,

          J'ai cette errreur qui est générée suite à l'exécution de mon code...

          Mes questions d'avant sont toujours d'actualités.

          J'ai également lié ma fonction de création de graphique (c'est un copié collé) mais avec un système d'ouverture de fichier à l'appui du bouton. 

          -
          Edité par Kadoow 10 juillet 2018 à 15:00:59

          • Partager sur Facebook
          • Partager sur Twitter
            11 juillet 2018 à 9:18:46

            Salut,

            En gros, ce qu'il te dis c'est que ton fichier à une extension ici (xls), mais qu'il a été enregistré sous un autre format (xlsx? xslm?), donc qu'il a été renommé pour changer l’extension, du coup pour des raisons de sécurité, il l'ouvre pas..

            Ré-enregistre ton fichier au bon format (sans changer l'extension) et ça devrait fonctionner :)

            Sinon, d’expérience, la communication C#-Excel en passant par Interop c'est pas une bonne idée, c'est lourd à coder, chiant à maintenir, et tu peux avoir des comportements bizarres d'un jour à l'autre après une mise à jour d'Excel.. Regarde plutôt du coté des compléments VSTO !

            Cordialement

            • Partager sur Facebook
            • Partager sur Twitter
            Fatalement vôtre
              11 juillet 2018 à 9:31:33

              C'est parce que tu n'enregistres pas de fichier au format xls, tu enregistres du texte dans un fichier *.xls ce qui n'a rien à voir.
              • Partager sur Facebook
              • Partager sur Twitter
                11 juillet 2018 à 11:33:09

                Merci D.Fate de ta réponse,

                Quand j'enregistre avec une ma fonction du 1er post, je me retrouve avec deux problèmes. Si j'enregistre en XLS , je dois cliquer sur 3 boites de dialogues avant de l'ouvrir manuellement: elles signalent que c'est un fichier SYLK et qu'il est endommagé etc. En essayant d'ouvrir avec mon appli C#, ça affiche le message d'erreur de mon dernier post en date. Enregistrer en XLSX est possible, mais le fichier est impossible à ouvrir dans les 2 cas que ce soit manuellement ou en programmation...

                StormWeaker, je vois très bien ce que tu veux dire mais alors comment enregistrer un fichier à l'extension propre XLSX et pas mettre du texte dedans..

                Je vais regarder les compléments VSTO, j'espère juste qu'il me pemrettra de faire des graphiques nuage de points :)

                Edit: D.Fate j'ai compris ce que tu voulais dire 2min après mon post ça fonctionne parfaitement mais je dois trouver une autre solution pour éviter à l'utilisateur, après chaque export, de retourner dans le fichier pour "l'enregistrer sous" en format xlsx, cela fait perdre énormément de temps

                -
                Edité par Kadoow 11 juillet 2018 à 11:39:05

                • Partager sur Facebook
                • Partager sur Twitter
                  11 juillet 2018 à 11:44:10

                  Salut,

                  Le fichier que tu enregistre avec ta fonction, c'est du CSV non?

                  Plutot que de l'exporter dans ce format (texte avec une extension invalide, ici xls), je pense que tu peux (à vérifier):

                  • Soit enregistrer ton format avec une extension .csv et je pense qu'excel devrait arriver à l'ouvrir dans ta fonction Button_Click_1 (mais dans tous les cas tu devra recréer un workbook excel sinon impossible d'enregistrer un graphique).
                  • Soit l'exporter directement en xls (ou xlsx) avec une fonction similaire à ce que tu fais dans Button_Click_1.

                  Je te conseille plutôt la seconde, évite de passer par du format texte si tu dois uniquement faire du traitement dans excel.

                  PS: Si tu veux exporter en xlsx, tu dois mettre ton FileFormat à xlOpenXMLWorkbook à la place de xlWorkbookNormal.

                  Cordialement

                  -
                  Edité par D.Fate 11 juillet 2018 à 11:46:45

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Fatalement vôtre
                    13 juillet 2018 à 11:05:42

                    Bonjour D.Fate,

                    Juste une chose à dire: MERCI.

                    Tu viens de confirmer le problème que je pensais avoir trouvé au niveau du FileFormat.

                    Un autre petit problème au niveau de l'ouverture du fichier, quand je fais mon SaveAs il me dit que mon fichier est en lecture seule. A la base j'enregistre des fichiers Excel avec un SaveFileDialog et StreamWriter (fonction ExportToExcel du premier post), vous savez comment comment definir leur accès en mode Read/write, j'ai testé pas mal de choses sans résultats...

                    Bonne journée !

                    -
                    Edité par Kadoow 13 juillet 2018 à 11:08:31

                    • Partager sur Facebook
                    • Partager sur Twitter
                      13 juillet 2018 à 14:20:13

                      Salut,

                      Quand tu sauves ton fichier tu as une exception? Si oui, tu peux la poster ici?

                      Tu fais un SaveAs? Du même fichier qui est ouvert dans ton instance d'application Excel? Avec le même nom?

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Fatalement vôtre
                        13 juillet 2018 à 17:09:22

                        Je me rends compte qu'un streamwriter avec un savefile dialog n'enregistre pas réelement le fichier avec l'extension voulu... C'est un fichier lamba au final avec des données dedans et une extension renomée au final.

                        Erreur avec export en xlsx :

                        System.Runtime.InteropServices.COMException
                          HResult=0x800A03EC
                          Message=Impossible d'ouvrir le fichier « test10.xlsx » car son format ou son extension n'est pas valide. Vérifiez que le fichier n'est pas endommagé et que son extension correspond bien au format du fichier.
                          Source=LogicielRechercheEssaiPerfo
                          Arborescence des appels de procédure :
                           à Microsoft.Office.Interop.Excel.Workbooks.Add(Object Template)
                           à LogicielRechercheEssaiPerfo.ANALYSE.btn_chart_Click(Object sender, RoutedEventArgs e) dans ######(privé)usercontrol\ANALYSE.xaml.cs :ligne 103
                           à System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
                           à System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
                           à System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
                           à System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)
                           à System.Windows.Controls.Primitives.ButtonBase.OnClick()
                           à System.Windows.Controls.Button.OnClick()
                           à System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
                           à System.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e)
                           à System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
                           à System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
                           à System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
                           à System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
                           à System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
                           à System.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e)
                           à System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
                           à System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
                           à System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
                           à System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
                           à System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
                           à System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
                           à System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
                           à System.Windows.Input.InputManager.ProcessStagingArea()
                           à System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
                           à System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
                           à System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
                           à System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
                           à System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
                           à MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
                           à MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
                           à System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
                           à System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
                           à System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
                           à MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
                           à MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
                           à System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
                           à System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
                           à System.Windows.Application.RunDispatcher(Object ignore)
                           à System.Windows.Application.RunInternal(Window window)
                           à System.Windows.Application.Run(Window window)
                           à System.Windows.Application.Run()
                           à LogicielRechercheEssaiPerfo.App.Main()

                        Erreur avec XLS : System.Runtime.InteropServices.... : 'impossible d'enregistrer sous ce nom. Ce docuement a été ouvert en lecture seule

                        Tu fais un SaveAs? Du même fichier qui est ouvert dans ton instance d'application Excel? Avec le même nom? ---> Oui mon but à terme est d'ouvrir le fichier, créer un nuage de points avec les données contenu dans le fichier Excel, puis écraser l'ancien pour retrouver le fichier avec le graph : tout ça en cliquant sur un bouton

                        -
                        Edité par Kadoow 13 juillet 2018 à 17:14:11

                        • Partager sur Facebook
                        • Partager sur Twitter
                          2 août 2018 à 11:38:22

                          UP !

                          Toujours le même problème un SaveAs qui ne fonctionne pas car pour lui le fichier xls est en lecture seule, si je décide d'ouvrir un fichier xlsx, c'est impossible à cause de l'extension.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            2 août 2018 à 13:26:53

                            Quel est le code pour sauvegarder / ouvrir ?

                            Tu as essayé de faire un code minimal ?

                            Tu utilises Interop ou VSTO ?

                            • Partager sur Facebook
                            • Partager sur Twitter
                              2 août 2018 à 13:45:40

                              private void btn_chart_Click(object sender, RoutedEventArgs e)
                                      {
                                          Excel.Application xlApp;
                                          Excel.Workbook xlWorkBook;
                                          Excel.Range xlRange;
                                          Excel.Sheets xlSheets = null;
                                          Excel.Worksheet xlSheet;
                                          object misValue = System.Reflection.Missing.Value;
                              
                                          OpenFileDialog open = new OpenFileDialog();
                                          open.Title = "Choisissez le fichier Excel";
                                          open.ShowReadOnly = true;
                              
                                          if (open.ShowDialog() == DialogResult.OK)
                                          {
                              
                                              xlApp = new Excel.Application();
                                              xlWorkBook = xlApp.Workbooks.Add(Template: open.FileName);
                                              xlSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
                              
                              
                              
                                              Excel.Range chartRange;
                              
                                              Excel.ChartObjects xlCharts = (Excel.ChartObjects)xlSheet.ChartObjects(Type.Missing);
                                              
                                              Excel.ChartObject myChart = (Excel.ChartObject)xlCharts.Add(60, 10, 300, 300);
                                              Excel.Chart chartPage = myChart.Chart;
                              
                                              xlSheets = (Excel.Sheets)xlWorkBook.Sheets;
                                              xlSheet = (Excel.Worksheet)xlSheets[1];
                                              xlRange = xlSheet.UsedRange;
                              
                                              int nRows = xlRange.Rows.Count;
                                              int nCols = xlRange.Columns.Count;
                              
                                              chartRange = xlSheet.get_Range("A1", "X"+nRows+"");
                                              chartPage.SetSourceData(chartRange, misValue);
                              
                                              var typechart = chartPage.ChartType = XlChartType.xlXYScatterSmooth;
                              
                                              var coco = Excel.XlFileAccess.xlReadWrite;
                              
                                              //chartPage.ChartWizard(obj_recherche.dg_test, typechart, misValue, misValue,
                                              //misValue, misValue, false, tb_titlechart, "categorie", "valeur", "extratitre");
                              
                              
                              
                                              OpenFileDialog open2 = new OpenFileDialog();
                                              open2.Title = "Définissez l'emplacement de sauvegarde";
                                              if (open2.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                                              {
                                                  xlWorkBook.SaveAs(open.FileName, Excel.XlFileFormat.xlOpenXMLWorkbook, misValue, misValue, false, false, Excel.XlSaveAsAccessMode.xlShared, Excel.XlSaveConflictResolution.xlUserResolution, true, misValue, misValue, misValue);
                                                  xlWorkBook.Close(true, misValue, misValue);
                                                  xlApp.Quit();
                              
                              
                                                  releaseObject(xlSheet);
                                                  releaseObject(xlWorkBook);
                                                  releaseObject(xlApp);
                              
                                                  MessageBox.Show("Excel file created , you can find the file c:\\csharp.net-informations.xls");
                                              }
                                              
                                              
                                          }
                                      }


                              Salut, merci de ton intérêt

                              Tu vas retrouver mon code dans les 1er posts sans problème et j'utilise Interop.

                              Je te joins le code car je l'ai modifié : ( je sais toujours pas comment faire pr mettre le code en bas de mon texte)

                              -
                              Edité par Kadoow 2 août 2018 à 13:47:35

                              • Partager sur Facebook
                              • Partager sur Twitter
                                2 août 2018 à 15:11:25

                                Ligne 53, tu utilises open.FileName, c'est pas open2 plutôt ? Si j'ai bien compris open.FileName renvoie vers un fichier template, que tu peux sans doute pas modifier comme ça (mais je ne suis pas sûr du tout, je n'ai jamais travailler avec les fichiers templates Excel, encore moins programmatiquement).

                                >( je sais toujours pas comment faire pr mettre le code en bas de mon texte)

                                Le code s'insère là où est le curseur.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  3 août 2018 à 10:27:41

                                  Cela n'as pas d'importance car au final je veux pouvoir insérer mon chart dans le même fichier Excel que j'ai ouvert en premier lieu, le FileName de open1 et open2 sont finalement identiques. J'ai donc enlevé cette partie de code mais j'en reviens toujours au même problème. Au SaveAs il me signale que le fichier est en lecture seule, je pense que ça vient du fait que j'ai mon 1er OpenFileDialog qui ne ferme pas le fichier, vous pensez que c'est une piste à explorer ?

                                  J'observe également dans mon processus qu'à chaque fin de journée, j'ai au moins une dizaine d'instance d'Excel ouvertes cela confirme mon hypothèse ?

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    3 août 2018 à 11:03:22

                                    > Cela n'as pas d'importance car au final je veux pouvoir insérer mon chart dans le même fichier Excel que j'ai ouvert en premier lieu

                                    Je vais peut-être te raconter n'importe quoi car je n'ai utilisé l'Interop qu'une seule fois mais je fais pas mal de VBA et ça a l'air d'y ressembler en essence.

                                    Si tu utilises Workbooks.Add, tu crées un nouveau classeur, en spécifiant le chemin d'un fichier tu indiques d'utiliser ce fichier en tant que template (peut-être des mises en forme, des plages pré-remplies, etc...) et ça n'a pas de sens de modifier la template une fois le nouveau fichier créé, donc il te renvoie une erreur (tu peux tester ce que je viens de dire en enregistrant dans un autre fichier, si ça plante toujours c'est que je raconte n'importe quoi).

                                    Par contre si tu veux ajouter des trucs dans un fichier qui existe déjà il faut utiliser Workbooks.Open, lui ouvrira le classeur en lecture-écriture (j'ai pas vu de valeur par défaut dans la doc mais tu peux le spécifier contrairement à Workbooks.Add : https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.interop.excel.workbooks.open?redirectedfrom=MSDN&view=excel-pia#Microsoft_Office_Interop_Excel_Workbooks_Open_System_String_System_Object_System_Object_System_Object_System_Object_System_Object_System_Object_System_Object_System_Object_System_Object_System_Object_System_Object_System_Object_System_Object_System_Object_)

                                    >ça vient du fait que j'ai mon 1er OpenFileDialog qui ne ferme pas le fichier

                                    OpenFileDialog n'ouvre pas de fichier, il récupère juste un chemin vers un fichier (une string), c'est toi ensuite qui ouvre un fichier avec Workbooks.Add et ça n'a l'air d'être libéré qu'après le SaveAs.

                                    >J'observe également dans mon processus qu'à chaque fin de journée, j'ai au moins une dizaine d'instance d'Excel ouvertes

                                    Je pense plutôt que c'est le programme qui ne libère pas les applications Excel puisqu'il plante au SaveAs, d'aileurs si l'utilisateur ne clique pas sur OK dans ton open2, les ressources ne seront pas libérées non plus.

                                    -
                                    Edité par Stormweaker 3 août 2018 à 11:03:45

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      3 août 2018 à 11:41:28

                                      private void btn_chart_Click(object sender, RoutedEventArgs e)
                                              {
                                                  Excel.Application xlApp;
                                                  Excel.Workbook xlWorkBook;
                                                  Excel.Range xlRange;
                                                  Excel.Sheets xlSheets = null;
                                                  Excel.Worksheet xlSheet;
                                                  object misValue = System.Reflection.Missing.Value;
                                      
                                                  OpenFileDialog open = new OpenFileDialog();
                                                  open.Title = "Choisissez le fichier Excel";
                                                  open.ShowReadOnly = true;
                                      
                                                  if (open.ShowDialog() == DialogResult.OK)
                                                  {
                                                      xlApp = new Excel.Application();
                                                      xlWorkBook = xlApp.Workbooks.Open(open.FileName,misValue,false,misValue,misValue,misValue,misValue,misValue,misValue,true);
                                                      xlSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
                                      
                                                      Excel.Range chartRange;
                                      
                                                      Excel.ChartObjects xlCharts = (Excel.ChartObjects)xlSheet.ChartObjects(Type.Missing);
                                                      
                                                      Excel.ChartObject myChart = (Excel.ChartObject)xlCharts.Add(60, 10, 300, 300);
                                                      Excel.Chart chartPage = myChart.Chart;
                                      
                                                      xlSheets = (Excel.Sheets)xlWorkBook.Sheets;
                                                      xlSheet = (Excel.Worksheet)xlSheets[1];
                                                      xlRange = xlSheet.UsedRange;
                                      
                                                      int nRows = xlRange.Rows.Count;
                                                      int nCols = xlRange.Columns.Count;
                                      
                                                      chartRange = xlSheet.get_Range("A1", "X"+nRows+"");
                                                      chartPage.SetSourceData(chartRange, misValue);
                                      
                                                      var typechart = chartPage.ChartType = XlChartType.xlXYScatterSmooth;
                                      
                                                      //var coco = Excel.XlFileAccess.xlReadWrite;
                                      
                                                      //chartPage.ChartWizard(obj_recherche.dg_test, typechart, misValue, misValue,
                                                      //misValue, misValue, false, tb_titlechart, "categorie", "valeur", "extratitre");
                                      
                                                      //OpenFileDialog open2 = new OpenFileDialog();
                                                      //open2.Title = "Définissez l'emplacement de sauvegarde";
                                                      //if (open2.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                                                      //{
                                                          xlWorkBook.SaveAs(open.FileName, Excel.XlFileFormat.xlOpenXMLWorkbook, misValue, misValue, false, false, Excel.XlSaveAsAccessMode.xlShared, Excel.XlSaveConflictResolution.xlUserResolution, true, misValue, misValue, misValue);
                                                          xlWorkBook.Close(true, misValue, misValue);
                                                          xlApp.Quit();
                                      
                                      
                                                          releaseObject(xlSheet);
                                                          releaseObject(xlWorkBook);
                                                          releaseObject(xlApp);
                                      
                                                          MessageBox.Show("Excel file created , you can find the file " + open.FileName + ".");
                                                      //}
                                                      
                                                      
                                                  }

                                      (Bon où que je mette mon curseur le code s'affiche en haut)


                                      J'ai remplacé mon Workbook.Add par Workbook.Open et il me sort toujours la même erreur il y a quelque chose que j'ai mal compris ...

                                      EDIT : Après avoir fermé le fichier (oui je suis débile) et les instances Excel sur mon ordinateur j'effectue le code lié qui fonctionne à merveille qu'avec les fichiers l'extension .xls, une piste pour que ça fonctionne avec des fichiers XLSX ?

                                      Un grand merci à toi, encore quelques problèmes de boites de dialogues qui s'ouvrent à tout va pour remplacer le fichier, etc ... mais cela fonctionne dans les grandes lignes merci à toi pour ton aide précieuse.

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        3 août 2018 à 12:08:02

                                        >une piste pour que ça fonctionne avec des fichiers XLSX

                                        Donner le type xlOpenXMLWorkbook dans le SaveAs ne fonctionne pas ? Quel est le message d'erreur si il y en a un?

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          3 août 2018 à 13:38:12

                                          Si tu regardes mon tout premier post tu vois ma fonction ExportToExcel() et comme je l'ai dis dans un de mes posts -> Je me rends compte qu'un streamwriter avec un savefile dialog n'enregistre pas réellement le fichier avec l'extension voulu... C'est un fichier lambda au final avec des données dedans et une extension renommée au final.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            3 août 2018 à 14:18:21

                                            Ah tu l'as encore ce truc là ?

                                            Un fichier xlsx c'est pas du texte, c'est une archive zip de fichiers xml décrivant les feuilles, graphes, images, etc... Tu peux l'ouvrir avec 7zip ou autre si tu veux pour voir à quoi ça ressemble.

                                            Pour enregistrer au format xlsx, tu dois passer par l'Interop.

                                            Si tu veux pas t'embêter tu formates le texte que tu enregistres en csv (comma separated values). Tu pourras ensuite ouvrir ton fichier csv avec l'Interop pour faire les traitements que tu veux.

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              3 août 2018 à 15:02:08

                                              Mes utilisateurs n'utilisent en aucun cas des fichier .csv, j'ai essayé tout de même avec le String resultat mais je me retrouve avec du texte et des ; sans séparation , tous dans la colonne A.

                                              Je viens de trouver un nouveau framework pour Excel qui s'apelle Spire.Xls et il a l'air beaucoup plus simple à utliser. Je te donnerai des nouvelles Lundi.

                                              Bon week-end !

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                6 août 2018 à 15:21:27

                                                Bonjour !

                                                J'ai essayé de faire mon export de mon DataGrid sur Excel avec Spire.Xls, sans succès ...

                                                J'ai converti mon DataGrid en un DataTable pour pouvoir récupérer le DataGrid sans faire un copy/paste bêtement, ce qui simplifie également la tâche avec Spire.XLS.

                                                Par la suite dans ma fonction, je définis les propriétés de mon SaveFileDialog. On observe mes lignes de code qui permettent, donc, d'enregistrer un fichier lambda avec l'extension ".xls . J'ai essayé la fonction SaveToFile de plusieurs façons, sans succès. Alors je m'adresse à quelqu'un qui aurait une méthode simple pour : exporter un dataGrid en format XLSX ( Excel version 2013).

                                                Bonne journée !

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  6 août 2018 à 16:44:11

                                                  >J'ai essayé la fonction SaveToFile de plusieurs façons, sans succès

                                                  Tu as suivi ce tuto ? https://www.e-iceblue.com/Tutorials/Spire.XLS/Spire.XLS-Program-Guide/Data-Export-/Import-Export-Datatable-to-Excel-from-Database.html

                                                  En oubliant la partie BDD ça a l'air assez direct, par contre en cherchant quelques minutes j'ai pas trouvé de doc de Spire.XLS, juste des bouts de code, donc je sais pas quel argument il faut passer pour enregistrer en xlsx, mais l'Intellisense le montre peut-être.

                                                  Sinon avec de l'interop y'a pas mal de résultats sur Google, notemment ça qui l'air d'être le plus direct : https://www.codeproject.com/Reference/753207/Export-DataSet-into-Excel-using-Csharp-Excel-Inter

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    7 août 2018 à 0:09:30

                                                    L'interop, c'est caca.

                                                    Il n'y a que des merdes avec.

                                                    Si votre Framework Spire.XLS ne fait pas le taffe, vous pouvez utilisez le Open XML SDK, directement fournit par M$ :

                                                    https://github.com/OfficeDev/Open-XML-SDK

                                                    Ou un autre Framework qui l'utilise.

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                                                      7 août 2018 à 9:45:01

                                                      private void ExportToExcel()
                                                              {
                                                                  dg_test.SelectAllCells(); // Sélection du DataGrid
                                                                  dg_test.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader;
                                                                  ApplicationCommands.Copy.Execute(null, dg_test); // Copie presse-papier
                                                                  dg_test.UnselectAllCells();
                                                                  String result = (string)Clipboard.GetData(DataFormats.CommaSeparatedValue);
                                                      
                                                                  // Conversion DataGrid en DataTable avec la virgule comme séparation
                                                                  string[] Lines = result.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);
                                                                  string[] Fields;
                                                      
                                                                  Fields = Lines[0].Split(new char[] { ',' });
                                                                  int Cols = Fields.GetLength(0);
                                                                  DataTable dt = new DataTable();
                                                                  for (int i = 0; i < Cols; i++)
                                                                      dt.Columns.Add(Fields[i].ToUpper(), typeof(string));
                                                                  DataRow Row;
                                                      
                                                                  for (int i = 1; i < Lines.GetLength(0) - 1; i++)
                                                                  {
                                                                      Fields = Lines[i].Split(new char[] { ',' });
                                                                      Row = dt.NewRow();
                                                                      for (int f = 0; f < Cols; f++)
                                                                      {
                                                                          Row[f] = Fields[f];
                                                                      }
                                                                      dt.Rows.Add(Row);
                                                                  }
                                                                  //fin de la conversion
                                                      
                                                                  //Propriétés pour le SaveFileDialog
                                                                  SaveFileDialog savefiledlg1 = new SaveFileDialog();
                                                                  
                                                                  savefiledlg1.Filter = "xls(*.xls*) |*.xls* | Classeur Excel(*.xlsx) |*.xlsx | Tous(*.*)|*.* | CSV (séparateur: point-virgule) (*.csv)|*.csv* ";
                                                                  savefiledlg1.RestoreDirectory = true;
                                                                  savefiledlg1.DefaultExt = ".xlsx";
                                                                  savefiledlg1.AddExtension = true;
                                                                  savefiledlg1.InitialDirectory = "C:\\Users\\"+ System.Environment.UserName + "\\Desktop";
                                                                  savefiledlg1.Title = "Sauvegardez votre fichier Excel";
                                                      
                                                                  if (savefiledlg1.ShowDialog() == DialogResult.OK)
                                                                  {
                                                                      
                                                                     Sp.Workbook wourbouk = new Sp.Workbook();
                                                                     Sp.Worksheet shit = wourbouk.Worksheets[0];
                                                                     shit.InsertDataTable(dt, true, 1,1); // Methode Spite.Xls pour inésrer une DataTable dans un fichier Excel
                                                      
                                                                     wourbouk.SaveToFile("C:\\Users\\" + System.Environment.UserName + "\\Desktop\\testbouk.xlsx", Sp.ExcelVersion.Version2013);
                                                      
                                                                     System.Windows.MessageBox.Show(" Le DataGrid a été sauvegardé avec succès avec l'extension " + savefiledlg1.Filter + "à l'adresse suivante :" + savefiledlg1.FileName + ".");
                                                      
                                                                     System.Diagnostics.Process.Start("C:\\Users\\" + System.Environment.UserName + "\\Desktop\\testbouk.xlsx");
                                                                  }
                                                                  else
                                                                  {
                                                                      MessageBox.Show("Une erreur inconnue est survenue ou vous avez annulé l'opération de sauvegarde");
                                                                  }
                                                      
                                                              }


                                                      Salut les gars !

                                                      Hier la fatigue commençait à s'installer j'ai dû mal coder ... Spite.XLS fonctionne parfaitement merci pour ton aide bacelar tout de même.

                                                      Très gros merci à Stormweaker qui a pris le temps avec moi d'essayer de résoudre mes problèmes, c'est honorable de ta part.

                                                      Bonne journée tout le monde ! (j'ai lié le code qui fonctionne pour ceux qui veulent, toujours au dessus de mon texte :lol: )

                                                      EDIT : Bon Spire est payant et génère des sheet supplémentaire pour la version d'évaluation, petit problème au niveau de délimitation pour les virgules, points et points virgules. Compliqué !

                                                      -
                                                      Edité par Kadoow 9 août 2018 à 14:32:13

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter

                                                      Documentations-Informations C#-VB(A)-Excel

                                                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                      • Editeur
                                                      • Markdown