2013-06-28 2 views
4

У меня есть более старый проект, где я хочу открыть документ Word и выполнить поиск и заменить на нем. Он работал раньше, когда у меня была более старая Visual Studio и Office, но теперь у меня проблемы с VS 2012 (с установленным Office 2013).поиск и замена в документах Word через .NET automation

я ссылаться на "Microsoft Word 15.0 Object Library" COM ссылку, и я получаю 3 DLL файлы:

Microsoft.Office.Core 
Microsoft.Office.Interop.Word 
VBIDE 

Мой минимальный код теста:

using Word = Microsoft.Office.Interop.Word; 

... 

object fileName = Path.Combine(System.Windows.Forms.Application.StartupPath, "document.doc"); 

Word.Application wordApp = new Word.Application { Visible = true };       

Word.Document aDoc = wordApp.Documents.Open(ref fileName, ReadOnly: true, Visible: true); 

aDoc.Activate(); 

Word.Find fnd = wordApp.ActiveWindow.Selection.Find; 

fnd.ClearFormatting(); 
fnd.Replacement.ClearFormatting(); 
fnd.Forward = true; 
fnd.Wrap = Word.WdFindWrap.wdFindContinue;        

fnd.Text = "aaa"; 
fnd.Replacement.Text = "bbb"; 

fnd.Execute(Replace: Word.WdReplace.wdReplaceAll); 

работает этот код и документ получает открываемые, но затем это исключение возникает:

System.Runtime.InteropServices.COMException was unhandled 
HelpLink=wdmain11.chm#37373 
HResult=-2146823683 
Message=This command is not available. 
Source=Microsoft Word 
ErrorCode=-2146823683 
StackTrace: 
    at Microsoft.Office.Interop.Word.Find.Execute(Object& FindText, Object& MatchCase, Object& MatchWholeWord, Object& MatchWildcards, Object& MatchSoundsLike, Object& MatchAllWordForms, Object& Forward, Object& Wrap, Object& Format, Object& ReplaceWith, Object& Replace, Object& MatchKashida, Object& MatchDiacritics, Object& MatchAlefHamza, Object& MatchControl) 
    at WordTest.MainForm.btnLaunchWord_Click(Object sender, EventArgs e) in c:\Work\Repos\WordTest\WordTest\Form1.cs:line 38 

Что происходит? У меня есть дополнительный вопрос: если я использую v15.0 сборки Interop (я полагаю, что пришел с моим Office 2013), будет ли работать тот же код на машинах с предыдущими версиями Word, скажем, Office 2010?

ответ

5

Перед заменой текста в документе, изменять ReadOnly ложь в этой строке:

Word.Document aDoc = wordApp.Documents.Open(
    ref fileName, ReadOnly: true, Visible: true); 
+0

СПАСИБО! Я бы никогда не догадался, что ... потому что то же самое работало много лет, и теперь внезапно они изменили его, чтобы быть более строгим, я думаю ... – davidhq

+1

+ Также файл не должен быть доступен только для чтения. ReadOnly: Дополнительный объект. Верно, чтобы открыть документ как доступный только для чтения. Примечание. Этот аргумент не отменяет рекомендуемый параметр только для чтения в сохраненном документе. Например, если документ был сохранен с включенным только для чтения, установка аргумента ReadOnly для False не приведет к тому, что файл будет открыт как чтение/запись. – koprinkov

+0

Спасибо, ребята! Просто нужно проверить, что файл не доступен только для чтения в файловой системе! – CrazyTim

Смежные вопросы