Линия
tbl = MyDoc.Tables.Add(myRange, ClassTable.Count(), 3, missing, missing);
выдает исключение во второй раз, когда выполняется с сообщением «Диапазон не может быть удален». Word исключает это исключение, но останавливает дальнейшее выполнение. Добавление в try / catch и установка breakboint помогли бы вам.
Я изменил ваш код следующим образом, чтобы воспроизвести и найти возникшее исключение:
var myRange = Globals.ThisAddIn.Application.ActiveDocument.Range();
foreach (List<List<string>> ClassTable in new List<List<List<string>>> { new List<List<string>> { new List<string> { "A" }, new List<string> { "B" } }, new List<List<string>> { new List<string> { "C" }, new List<string> { "D" } } })
{
// tbl is a "Microsoft.Office.Interop.Word.Table"
// myRange is like MyDoc.Range(ref missing, ref missing)
Microsoft.Office.Interop.Word.Table tbl = null;
try
{
tbl = Globals.ThisAddIn.Application.ActiveDocument.Tables.Add(myRange, ClassTable.Count(), 3);
tbl.Borders.Enable = 1;
int RowCounter = 1;
foreach (var item in ClassTable)
{
int ColumnCounter = 1;
foreach (string str in item)
{
tbl.Cell(RowCounter, ColumnCounter).Range.Text = str;
ColumnCounter++;
}
RowCounter++;
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
}
документы в состоянии MSDN :
Обязательный объект Range. Диапазон, в котором вы хотите, чтобы таблица появилась.
Таблица заменяет диапазон, если диапазон не свернут.
Что оказывается необходимым, так это то, что вы «двигаетесь» до конца диапазона, свернув его. Если вы это сделаете, вы столкнетесь с проблемой другого слова: если у вас есть 2 таблицы сразу после каждого другого слова в документе, они автоматически объединятся в 1 таблицу. Ваш фиксированный код в конечном итоге будет добавлять все больше строк в 1 таблицу и постоянно перезаписывать первые несколько строк значениями. Все это приводит к следующему коду, который должен решить вашу проблему:
var myRange = Globals.ThisAddIn.Application.ActiveDocument.Range();
foreach (List<List<string>> ClassTable in new List<List<List<string>>> { new List<List<string>> { new List<string> { "A" }, new List<string> { "B" } }, new List<List<string>> { new List<string> { "C" }, new List<string> { "D" } } })
{
// tbl is a "Microsoft.Office.Interop.Word.Table"
// myRange is like MyDoc.Range(ref missing, ref missing)
Microsoft.Office.Interop.Word.Table tbl = null;
try
{
tbl = Globals.ThisAddIn.Application.ActiveDocument.Tables.Add(myRange, ClassTable.Count(), 3);
tbl.Borders.Enable = 1;
int RowCounter = 1;
foreach (var item in ClassTable)
{
int ColumnCounter = 1;
foreach (string str in item)
{
tbl.Cell(RowCounter, ColumnCounter).Range.Text = str;
ColumnCounter++;
}
RowCounter++;
}
// Move to the end
myRange.Collapse(Microsoft.Office.Interop.Word.WdCollapseDirection.wdCollapseEnd);
// Now add something behind the table to prevent word from joining tables into one
myRange.InsertParagraphAfter();
// gosh need to move to the end again
myRange.Collapse(Microsoft.Office.Interop.Word.WdCollapseDirection.wdCollapseEnd);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
}
Последнее предупреждение: первая строка в этом сегменте гласит:
var myRange = Globals.ThisAddIn.Application.ActiveDocument.Range();
Добавление таблицы в этот диапазон будет работать, если документ пустой, в противном случае будет выдано то же исключение, поскольку в этом случае мы не находимся в конце. .Collapse () также разрешит его там.