2015-11-30 1 views
1

Я следующий код используются с словом 2016 года установлен, ссылки Microsoft Word 16.0 Object Library:Изменение Сноска нумерация не выполняется для некоторых текстовых документов с Interop

private void RefreshFootnoteNumbering(FileManagement.FileManager FileManager) 
{ 
    Console.WriteLine(DateTime.Now.ToString() + " Refreshing footnotes DOCX"); 

    // Opening and saving in word generates the required element 
    var Word = GetWordApp(); 
    try 
    { 
     var DocxPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Path.ChangeExtension(FileManager.HtmlFileLocation, "docx")); 
     Console.WriteLine(DateTime.Now.ToString() + "\tOpening document"); 
     var Doc = GetWordDoc(Word, DocxPath); 
     try 
     { 
      // Fails on these lines below (both cause the same exception) 
      Doc.Footnotes.NumberingRule = InteropWord.WdNumberingRule.wdRestartPage; 
      Doc.Footnotes.Location = InteropWord.WdFootnoteLocation.wdBottomOfPage; 

      Doc.SaveAs2(DocxPath, InteropWord.WdSaveFormat.wdFormatXMLDocument, AddToRecentFiles: false, EmbedTrueTypeFonts: true); 
     } 
     finally 
     { 
      Doc.Close(); 
      Doc = null; 
     } 
    } 
    finally 
    { 
     Word.Quit(); 
     Word = null; 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
    } 
} 

Это работает для большинства документов, однако для некоторых я получаю следующее исключение:

System.Runtime.InteropServices.COMException was unhandled 
    ErrorCode=-2146823680 
    HResult=-2146823680 
    HelpLink=wdmain11.chm#37376 
    Message=Value out of range 
    Source=Microsoft Word 
    StackTrace: 
     at Microsoft.Office.Interop.Word.Footnotes.set_NumberingRule(WdNumberingRule prop) 

Другие функции Interop (перебор/манипулируя полями, секцию и т.д.) работают нормально, это, кажется, просто изменяя сноски таким образом, что есть проблема. Изменение их изнутри самого Слова прекрасно работает.

Неужели кто-нибудь сталкивался с этой проблемой раньше? Любая работа вокруг или альтернативы?


Я попытался записи макроса, и он дал этот код VBA:

With ActiveDocument.Range(Start:=ActiveDocument.Content.Start, End:= _ 
    ActiveDocument.Content.End).FootnoteOptions 
    .Location = wdBottomOfPage 
    .NumberingRule = wdRestartContinuous 
    .StartingNumber = 1 
    .NumberStyle = wdNoteNumberStyleArabic 
    .NumberingRule = wdRestartPage 
    .LayoutColumns = 0 
End With 

Если я запускаю этот макрос, я получаю ту же ошибку (значение вне диапазона, номер ошибки 4608) на линии .Location, запускаюсь ли я из отладчика или просто просматриваю макросы -> run.

Я также попытался перевести, что VBA в C# код:

var Options = Doc.Range(Doc.Content.Start, Doc.Content.End).FootnoteOptions; 

Options.Location = InteropWord.WdFootnoteLocation.wdBottomOfPage; 
Options.NumberingRule = InteropWord.WdNumberingRule.wdRestartPage; 

Однако, это дает ту же ошибку.

+0

Для какой версии служебного документа это дает ошибку? – Harsh

+0

Не 100% уверены, что вы просите, но это файл .docx, созданный с использованием той же библиотеки interop. –

+0

Если вы записываете макрос при успешном выполнении действий в Word, то сравните базовый синтаксис с тем, что вы используете, можете ли вы увидеть какую-либо разницу в объектах/свойствах/методах? И если вы запустите этот макрос, он успешно выполнит или сгенерирует ошибку (если да, что)? –

ответ

1

Все еще не уверены в конкретной причине (возможно, что-то еще в моем коде, создающем разные разделы); все еще неясно, почему это сработало, когда слово записало макрос, но не при его запуске.

В любом случае мне удалось изменить код C# ниже, что, похоже, делает работу и фактически работает!

foreach(InteropWord.Footnote FootNote in Doc.Footnotes) 
{ 
    FootNote.Reference.FootnoteOptions.NumberingRule = InteropWord.WdNumberingRule.wdRestartPage; 
    FootNote.Reference.FootnoteOptions.Location = InteropWord.WdFootnoteLocation.wdBottomOfPage; 
} 
+0

Интересно. Похож, что 2016 год менее «прощает» о том, как вы обращаетесь к объекту (объектам), на который нужно повлиять. Это будет полезной информацией - спасибо, что нашли время, чтобы опубликовать результаты ваших исследований! Не забудьте нажать галочку под счетчиком голосов, чтобы отметить ее как ответ :-) –

+0

Да, стыдно, что сообщение об ошибке не более подробное, но о хорошо. Я соглашусь, но пока не могу ответить на свой вопрос. –

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

  • Нет связанных вопросов^_^