打开XMLSDK2.5+;SharePoint 2013-docx文件为空

打开XMLSDK2.5+;SharePoint 2013-docx文件为空,sharepoint,openxml,openxml-sdk,sharepoint-2013,Sharepoint,Openxml,Openxml Sdk,Sharepoint 2013,我正在尝试使用OpenXMLSDK2.5在SharePoint 2013中生成一个简单的docx文件 我的函数在SharePoint库中成功生成了一个docx文件,但当我尝试打开它时,它是空的或已损坏。 我已经尝试了很多,使用了我在这里和网络上找到的不同技术 protected void generateDoc(string docName) { SPWeb spWeb = SPContext.Current.Web; spWeb.AllowUnsaf

我正在尝试使用OpenXMLSDK2.5在SharePoint 2013中生成一个简单的docx文件

我的函数在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);
    }
如果有人能给我一个提示就好了


提前谢谢

我建议您不要从头开始制作文档,而是从一个空文档开始,并向其中添加您想要的内容。这是一种更加可靠的方法。您可以将二进制文档存储在嵌入式资源中,也可以将文档直接嵌入C#代码中,如中所示

另一个重要提示——不要自己编写C代码,而是使用OpenXMLSDK2.5生产力工具的文档反射功能。它可以获取任何文档、文档的任何部分或任何部分中的任何元素,并生成可在应用程序中使用的有效C#代码。您可以在“工具”屏幕上找到OpenXMLSDK生产力工具的演示。您还应该熟悉其他有趣的工具,包括(这是一个非常重要的工具)。您可能还想查看该系列中的其他屏幕播放

通常,在打开XML查看屏幕强制转换后,您可能希望查看


干杯,Eric

我建议您不要从头开始制作文档,而是从一个空文档开始,并将您想要的内容添加到其中。这是一种更加可靠的方法。您可以将二进制文档存储在嵌入式资源中,也可以将文档直接嵌入C#代码中,如中所示

另一个重要提示——不要自己编写C代码,而是使用OpenXMLSDK2.5生产力工具的文档反射功能。它可以获取任何文档、文档的任何部分或任何部分中的任何元素,并生成可在应用程序中使用的有效C#代码。您可以在“工具”屏幕上找到OpenXMLSDK生产力工具的演示。您还应该熟悉其他有趣的工具,包括(这是一个非常重要的工具)。您可能还想查看该系列中的其他屏幕播放

通常,在打开XML查看屏幕强制转换后,您可能希望查看


干杯,埃里克

事实上,你正在试着在内容写出来之前阅读它。所以它不会包含任何数据。 使用删除并将以下代码从第二个放到第一个的末尾

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

            }

希望这对您有用。

实际上,您正在尝试在内容被写入之前阅读它。所以它不会包含任何数据。 使用
删除并将以下代码从第二个放到第一个的末尾

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

            }

希望这对您有用。

谢谢。我将检查电源工具和存储二进制文件的方法。看起来很有趣。我知道我可以使用生产力工具自动生成开放XML部分,但如果我将其用于只包含“测试”文本的文档,它将生成大量代码。我只是想写一个简洁的小解决方案,这样我就可以确定我了解它是如何工作的。谢谢。我将检查电源工具和存储二进制文件的方法。看起来很有趣。我知道我可以使用生产力工具自动生成开放XML部分,但如果我将其用于只包含“测试”文本的文档,它将生成大量代码。我只是想写一个简洁、小的解决方案,这样我就可以确信我了解它是如何工作的。