Делаю выгрузку из 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();
}
Заголовок таблицы тот же. В итоге результат тот же, при объединении ячеек в соседней колонке так же пишет — запрашиваемый номер семейства не существует.
Почему так, не пойму
Объединяйте ячейки используя 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(); //здесь ошибка
С таким примером Вы получите ответ гораздо быстрее.
Продвижение своими сайтами как стратегия роста и независимости