问题描述
我正在使用 Visual Studio 并开发一个 Office加载项。我需要确定相同的形状和图片并替换它们。
我尝试使用 OpenXml 来做到这一点,但似乎无法在使用的文件中对其进行修改。它似乎不能用作Office加载项,因为它不适用于已经打开的文件。
我在互联网上搜索了许多小时,但没有找到一种方法。 请帮助我。
谢谢
解决方法
TL; DR: OpenXML 和 Office加载项(包括 VSTO )是针对不同用例的竞争技术,可能会导致运行时问题如果结合。最好只坚持一个。
我正在...开发Office加载项。我需要确定相同的形状和图片并替换它们。我尝试使用
OpenXml
来执行此操作,但是似乎无法在使用中的文件中对其进行修改。
OpenXML是一种API,用于创建/读取/修改 Office文档(准确地说是Office 2010+),该文档遵循现代XML文档格式,例如 Word 2010 。它是通过直接在文件级别而不是使用COM操纵文档来实现的。实际上,它根本不需要在计算机上安装Word!这使OpenXML成为与Office文档进行交互的轻量级方法。
不幸的是,如果OpenXML(或其他基于文件的方法)都针对同一文档,则不适用于Office加载项(VSTO或其他)。这是因为文档已经加载到说Word中,而Word正在托管您的加载项。任何尝试修改表示已加载文档的基础文件(包括除Word或Word API以外的其他OpenXML文件)的尝试都会遇到以下问题:
违反共享
换一种说法:
- 要运行Office加载项,必须先运行Office应用。这称为托管
- 您的外接程序精心安排的Office文档操作要求首先将文档加载到Office应用中
- 任何外部 Windows进程或进程内(加载项)操作都不能直接 更改基础Office文档文件,而该文件已在Office应用程序中打开。 (加载项可以使用Office API 间接保存到文件中,并要求Office应用保存,尽管通常此类API不会向调用者公开任何原始文件接口,因此以后可能不一样)
该怎么办?
我的建议是:
a)使用纯OpenXML方法并丢弃Office加载项或...
b)使用纯Office加载项(VSTO)方法并丢弃OpenXML代码
考虑到您似乎已经通过OpenXML方法获得了用于形状和图片的代码,也许选项 a)是最好的。