2016-11-25 53 views
2

我創建了VSTO加載項,它將通過REST API將文檔發送到服務器。 我需要發送當前打開的文檔(例如docx作爲文件在MS Office Add-In中獲取當前活動的文檔文件

第一個問題是獲取活動文檔的全名。 如果找到的唯一途徑:

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。當然!

我相信我做錯了,我的目標是可以達到的。 我的問題是:如何在不關閉應用程序的情況下從加載項讀取當前打開的MS Office應用程序文件的文件?

+0

順便說一下,您可以通過使用'Document.FullName'屬性來獲取文檔的全名。 –

回答

3

即使您可以訪問文件ActiveDocument.FullName指向,但不能保證用戶已經保存了對磁盤的所有更改,甚至更糟的是,該文檔仍處於創建狀態,並且從未保存過。

還有一種鮮爲人知的/文件的方式來檢索正在使用由Document對象實現的IPersistFile COM接口的打開文檔的文件。以下示例將文檔保存到指定的位置。發生這種情況時,不會修改文檔的保存狀態,即在打開文檔時獲取文檔的確切版本(而不是先前保存到磁盤),並且用戶以後可能會決定保存文檔的可能修改或不。

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

您可以使用File.Copy(FullName, <some_temp_filename>)複製文件系統上的打開文檔,然後將副本發送到您的REST服務。即使它仍然可以在Word中獨佔閱讀/書寫,它仍然有效。

+0

感謝您的建議,我不知道'File.Copy'可以複製鎖定的文件。但對我而言,這種解決方案也是錯誤的方式。 –