2013-08-27 14 views
6

Próbuję zmodyfikować i zapisać dane w programie Excel. Za pomocą poniższego kodu uzyskuję dostęp do arkusza, wykonuję modyfikacje, a następnie zapisuję plik. Nie mogę zapisać pliku. Tu jest mój kodu:Nie można zapisać pliku Excel przy użyciu 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(); 

Otrzymuję ten błąd: „plik o nazwie«BookExcel1.xlsx»już istnieje w tym miejscu Czy chcesz go zastąpić?”

Więc zmieniłem kod do:

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

Następnie błąd brzmi: „BookExcel1.xlsx jest modyfikowana przez user_name.open jako tylko do odczytu”. Jeśli I kliknij „Anuluj”, otrzymuję wyjątek powyżej z „wyjątek od HRESULT: 0x800A03EC”

Próbowałem również:

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

Od że otrzymuję ten sam błąd, z powyższego pliku pokazano modyfikacje.

Czy ktoś może mi powiedzieć, w jaki sposób mogę zapisać plik z modyfikacjami?

+0

Don” t naprawdę wiesz, ale tylko szybka myśl ... czy jesteś pewien, że można używać tej samej ścieżki pliku z 'SaveAs'? Zwykle tworzy to nowy dokument. Czy istnieje funkcja 'Save()', której można użyć? – musefan

+0

Nie należy go pokazywać. –

+1

Nie widzę, żebyś zwalniał obiekty COM utworzone. Pamiętaj, aby zawsze zwolnić każdy pojedynczy obiekt Excel, który utworzysz/wykorzystasz. Jeśli pojawi się błąd i nie zamykamy skoroszytu, to może pozostać otwarte, więc tylko do odczytu dla nowych instancji ... Więcej: Excel nie jest zamknięty (używając 'excel.Quit()'), dzięki czemu można mieć wiele procesów Excel w pamięci ... – Marco

Odpowiedz

1

Dzieje się tak, ponieważ plik starałem się otworzyć już otwarty w aplikacji Excel. W moim kodzie nie zamykałem aplikacji Excel pod pewnymi warunkami. Właśnie dlatego otwierał go z uprawnieniami tylko do odczytu. Tak więc nie mogłem zapisać tego pliku po aktualizacji. Aby otworzyć go za pomocą odczytu i zapisu, musisz najpierw zamknąć ten plik. Następnie można go otworzyć i łatwo wykonać operacje odczytu i zapisu na pliku.

Można zamknąć i zobaczyć wszystkie aplikacje Excel, które są już otwarte za pomocą następującego kodu:

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

Na szczycie, dodaj poniższy kod i zrobić odniesienie do Microsoft.Office.Interop.Excel

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

Ten problem jest przeznaczony dla arkusza zgodnego z poprzednimi wersjami (a .xls) zamiast .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

Sprawdź, czy nie masz jeszcze uruchomionego procesu Excel.exe. Należy również otworzyć skoroszyt, aby można go było edytować.

Ten kod działa:

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(); 
Powiązane problemy