![](/img/trans.png)
[英]How to get the currently selected tab in office word VSTO add-in?
[英]Get currently active document file in MS Office Add-In
我創建了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
: D:\\Docs\\Doc1.docx
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
。 當然!
我相信我做錯了一切,我的目標是可以實現的。 我的問題是:如何在不關閉App的情況下從外接程序讀取MS Office App上當前打開的文檔的文件?
即使您可以訪問文件ActiveDocument.FullName
指向,也無法保證用戶已經將所有更改保存到磁盤,甚至更糟的是,該文檔仍處於創建狀態並且從未保存過。
還有另一種鮮為人知/已記錄的方法來檢索打開的文檔的文件,該方法使用IPersistFile
COM接口,該接口由Document
對象實現。 以下示例將文檔保存到指定位置。 在不修改文檔的保存狀態的情況下會發生這種情況,即,您在打開文檔時會獲得文檔的確切版本(而不是以前保存到磁盤的版本),並且用戶以后可能仍會決定保存文檔的可能修改或不。
public static void SaveCopyAs(this Document doc, string path)
{
var persistFile = (System.Runtime.InteropServices.ComTypes.IPersistFile)doc;
persistFile.Save(path, false);
}
您可以使用File.Copy(FullName, <some_temp_filename>)
在文件系統上復制打開的文檔,然后將副本發送到REST服務。 即使它仍然可以在Word中進行獨家讀取/寫入,此方法仍然有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.