2010-11-09 9 views
6

Napisałem procedurę, która otworzy plik xls z dysku lokalnego, odświeży dane w nim, a następnie zapisze ponownie. To działa dobrze.Otwieranie arkusza kalkulacyjnego Xls programowo w języku C# z witryny programu SharePoint w trybie odczytu/zapisu

Problem występuje, gdy zastępuję nazwę pliku, aby wskazywała na witrynę programu SharePoint. Otwiera plik w porządku. Odświeża plik, ale kiedy próbuje zapisać plik, zgłasza wyjątek z komunikatem "Nie można zapisać jako ta nazwa. Dokument został otwarty jako tylko do odczytu.". Jeśli spróbuję zapisać plik o innej nazwie, to działa poprawnie.

Czy ktoś wie, czego mi brakuje? Myślę, że to musi mieć jakiś związek z tym, jak otwieram plik. Czy istnieje inny sposób, w jaki mogę wymusić otwarcie pliku w trybie odczytu/zapisu?

private static void RefreshExcelDocument(string filename) 
    { 
     var xls = new Microsoft.Office.Interop.Excel.Application(); 
     xls.Visible = true; 
     xls.DisplayAlerts = false; 
     var workbook = xls.Workbooks.Open(Filename: filename, IgnoreReadOnlyRecommended: true, ReadOnly: false); 
     try 
     { 
      // Refresh the data from data connections 
      workbook.RefreshAll(); 
      // Wait for the refresh occurs - *wish there was a better way than this. 
      System.Threading.Thread.Sleep(5000); 
      // Save the workbook back again 
      workbook.SaveAs(Filename: filename); // This is when the Exception is thrown 
      // Close the workbook 
      workbook.Close(SaveChanges: false); 
     } 
     catch (Exception ex) 
     { 
      //Exception message is "Cannot save as that name. Document was opened as read-only." 
     } 
     finally 
     { 

      xls.Application.Quit(); 
      xls = null; 
     } 
    } 

Bardzo dziękuję z góry za sugestie.

Jonathan

Odpowiedz

7

Niestety, nie można zapisać bezpośrednio do SharePoint za pomocą interfejsu Excel API. Dlatego plik jest otwierany tylko do odczytu - nie jest dozwolony.

Dobrą wiadomością jest to, że jest to możliwe, ale musisz przesłać formularz za pośrednictwem żądania internetowego. Jeszcze lepszą wiadomością jest to, że istnieje sample code on MSDN! W szczególności zawiadomienia metoda PublishWorkbook który wysyła lokalną kopię pliku Excel do serwera poprzez żądanie internetowej:

static void PublishWorkbook(string LocalPath, string SharePointPath) 
{ 
    WebResponse response = null; 

    try 
    { 
     // Create a PUT Web request to upload the file. 
     WebRequest request = WebRequest.Create(SharePointPath); 

     request.Credentials = CredentialCache.DefaultCredentials; 
     request.Method = "PUT"; 

     // Allocate a 1K buffer to transfer the file contents. 
     // The buffer size can be adjusted as needed depending on 
     // the number and size of files being uploaded. 
     byte[] buffer = new byte[1024]; 

     // Write the contents of the local file to the 
     // request stream. 
     using (Stream stream = request.GetRequestStream()) 
     using (FileStream fsWorkbook = File.Open(LocalPath, 
      FileMode.Open, FileAccess.Read)) 
     { 
      int i = fsWorkbook.Read(buffer, 0, buffer.Length); 

      while (i > 0) 
      { 
       stream.Write(buffer, 0, i); 
       i = fsWorkbook.Read(buffer, 0, buffer.Length); 
      } 
     } 

     // Make the PUT request. 
     response = request.GetResponse(); 
    } 
    finally 
    { 
     response.Close(); 
    } 
} 

Przykładowy kod opisuje scenariusz dla wersji tych produktów w 2007 roku, ale inne wersje powinny zachowywać się w ta sama droga.

0

Jak wygląda nazwa pliku nieudanego przykładu? Czy dokumenty używane w SharePoint nie są przechowywane w bazie danych? Czy otrzymuję błędny problem? W przeciwnym razie mógłbym sobie wyobrazić, że plik, który próbujesz zapisać, jest chroniony przed zapisem przez system operacyjny i nie może być modyfikowany.

+0

Adres URL dokumentu wygląda tak: "https: //nazwa_domeny/sites/sitename/Shared%20Documents/filename.xls". Może otworzyć ten plik i zapisać plik w adresie URL takim jak ten, jednak nie można go zapisać w tym samym pliku. Nie powinieneś odwoływać się bezpośrednio do dokumentu w bazie danych, ponieważ Microsoft może zmienić metodę przechowywania dokumentu na noc. –

Powiązane problemy