2013-05-27 55 views
1

我正嘗試使用Open XML SDK 2.5在SharePoint 2013中生成一個簡單的docx文件。Open XML SDK 2.5 + SharePoint 2013 - docx-file empty

我的函數成功地在SharePoint庫中生成一個docx文件,但是當我嘗試打開它時,它是空的或損壞的。 我已經嘗試了很多,並使用了我在這裏和網上找到的不同工藝。

protected void generateDoc(string docName) 
    { 
     SPWeb spWeb = SPContext.Current.Web; 

     spWeb.AllowUnsafeUpdates = true; 
     spWeb.Lists.IncludeRootFolder = true; 

     SPList docLib = spWeb.Lists["test"]; 
     string fileUrl = Microsoft.SharePoint.Utilities.SPUtility.GetFullUrl(SPContext.Current.Site, "/test/" + docName); 

     SPSecurity.CodeToRunElevated elevatedSubmit = new SPSecurity.CodeToRunElevated(delegate 
     { 
      // MediaStream erstellen 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       // Create a Wordprocessing document. 
       using (WordprocessingDocument package = WordprocessingDocument.Create(ms, WordprocessingDocumentType.Document)) 
       { 
        // Add a new main document part. 
        package.AddMainDocumentPart(); 
        // Create the Document DOM. 
        package.MainDocumentPart.Document = new Document(); 
        package.MainDocumentPart.Document.Append(new Body()); 
        package.MainDocumentPart.Document.Append(
          new Paragraph(
          new Run(
           new Text("TEST")))); 

        ms.Position = 0; 
        byte[] content = ms.ToArray(); 
        package.MainDocumentPart.Document.Save(); 

        SPFile file = docLib.RootFolder.Files.Add(fileUrl, ms, true); 
        file.Update(); 
       } 
      } 
     }); 
     SPSecurity.RunWithElevatedPrivileges(elevatedSubmit); 
    } 

這將是很好,如果有人可以給我一個提示。

在此先感謝!

回答

0

其實你正試圖書面之前閱讀的內容。所以它不會包含任何數據。 刪除並使用將第二個中的以下代碼添加到第一個的末尾,使用

ms.Position = 0; 
byte[] content = ms.ToArray(); 
SPFile file = docLib.RootFolder.Files.Add(fileUrl, ms, true); 
file.Update(); 

獲取內容到字節數組。 修改後的代碼將是

 using (MemoryStream ms = new MemoryStream()) 
      { 
       // Create a Wordprocessing document. 
       using (WordprocessingDocument package = WordprocessingDocument.Create(ms, WordprocessingDocumentType.Document)) 
       { 
        // Add a new main document part. 
        package.AddMainDocumentPart(); 
        // Create the Document DOM. 
        package.MainDocumentPart.Document = new Document(); 
        package.MainDocumentPart.Document.Append(new Body()); 
        package.MainDocumentPart.Document.Body.Append(
          new Paragraph(
          new Run(
           new Text("TEST")))); 

        //package.MainDocumentPart.Document.Save(); 
        package.MainDocumentPart.Document.Save(); 

       } 
       ms.Position = 0; 
       byte[] content = ms.ToArray();SPFile file = docLib.RootFolder.Files.Add(fileUrl, ms, true); 
file.Update(); 

      } 

希望這對你的作品。

1

我建議您不要從頭開始製作文檔,而應從空白文檔開始並添加所需的內容。這是一種更可靠的方法。您可以將二進制文檔存儲在嵌入式資源中,也可以將文檔直接嵌入到C#代碼中,如this post中所示。

另一個重要提示 - 不是自己編寫C#代碼,而是使用Open XML SDK 2.5生產力工具的文檔反射器功能。它可以接受任何文檔,文檔的任何部分或任何部分中的任何元素,並生成可在您的應用程序中使用的有效C#代碼。您可以在「工具」屏幕中找到Open XML SDK生產力工具演示,您可以在這些Introduction to Open XML screen-casts中找到。你還應該熟悉其他有趣的工具,包括Open XML Package Editor PowerTool for Visual Studio 2010(這是一個重要的工具)。您可能還想查看該系列中的其他屏幕演示。

在查看通常對Open XML的屏幕截圖之後,您可能需要查看these screen-casts on WordprocessingML

乾杯,埃裏克

+0

謝謝。我將檢查Power Tool和存儲二進制文件的方式。它看起來很有趣。我知道我可以使用Productivity Tool來自動生成Open XML部分,但是如果我只用「Test」--Text將它用於文檔,它會生成大量的代碼。我只是想寫一個乾淨而小巧的解決方案,所以我可以肯定我明白它是如何工作的。 – user2145219