1

我正在尝试使用 Open XML SDK 2.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);
    }

如果有人能给我一个提示,那就太好了。

提前致谢!!

4

2 回答 2

1

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

另一个重要提示 - 不要自己编写 C# 代码,而是使用 Open XML SDK 2.5 Productivity Tool 的文档反射器功能。它可以获取任何文档、文档的任何部分或任何部分中的任何元素,并生成可以在应用程序中使用的有效 C# 代码。您可以在“工具”截屏中找到 Open XML SDK 生产力工具的演示,您可以在这些Open XML 截屏简介中找到该演示。您还应该熟悉其他有趣的工具,包括用于 Visual Studio 2010 的 Open XML Package Editor PowerTool(这是一个至关重要的工具)。您可能还想查看该系列中的其他截屏视频。

在总体上查看 Open XML 上的截屏后,您可能希望在 WordprocessingML 上查看这些截屏

干杯,埃里克

于 2013-06-01T06:24:20.213 回答
0

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

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

            }

希望这对你有用。

于 2013-07-17T06:52:27.297 回答