Ошибка при объединении ячеек в Word. COMException: Запрашиваемый номер семейства не существует

102
14 января 2021, 06:10

Делаю выгрузку из datagridview

в документ Word

с помощью этого кода:

string num = null;
int y = 0;
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
    tbl.Rows.Add(ref missing);//Добавляем в таблицу строку.
    if (num == null)
    {
        wordDocument.Range(tbl.Cell(i + 2, 2).Range.Start, tbl.Cell(i + 2, 2).Range.End).Text = dataGridView1.Rows[i].Cells["Column2"].Value.ToString();
        num = dataGridView1.Rows[i].Cells["Column2"].Value.ToString();
    }
    else
    {
        if (num == dataGridView1.Rows[i].Cells["Column2"].Value.ToString())
        {
            y++;
            //тут он не может найди запрашиваемый номер семейства
            wordDocument.Range(tbl.Cell(i + 2 - y, 1).Range.Start, tbl.Cell(i + 2, 1).Range.End).Cells.Merge();
            //объединение второй колонки
            wordDocument.Range(tbl.Cell(i + 2 - y, 2).Range.Start, tbl.Cell(i + 2, 2).Range.End).Cells.Merge();
        }
        else
        {//если нет, то просто заполняем данными
            wordDocument.Range(tbl.Cell(i + 2, 1).Range.Start, tbl.Cell(i + 2, 1).Range.End).Text = dataGridView1.Rows[i].Cells["Column1"].Value.ToString();
            wordDocument.Range(tbl.Cell(i + 2, 2).Range.Start, tbl.Cell(i + 2, 2).Range.End).Text = dataGridView1.Rows[i].Cells["Column2"].Value.ToString();
            num = dataGridView1.Rows[i].Cells["Column2"].Value.ToString();
            y = 0;
        }
    }
    //заполняем остальные колонки данными
    wordDocument.Range(tbl.Cell(i + 2, 3).Range.Start, tbl.Cell(i + 2, 3).Range.End).Text = dataGridView1.Rows[i].Cells["Column3"].Value.ToString();
    wordDocument.Range(tbl.Cell(i + 2, 4).Range.Start, tbl.Cell(i + 2, 4).Range.End).Text = dataGridView1.Rows[i].Cells["Column4"].Value.ToString();
    wordDocument.Range(tbl.Cell(i + 2, 5).Range.Start, tbl.Cell(i + 2, 5).Range.End).Text = stepennn.ShowSubText(dataGridView1.Rows[i].Cells["Column5"].Value.ToString(), dataGridView1.Rows[i].Cells["Column6"].Value.ToString());
    wordDocument.Range(tbl.Cell(i + 2, 6).Range.Start, tbl.Cell(i + 2, 6).Range.End).Text = dataGridView1.Rows[i].Cells["Column6"].Value.ToString();
    wordDocument.Range(tbl.Cell(i + 2, 7).Range.Start, tbl.Cell(i + 2, 7).Range.End).Text = dataGridView1.Rows[i].Cells["Column7"].Value.ToString();
}

Делаю объединение строк в первой и во второй колонке. Если убрать объединение ячеек в первой колонке, то всё работает как надо. Во второй колонке объединение происходит нормально, а на первой происходит ошибка - Запрашиваемый номер семейства не существует. По логике всё должно работать, но чё то не могу додумать что не так

На третьем цикле происходит ошибка

Маленький пример

private void button1_Click(object sender, EventArgs e)
{
    Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application();
    var doc =word.Documents.Open( @"C:\\111.docx", ReadOnly: true);
    word.Visible = true; 
    object missing = Type.Missing;
    Microsoft.Office.Interop.Word.Table tbl = word.ActiveDocument.Tables[1];
    tbl.Borders.Enable = 1;
    tbl.Rows.Add(ref missing);//Добавляем в таблицу строку
    tbl.Rows.Add(ref missing);//Добавляем в таблицу строку
    tbl.Rows.Add(ref missing);//Добавляем в таблицу строку
    tbl.Rows.Add(ref missing);//Добавляем в таблицу строку
    tbl.Rows.Add(ref missing);//Добавляем в таблицу строку
    doc.Range(tbl.Cell(2, 2).Range.Start, tbl.Cell(4, 2).Range.End).Cells.Merge();
    doc.Range(tbl.Cell(2, 3).Range.Start, tbl.Cell(3, 3).Range.End).Cells.Merge();
}

