2016-11-25 7 views
2

Ich erstelle VSTO Add-In, die Dokumente über REST API an den Server senden wird. Ich brauche aktuell geöffnetes Dokument (z. B. docx) nur als Datei senden.Aktuelle Dokumentdatei in MS Office-Add-In

Das erste Problem bestand darin, den vollständigen Namen des aktiven Dokuments zu erhalten. Wenn der einzige Weg gefunden:

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

Dieser Code guten Weg auf dem lokalen Laufwerk zurückkehren kann: D:\Docs\Doc1.docx Aber es kann auch HTTP-Pfad zurückkehren in einer Wolke (zB OneDrive) zu dokumentieren: https://d.docs.live.net/xxxxx/Docs\Doc1.docx

Auch wenn es würden nur lokale Dokumente die Datei dieses Dokuments nicht bekommen. Ich habe versucht diesen Code:

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

Und bei lokal gespeicherten Dokument, das ich System.IO.IOException: The process cannot access the file because it is being used by another process bekam. Nicht überraschend.

Und im Falle von Wolke gespeicherten Dokument habe ich System.NotSupportedException: The given path's format is not supported. Natürlich!

Ich glaube, ich mache alles falsch und mein Ziel ist erreichbar. Meine Frage ist: Wie lese Datei des aktuell geöffneten Dokuments in MS Office App von Add-In ohne App zu schließen?

+0

Übrigens können Sie den vollständigen Namen des Dokuments mit der Eigenschaft 'Document.FullName' abrufen. –

Antwort

3

Auch wenn Sie auf die Datei ActiveDocument.FullName Punkte zugreifen können, gibt es keine Garantie, dass der Benutzer bereits alle Änderungen auf der Festplatte gespeichert hat, oder noch schlimmer, das Dokument befindet sich noch im Erstellungszustand und wurde noch nie gespeichert.

Es gibt ein weiteres wenig bekannt/Dokument Weg, um eine Datei eines geöffneten Dokuments, das die IPersistFile COM-Schnittstelle, die durch die Document Objekt implementiert ist, abrufen. Das folgende Beispiel speichert ein Dokument an dem angegebenen Speicherort. Dies geschieht, ohne den Speicherzustand des Dokuments zu ändern, dh Sie erhalten die genaue Version des Dokuments, wie es geöffnet ist (und nicht wie es zuvor auf der Festplatte gespeichert wurde) und der Benutzer kann später noch entscheiden, mögliche Änderungen des Dokuments zu speichern oder nicht.

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

Sie können ein geöffnetes Dokument auf dem Dateisystem kopieren File.Copy(FullName, <some_temp_filename>) verwenden und dann die Kopie an Ihrem REST-Service senden. Dies funktioniert, obwohl es immer noch für exklusives Lesen/Schreiben in Word geöffnet ist.

+0

Danke für den Rat, ich wusste nicht, 'File.Copy' kann gesperrte Dateien kopieren. Aber für meinen Fall ist diese Lösung auch falsch. –

Verwandte Themen