我创建了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上当前打开文档的文件?
答案 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对我不起作用。