Я следующий код используются с словом 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;
Однако, это дает ту же ошибку.
Для какой версии служебного документа это дает ошибку? – Harsh
Не 100% уверены, что вы просите, но это файл .docx, созданный с использованием той же библиотеки interop. –
Если вы записываете макрос при успешном выполнении действий в Word, то сравните базовый синтаксис с тем, что вы используете, можете ли вы увидеть какую-либо разницу в объектах/свойствах/методах? И если вы запустите этот макрос, он успешно выполнит или сгенерирует ошибку (если да, что)? –