Делаю выгрузку из 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(); //здесь ошибка
С таким примером Вы получите ответ гораздо быстрее.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
У товаров есть категорииПокажите самых дорогих 10 товаров в каждой категории
Есть ячейка "users", которая содержит "1,2,3,4,5"Как проверить Через SELECT, есть ли в этой ячейке цифра 2, например?
В тексте есть следующая группа символов:
OwnerName - это колонка с фамилиями VarcharПри заполнении массива всегда останавливается на самой длинной фамилии (опытным путем вычислил, что более...