2013-08-27 7 views
6

Ich versuche, Daten in Excel zu ändern und zu speichern. Mit dem folgenden Code greife ich auf das Blatt zu, führe Änderungen durch und speichere die Datei. Ich kann die Datei nicht speichern. Hier ist mein Code:Kann nicht speichern Excel-Datei mit C#

Application excel = new Application(); 
     excel.Visible=true; 
     Workbook wb = (Workbook)excel.Workbooks.Open(@"C:\Users\dnyanesh.wagh\Desktop\BookExcel1.xlsx"); 
     Worksheet ws = (Worksheet)wb.Worksheets[1]; 
     ws.Cells[1, 1] = "sagar"; 
     ws.Cells[2, 1] = "sagar"; 
     ws.Cells[3, 1] = "sagar"; 
     wb.Save(); 
     wb.close(); 

Ich erhalte diese Fehlermeldung: „Die Datei mit dem Namen‚BookExcel1.xlsx‘existiert bereits in diesem Ort Haben Sie es ersetzen?“

Also änderte ich den Code zu:

Workbook wb = (Workbook)excel.Workbooks.Open(@"C:\Users\dnyanesh.wagh\Desktop\BookExcel1.xlsx",0, false, 5, "", "", 
      false, XlPlatform.xlWindows, "", true, false, 
      0, true, false, false);); 

Dann Fehler ist: "BookExcel1.xlsx von user_name.open geändert wird als nur lesen". Wenn ich auf die Schaltfläche ‚Abbrechen‘, erhalte ich die Ausnahme oben mit „Ausnahme von HRESULT: 0x800A03EC“

Ich habe auch versucht:

wb.SaveAs(@"C:\Users\dnyanesh.wagh\Desktop\BookExcel1.xlsx"); 
wb.Close(true,null,null); 

Von dass ich den gleichen Fehler erhalten, mit der obigen Datei zeigt die Änderungen.

Kann mir jemand sagen, wie kann ich die Datei mit Änderungen speichern?

+0

Don‘ Ich weiß wirklich, aber nur einen kurzen Gedanken ... bist du sicher, dass es in Ordnung ist, den gleichen Dateipfad mit 'SaveAs' zu verwenden? Normalerweise erstellt dies ein neues Dokument. Gibt es stattdessen eine 'Save()' Funktion? – musefan

+0

Machen Sie es nicht sichtbar. –

+1

Ich sehe nicht, dass Sie die erstellten COM-Objekte freigeben. Vergessen Sie nicht, jedes einzelne Excel-Objekt, das Sie erstellen/verwenden, freizugeben. Wenn Sie eine Fehlermeldung erhalten und die Arbeitsmappe nicht schließen, kann diese geöffnet bleiben, also nur für neue Instanzen. Mehr: Excel ist nicht geschlossen (mit 'excel.Quit()'), so dass Sie viele Excel-Prozesse haben können im speicher ... – Marco

Antwort

1

Dies geschieht, weil die Datei, die ich bereits in Excel-Anwendung geöffnet war zu öffnen versuchte. In meinem Code habe ich die Excel-Anwendung für einige Bedingungen nicht geschlossen. Aus diesem Grund wurde es nur mit Leseberechtigungen geöffnet. Daher konnte ich diese Datei nach dem Update nicht speichern. Um es mit Lese-/Schreibzugriff zu öffnen, müssen Sie zuerst diese Datei schließen. Danach können Sie es öffnen und problemlos Lese- und Schreibvorgänge für die Datei ausführen.

Sie können alle Excel-Anwendungen schließen und sehen, die bereits geöffnet sind durch folgenden Code:

Application excel = (Application)Marshal.GetActiveObject("Excel.Application"); 
Workbooks wbs = excel.Workbooks; 
foreach (Workbook wb in wbs) 
{ 
    Console.WriteLine(wb.Name); // print the name of excel files that are open 
    wb.Save(); 
    wb.Close(); 
} 
excel.Quit(); 

An der Spitze, fügen Sie den folgenden Code und nehmen Bezug auf Microsoft.Office.Interop.Excel

using Microsoft.Office.Interop.Excel; 
using System.Runtime.InteropServices; 
0

Dieser problem ist für rückwärtskompatible Blatt (a .xls) anstelle von .xlsx.

To allow sheets to be opened in pre office 2007 version it can't contain more than 65k rows. You can check the number of rows in your sheet by using ctrl+arrowdown till you hit the bottom. If you try to get a range larger than that number of rows it will create an error

2

Überprüfen Sie, ob Sie bereits einen Excel.exe-Prozess ausgeführt haben. Außerdem sollten Sie die Arbeitsmappe öffnen, damit sie bearbeitet werden kann.

Dieser Code funktioniert:

string txtLocation = Path.GetFullPath(InputFile); 

object _missingValue = System.Reflection.Missing.Value; 
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); 
Excel.Workbook theWorkbook = excel.Workbooks.Open(txtLocation, 
                 _missingValue, 
                 false, 
                 _missingValue, 
                 _missingValue, 
                 _missingValue, 
                 true, 
                 _missingValue, 
                 _missingValue, 
                 true, 
                 _missingValue, 
                 _missingValue, 
                 _missingValue); 

//refresh and calculate to modify 
theWorkbook.RefreshAll(); 
excel.Calculate(); 
theWorkbook.Save(); 
theWorkbook.Close(true); 
excel.Quit();