是否可以使用 Open XML sdk 来操作当前在 Office 应用程序中打开的部分文档(word/ppt)。我知道最简单的方法是使用 VSTO,但它速度慢并且会涉及使用剪贴板插入元素,OXML sdk 更直接且更简单。
如果有人可以发布一些代码示例,那就太好了。
在此先感
谢拉克什
是否可以使用 Open XML sdk 来操作当前在 Office 应用程序中打开的部分文档(word/ppt)。我知道最简单的方法是使用 VSTO,但它速度慢并且会涉及使用剪贴板插入元素,OXML sdk 更直接且更简单。
如果有人可以发布一些代码示例,那就太好了。
在此先感
谢拉克什
是的,可以使用 OpenXML sdk 2 修改打开的 VSTO 文档,然后使用更改后的 xml 更新打开的文档。
http://msdn.microsoft.com/en-us/library/ff191178.aspx
http://code.msdn.microsoft.com/Improve-Automation-415bff13
基本上,您从一个范围中获取 xml,将其视为流,将其打包,使用包上的 sdk,然后通过反转过程将修改后的 xml 插入回去。
那里的智慧是,sdk 的这种常识用法是不可能的。然而,这是错误的。
如下所示:-
//include the namespace
using DocumentFormat.OpenXml.WordProcessing
//Open and manipulate temp.docx
using (WordprocessingDocument myDoc = WordprocessingDocument.Open("temp.docx", true))
{
//Access main part of document
MainDocumentPart mainPart = myDoc.MainDocumentPart;
//Add new comments part to document
mainPart.AddNewPart<WordprocessingCommentsPart>();
//Delete Styles part within document
mainPart.DeletePart(mainPart.StyleDefinitionsPart);
//Iterate through all custom xml parts within document
foreach (CustomXmlPart customXmlPart in mainPart.CustomXmlParts) {
//DO SOMETHING
}
}
此外,您可以使用 LINQ 来避免 foreach 循环。
我能够使用使用 ClosedXML 的 Excel 文档来做到这一点(在将文件作为路径 excelFileName 保存到磁盘之后):
byte[] byteArray = null;
using (var fs = new FileStream(excelFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) {
int numBytesToRead = Convert.ToInt32(fs.Length);
byteArray = new byte[numBytesToRead];
fs.Read(byteArray, 0, numBytesToRead);
}
using (MemoryStream mem = new MemoryStream()) {
mem.Write(byteArray, 0, byteArray.Length);
XLWorkbook wb = new XLWorkbook(mem);
...
}
在我的情况下,我只是在阅读文档并且不会保存它,但是如果需要,您可以将修改后的流写入另一个文件。
显然,如果没有 Sharepoint,您将无法做到这一点。
根据Zeyad Jarabi /..
...您需要一个了解如何获取共享锁的平台(如 SharePoint 或 SkyDrive)。如果没有这个概念,那么应用程序和 SDK 只能获取读或写锁,这会阻止这两种技术访问同一个文件。