2017-01-28 5 views
0

Ich bin beschäftigt mit einer Anwendung, die Excel-Daten mit einer C# -Anwendung manipuliert.Speichern einer Excel-Arbeitsmappe C#

xlApp = new Excel.Application(); 
      xlWorkbook = xlApp.Workbooks.Open(ConString, 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); 

Bis zu diesem Punkt habe ich die Arbeitsmappe gespeichert haben durch ein einfaches „xlApp.Quit“ diese den Standard bringen würde „Möchten Sie Ihre Änderungen speichern“ -Dialog Sie von jedem Microsoft Office-Produkt zu erhalten .

Allerdings hatte ich ein Problem mit den Arbeitsmappen Daten, die gespeichert wurden, so wurde mir gesagt, die Workbook.Save Methode zu verwenden. Es speichert jetzt die korrekten Daten, aber ich kann den Dateinamen/die Position nicht angeben.

Ich lese über die .SaveCopyAs Methode, ich benutze ein Speichern Datei-Dialog, um den Dateinamen/Speicherort, aber wenn ich push speichern und schließen Sie die Anwendung gibt es keine Datei gefunden werden.

Dies ist die Savefile-Methode.

private void SaveFile() 
    { 
     using (SaveFileDialog Save = new SaveFileDialog()) 
     { 
      Save.Filter = "Excel Files (*.xlsx)|*.xlsx"; 
      Save.InitialDirectory = "C:"; 
      Save.Title = "Save"; 
      if (Save.ShowDialog() == DialogResult.OK) 
      { 
       // Using .SaveCopyAs doesnt save at all 
       xlWorkbook.SaveCopyAs(saveFileDialog1.FileName); 
       xlWorkbook.Saved = true; 
       //Using .Save saves the file, but i cannot specify the location/File name 
       //xlWorkbook.Save(); 
       xlApp.Quit(); 
       ReleaseObject(xlWorksheet); 
       ReleaseObject(xlWorkbook); 
       ReleaseObject(xlApp); 
      } 
     } 
    } 

Nicht sicher, ob dies relevant ist, aber hier ist meine ReleaseObject-Methode.

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(); 
      } 
     } 

Ich habe viele Leute gesehen, ihre SaveCopyAs sparende Methode ist auch nicht sagen, und das ist schon wegen ihnen nicht der Datei einen Namen/Erweiterung geben. Das war das erste, was ich überprüft habe. Dieses Interop-Zeug ist neu für mich, also bitte verzeiht Fehler.

Filename variable

Danke

+1

persönlich für Excel Arbeit, die ich ClosedXML verwenden, sein viel leichter und einfacher zu arbeiten als mit dem COM \ Interop-Objekt. Es lebt hier https://github.com/closedxml/closedxml, und war ursprünglich hier, checken Sie die Dokumentation https://closedxml.codeplex.com/ –

+0

Vor allem stimme ich @SimonPrice - es sei denn, Sie wollen tatsächlich neu berechnen Arbeitsmappe, in diesem Fall könnten Sie mit NetOffice (https://netoffice.codeplex.com/) besser dran sein. Haben Sie die SaveAs-Methode (https://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.workbook.saveas.aspx) ausprobiert? –

Antwort

1

xlWorkbook.SaveAs("TheSavePath") instead of xlWorkbook.SaveCopyAs` Versuchen.

Und für überschreiben Verwendung:

xlWorkbook.SaveAs("TheSavePath", Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookDefault, Type.Missing, Type.Missing, true, false, XlSaveAsAccessMode.xlNoChange, XlSaveConflictResolution.xlLocalSessionChanges, Type.Missing, Type.Missing); 
+0

Dies verursacht eine Ausnahme "system.runtime.interopservices.comexception, die Datei konnte nicht zugegriffen werden". – Demonic217

+0

Dies ist offenbar ein anderes Problem der Berechtigungen. – easy

+0

Versuchen Sie, in einem anderen Pfad zu speichern, in dem Sie in der Vergangenheit nur für Testzugriff gespeichert hatten. – easy

Verwandte Themen