在MS Office加载项中获取当前活动的文档文件

时间:2016-11-25 10:58:06

标签: c# ms-word ms-office vsto

我创建了VSTO加载项,它将通过REST API将文档发送到服务器。 我需要将当前打开的文档(例如docx)发送为作为文件

第一个问题是获取活动文档的全名。 如果找到了唯一的方法:

Path.Combine(Globals.ThisAddIn.Application.ActiveDocument.Path,
             Globals.ThisAddIn.Application.ActiveDocument.Name)

此代码可以在本地驱动器上返回正确的路径:D:\Docs\Doc1.docx 但它也可以将HTTP路径返回到云中的文档(例如OneDrive):https://d.docs.live.net/xxxxx/Docs\Doc1.docx

即使只有本地文档,我也无法获取此文档的文件。我试过这段代码:

using (var stream = new StreamReader(docFullPath)) { }

如果是本地存储的文档,我得到了System.IO.IOException: The process cannot access the file because it is being used by another process。没有惊喜。

如果是云存储文档,我得到了System.NotSupportedException: The given path's format is not supported。 cource!

我相信我做错了,我的目标是可以实现的。 我的问题是:如何在不关闭App的情况下从加载项读取MS Office App上当前打开文档的文件?

3 个答案:

答案 0 :(得分:3)

即使您可以访问文件ActiveDocument.FullName,也无法保证用户已将所有更改保存到磁盘,或者更糟糕的是,文档仍处于创建状态且从未保存过爱好。

还有另一种鲜为人知的/文档方式来检索使用由IPersistFile对象实现的Document COM接口的打开文档的文件。以下示例将文档保存到指定位置。这种情况发生时不会修改文档的保存状态,即您在打开时获得文档的确切版本(而不是之前已保存到磁盘中),用户以后可能仍然决定保存文档的可能修改或不。

public static void SaveCopyAs(this Document doc, string path)
{
    var persistFile = (System.Runtime.InteropServices.ComTypes.IPersistFile)doc;
    persistFile.Save(path, false);
}

答案 1 :(得分:0)

您可以使用File.Copy(FullName, <some_temp_filename>)在文件系统上复制打开的文档,然后将副本发送到REST服务。即使它仍在Word中进行独家阅读/写作,这仍然有效。

答案 2 :(得分:0)

File.Copy对我不起作用。