【问题标题】:VSTO Office Interop: Manipulating Office XML at Run-TimeVSTO Office 互操作:在运行时操作 Office XML
【发布时间】:2018-05-27 06:39:09
【问题描述】:

使用 Office 的 XML 文件有时是一种快速操作文档的便捷方式。

即搜索 PowerPoint 文件的 ZIP 数据并更改文件中的 XML。

我想知道是否有一种方法可以从 VSTO 加载项中访问和操作文档的(PowerPoint 或其他)XML,并使更改实时反映在当前打开的文档中? (例如,替换字符串时)。

我正在寻找不需要重新打开文档的解决方案。

答案很可能是这是不可能的/不支持的,因为我在 Office Interop API 中找不到官方文档。

【问题讨论】:

    标签: c# com vsto office-interop com-interop


    【解决方案1】:

    这应该可以完成这项工作,但请记住,即使 不需要重新打开文档,文档的全部内容也会重新加载...对于 巨大 strong> 记录它会

    例如,我使用的是 Word 文档

    var wordDocument = app.ActiveDocument;
    var openXmlFormattedStr = wordDocument.Content.WordOpenXML;
    var manipulatedOpenXmlFormattedStr = .....; // do something with the xml
    wordDocument.Content.InsertXML(manipulatedOpenXmlFormattedStr, null);
    

    编辑 2017-12-15: Power Point 和 Excel 互操作不公开对开放 xml 格式的直接访问。唯一的方法是使用 .SaveAs 和适当的 openxml 格式,然后从文件系统中读取内容。

    【讨论】:

    • 非常感谢 - 这似乎适用于 Word - 但我在 PowerPoint API 中找不到类似的属性。您是否会碰巧知道 OpenXML API 是否可以以不同的方式访问?一方面,CustomXMLPart 似乎不是暴露 OpenXML 的原因。
    • 对不起,我没有对该主题进行足够的研究。在阅读了其他几篇文章并播放了一些代码后,事实证明这仅适用于 Word。检查编辑。
    • 谢谢你——这肯定回答了这个问题,也感谢你提到 SaveAs 方法。
    • 对于它的价值,请注意,您可以在任何 Word.Range 上调用 WordOpenXMLInsertXML,因此如果您知道更改的位置,您可以通过缩小重新加载时间来节省到您应用 XML 更改的范围。一种方法可能是首先加载全部内容(如在响应中),但只搜索您希望进行更改的位置(某种隐式只读);然后您可以针对相关段落并执行TargetPara.Range.InsertXML = GetChanges(TargetPara.Range.WordOpenXML)
    • 同样,您也可以通过调用Excel.Range.Value(xlRangeValueXMLSpreadsheet),例如MyWorkbook.ActiveSheet.UsedRange.Value(xlRangeValueXMLSpreadsheet),在Excel 数据表级别访问XML。您仍然需要单独迭代每个工作表,但这已经提供了很多选择。
    猜你喜欢
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 2011-04-15
    • 2010-10-20
    • 2010-11-17
    • 2011-08-23
    • 2014-04-06
    • 2013-06-09
    相关资源
    最近更新 更多