我正在尝试使用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);
}
如果有人能给我一个提示,那就太好了。
提前致谢!!
答案 0 :(得分:1)
我建议您不要从头开始制作文档,而是从一个空文档开始,然后添加您想要的内容。这是一种更可靠的方法。您可以将二进制文档存储在嵌入式资源中,也可以将文档直接嵌入到C#代码中,如this post所示。
另一个重要提示 - 不使用自己编写C#代码,而是使用Open XML SDK 2.5 Productivity Tool的文档反射器功能。它可以包含任何文档,或文档的任何部分,或任何部分中的任何元素,并生成可在应用程序中使用的有效C#代码。您可以在“工具”屏幕上找到Open XML SDK Productivity Tool的演示,您可以在这些Introduction to Open XML screen-casts中找到它。您还应该熟悉其他有趣的工具,包括Open XML Package Editor PowerTool for Visual Studio 2010(这是一个至关重要的工具)。您可能还想查看该系列中的其他屏幕角色。
在查看Open XML上的屏幕强制转换后,您可能希望查看these screen-casts on WordprocessingML。
干杯,埃里克
答案 1 :(得分: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();
}
希望这适合你。