2012-03-28 79 views
3

所有实例和实现我见过使用一些喜欢类型的代码:使用Open XML读取已打开的Word文档?

//filePath is some path to a docx file 
using (WordprocessingDocument wpd = WordprocessingDocument.Open(filePath, true)) 
{ 
    //Do stuff here 
} 

这需要您的文件被关闭。我希望能够在已经打开的文档上使用Open XML SDK操作,因为我想在用户正在主动查看文档时做些事情,而且我不一定要保存它。

这可能吗?我知道Word可能会锁定文档,如果它是开放的,所以你无法打开文件(即使是只读)。有没有办法解决它?

如果我能以某种方式在已经打开的文档上使用Open XML SDK,那将会非常好。我有一个想法是临时保存已打开的文件,并在临时文件上运行OpenXML,并以某种方式与使用Office API的现有文档进行协调。没有想到通过这种方法,但它不是我想要做的理想方式。

我也知道在Word API上通过执行Word.Range.XML来返回XML字符串的属性。但是,我不确定如何将此字符串值加载到SDK,以便我可以利用其方法来帮助我。

+0

当一个文件是只读方式打开的,它是开放的只读和Word(和大多数其他Office应用程序)做确实打开的文件,在该模式下。 AFAIK,不可能告诉操作系统只读应该被忽略。 (这其实很好 - 你能想象出能够说出“Gee”的可能影响,忽略有人说他们想要锁定文件以允许其他人以只读方式访问,并且无论如何都允许我访问。“?) – 2012-03-28 02:19:42

+0

是啊,我完全理解为什么它被锁定。我想我有一些想法,因为我们可以通过Word API操纵文件,我可以用Open XML做同样的事情,但那是错误的。 – Shark 2012-03-28 02:33:47

回答

1
+0

谢谢,这正是我正在寻找的。看起来,混合方法(Office API和Open XML)是唯一的方法 – Shark 2012-03-28 15:00:26

+0

Atul,我注意到代码执行Document.Range()。InsertXML来覆盖新的值。您是否知道Document.Range()会不包括其范围内的页眉/页脚? – Shark 2012-03-28 15:49:09

+0

@Shark,你是否有用'Document.Range()。InsertXML'编写页眉/页脚的解决方案? – Scoregraphic 2012-04-24 14:15:38

10

您可以打开Word文档Open XML SDK,并在办公室打开文件。 您应该首先打开FileStream,然后打开指定此流的Word文档。这里有一个例子:

using (Stream stream = new FileStream(file,FileMode.Open,FileAccess.Read,FileShare.ReadWrite)) 
{ 
using (WordprocessingDocument wpd = WordprocessingDocument.Open(stream, false)) 
{ 
    .... 
} 
} 
+0

也适用于SpreadsheetDocument。谢谢。 – BlazingFrog 2013-10-23 22:16:15