Заголовок таблицы тот же. В итоге результат тот же, при объединении ячеек в соседней колонке так же пишет — запрашиваемый номер семейства не существует.

Почему так, не пойму

Answer 1

Объединяйте ячейки используя Cell.Merge:

//первая колонка
tbl.Cell(i + 2 - y, 1).Merge(tbl.Cell(i + 2, 1));
//вторая колонка
tbl.Cell(i + 2 - y, 2).Merge(tbl.Cell(i + 2, 2));

Вы пытаетесь выделять диапазон не в таблице, а в документе Word и объединять все ячейки в нем. Ошибка возникает при вызове метода Merge. Видимо диапазон некорректно отрабатывает.

Немного о примере

Ошибка происходит при объединении ячеек. Поэтому первый шаг при построении примера выполнить эту операцию отдельно от остальной логики. Для этого создадим документ в котором будет таблица с одной ячейкой и попробуем объединить:

var word = new Application();
var doc = word.Documents.Open(@"C:\temp\111.docx");
word.Visible = true;
var tbl = word.ActiveDocument.Tables[1];
tbl.Rows.Add();//Добавляем в таблицу строку.
doc.Range(tbl.Cell(1, 1).Range.Start, tbl.Cell(2, 1).Range.End).Cells.Merge(); 

Этот код приведет к ошибке и мы уже получили легковоспроизводимый пример который можно запустить в консольном приложении. Но его можно улучшить. Для этого можно уточнить какое именно свойство/метод вызывает исключение. Сделать это можно прочитав трассировку стека по ошибке:

StackTrace:
   at Microsoft.Office.Interop.Word.Cells.Merge()
   at WordMergeCells.Program.Main(String[] args) 

Видно, что ошибка происходит в методе Merge. Выделим это в примере:

var cells = doc.Range(tbl.Cell(1, 1).Range.Start, tbl.Cell(2, 1).Range.End).Cells;
cells.Merge(); //здесь ошибка

Это уже будет хороший пример, но при желании и его можно улучшить. Например, в нем мы обращаемся к внешнему документу Word. Его легко создать, но будет еще проще если он будет создаваться в коде:

var word = new Application { Visible = true };
var doc = word.Documents.Add();
var tbl = doc.Tables.Add(doc.Range(), 2, 1);
tbl.Borders.Enable = 1;
var cells = doc.Range(tbl.Cell(1, 1).Range.Start, tbl.Cell(2, 1).Range.End).Cells;
cells.Merge(); //здесь ошибка

С таким примером Вы получите ответ гораздо быстрее.

READ ALSO
Вывод топ 10 в каждой категории

Вывод топ 10 в каждой категории

У товаров есть категорииПокажите самых дорогих 10 товаров в каждой категории

87
Проверка на точное совпадение mysql

Проверка на точное совпадение mysql

Есть ячейка "users", которая содержит "1,2,3,4,5"Как проверить Через SELECT, есть ли в этой ячейке цифра 2, например?

111
Получить список слов через карманы в регулярном выражении

Получить список слов через карманы в регулярном выражении

В тексте есть следующая группа символов:

107
При получении данных из MS SQL sqlsrv данные &ldquo;varchar&rdquo; длиннее 16-17 символов не отдаются

При получении данных из MS SQL sqlsrv данные “varchar” длиннее 16-17 символов не отдаются

OwnerName - это колонка с фамилиями VarcharПри заполнении массива всегда останавливается на самой длинной фамилии (опытным путем вычислил, что более...

91