簡體   English   中英

在MS Office加載項中獲取當前活動的文檔文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM