gloomkolomna
@gloomkolomna
c#, WPF

Как передать данные из datagridview в Excel / Word?

Здравствуйте.
У меня есть шаблон в word, где прописаны метки, я открываю этот шаблон:

//создание документа
Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
//загрузка документа
Microsoft.Office.Interop.Word.Document doc = null;

string patchto = System.Windows.Forms.Application.StartupPath + "//tmpl//";

object fileName = patchto + "report_client.doc";
object falseValue = false;
object trueValue = true;
object missing = Type.Missing;

doc = app.Documents.Open(ref fileName, ref missing, ref trueValue,
                    ref missing, ref missing, ref missing, ref missing, ref missing,
                    ref missing, ref missing, ref missing, ref missing, ref missing,
                    ref missing, ref missing, ref missing);

Далее нахожу метку и заменяю ее на данные из программы:
//Очищаем параметры поиска
app.Selection.Find.ClearFormatting();
app.Selection.Find.Replacement.ClearFormatting();
//Задаём параметры замены и выполняем замену.
object findTextFIO = "$FIO$";
object replaceWithFIO = fio;
object replaceFIO = 2;

app.Selection.Find.Execute(ref findTextFIO, ref missing, ref missing, ref missing,
                        ref missing, ref missing, ref missing, ref missing, ref missing,
                        ref replaceWithFIO, ref replaceFIO, ref missing, ref missing, ref missing, ref missing);

Все отрабатывает замечательно.

Вопрос: как мне быть с данными из datagridview, надо передать все данные (как понимаю, циклом) в одну метку, чтобы развернулась таблица?
Word или Excel - не принципиально.

P.S.: Вот пример шаблона: 183b565e5d0c43f6a8b79573a4aba622.png

Метка $DGV_TABLE$ - куда следует заполнить данные.
  • Вопрос задан
  • 9000 просмотров
Решения вопроса 1
gloomkolomna
@gloomkolomna Автор вопроса
c#, WPF
Решил вот так:
xl = new Microsoft.Office.Interop.Excel.Application();
wBook = (Microsoft.Office.Interop.Excel._Workbook)xl.Workbooks.Open(excelTemplatePath, false, false, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
wSheet = (Microsoft.Office.Interop.Excel._Worksheet)wBook.ActiveSheet;

// с какой строки начинаем вставлять данные из dgv
int iRowCount = 11;

for (int i = 0; i < dgv.Rows.Count; i++)
{
   wSheet.Cells[iRowCount, 1] = dgv.Rows[i].Cells[0].Value.ToString();
   wSheet.Cells[iRowCount, 2] = dgv.Rows[i].Cells[1].Value.ToString();
   wSheet.Cells[iRowCount, 3] = dgv.Rows[i].Cells[2].Value.ToString();
   wSheet.Cells[iRowCount, 4] = dgv.Rows[i].Cells[3].Value.ToString();

   iRowCount++;

   // Добавляем строчку ниже
   var cellsDRnr = wSheet.get_Range("A" + iRowCount, "A" + iRowCount);
   cellsDRnr.EntireRow.Insert(-4121, m_objOpt);
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
bodrov
@bodrov
Добрый день.

В метку писать таблицу не получится. Можно обратиться непосредственно к таблице в документе примерно так:
Microsoft.Office.Interop.Word.Table table = doc.Tables[1];
Microsoft.Office.Interop.Word.Row row = null;
foreach (string item in collection)
{
                row = table.Rows.Add(ref missing);
                table.Cell(row.Index, 1/*номер столбца*/).Range.Text = item;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы