2010-11-09 32 views
6

J'ai écrit une procédure qui va ouvrir un xls à partir d'un disque local, rafraîchir les données et les sauvegarder à nouveau. Cela fonctionne bien.Ouverture d'une feuille de calcul xls par programmation en C# à partir d'un site SharePoint en mode Lecture/Ecriture

Le problème se produit lorsque je remplace le nom de fichier pour pointer vers un site SharePoint. Il ouvre le fichier bien. Actualise le fichier, mais lorsqu'il tente d'enregistrer le fichier, il déclenche une exception avec le message "Impossible d'enregistrer sous ce nom." Le document a été ouvert en lecture seule. ". Si j'essaie de sauvegarder le fichier avec un nom de fichier différent, cela fonctionne correctement.

Est-ce que quelqu'un sait ce qu'il me manque? Je pense que cela doit avoir quelque chose à voir avec la façon dont j'ouvre le dossier. Existe-t-il un autre moyen de forcer l'ouverture du fichier en lecture/écriture?

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

Merci d'avance pour vos suggestions.

Jonathan

Répondre

7

Malheureusement, vous ne pouvez pas enregistrer directement dans SharePoint à l'aide de l'API Excel. C'est pourquoi le fichier est ouvert en lecture seule - ce n'est pas autorisé. Les bonnes nouvelles sont que c'est possible, mais vous devez soumettre le formulaire via une demande Web. Encore mieux, il y a sample code on MSDN! Dans un avis particulier la méthode PublishWorkbook qui envoie une copie locale du fichier Excel au serveur via une requête Web:

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

Le code exemple décrit un scénario pour les versions 2007 de ces produits, mais d'autres versions devraient se comporter dans le de la même façon.

0

À quoi ressemble le nom de fichier d'un exemple défaillant? Les documents utilisés dans SharePoint ne sont-ils pas stockés dans la base de données? Ou est-ce que je me trompe? Sinon, je pourrais imaginer que le fichier que vous essayez de stocker est protégé en écriture par le système d'exploitation et ne peut pas être modifié.

+0

L'URL du document ressemble à "https: //domainname/sites/sitename/Shared%20Documents/filename.xls". Il peut ouvrir ce fichier et enregistrer le fichier dans une URL comme celle-ci, mais il ne peut pas enregistrer dans le même fichier. Vous ne devez pas référencer directement le document dans la base de données car Microsoft peut modifier la méthode de stockage du document pendant la nuit. –