Долго формируется таблица в Word - C#
Формулировка задачи:
Экспортирую данные из DataGridView в таблицу документе Word. Почему то очень долго формируется таблица. Подскажите пожалуйста, где ошибка. Никак не могу разобраться. 20 страниц формируются где-то 5 минут.
Вот код.
Листинг программы
- object oEndOfDoc = "\\endofdoc";
- object oMissing = System.Reflection.Missing.Value;
- FileInfo fn = new FileInfo("e.doc"); //Копируем файл образца
- string _filename = Data.SelectedProject + ".doc";
- string _dir_filename = (Environment.CurrentDirectory + "\\" + savedir + "\\" + _filename);
- fn.CopyTo(_dir_filename, true); //копируем в папку savedir
- //Создаём новый Word.Application
- Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
- //Загружаем документ
- Microsoft.Office.Interop.Word.Document doc = null;
- object fileName = _dir_filename;
- object falseValue = false;
- object trueValue = false;
- 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);
- //Указываем таблицу в которую будем помещать данные (таблица должна существовать в шаблоне документа!)
- Microsoft.Office.Interop.Word.Table tbl = app.ActiveDocument.Tables[1];
- Object start = 451;
- Object end = 451;
- Word.Range wordrange = doc.Range(ref start, ref end);
- Object defaultTableBehavior = Word.WdDefaultTableBehavior.wdWord9TableBehavior;
- Object autoFitBehavior = Word.WdAutoFitBehavior.wdAutoFitWindow;
- //Добавляем таблицу и получаем объект wordtable
- Word.Table wordtable = doc.Tables.Add(wordrange, (dataGridView1.RowCount), 12,
- ref defaultTableBehavior, ref autoFitBehavior);
- try
- {
- for (int i = 1; i < (dataGridView1.RowCount - 1); i++)
- {
- wordtable.Cell(i, 1).Range.Text = dataGridView1.Rows[i].Cells[1].Value.ToString() +". " + dataGridView1.Rows[i].Cells[14].Value.ToString();
- wordtable.Cell(i, 2).Range.Text = dataGridView1.Rows[i].Cells[2].Value.ToString() + "/" + dataGridView1.Rows[i].Cells[3].Value.ToString();
- wordtable.Cell(i, 3).Range.Text = dataGridView1.Rows[i].Cells[19].Value.ToString();
- wordtable.Cell(i, 4).Range.Text = dataGridView1.Rows[i].Cells[17].Value.ToString();
- wordtable.Cell(i, 5).Range.Text = dataGridView1.Rows[i].Cells[15].Value.ToString();
- wordtable.Cell(i, 6).Range.Text = "---";
- wordtable.Cell(i, 7).Range.Text = dataGridView1.Rows[i].Cells[11].Value.ToString() + "-" + dataGridView1.Rows[i].Cells[18].Value.ToString();
- wordtable.Cell(i, 8).Range.Text = dataGridView1.Rows[i].Cells[10].Value.ToString() + "-" + dataGridView1.Rows[i].Cells[9].Value.ToString();
- wordtable.Cell(i, 8).Range.Text = dataGridView1.Rows[i].Cells[12].Value.ToString() + "-" + dataGridView1.Rows[i].Cells[6].Value.ToString();
- wordtable.Cell(i, 10).Range.Text = dataGridView1.Rows[i].Cells[13].Value.ToString() + "-" + dataGridView1.Rows[i].Cells[7].Value.ToString();
- wordtable.Cell(i, 11).Range.Text = dataGridView1.Rows[i].Cells[17].Value.ToString();
- wordtable.Cell(i, 12).Range.Text = dataGridView1.Rows[i].Cells[18].Value.ToString();
- }
- }
- catch (Exception e1)
- {
- MessageBox.Show(e1.Message);
- }
Заполняю построчно. Может в этом дело. Возможно есть способ заполнять таблицу в ворде не построчно а целиком копировать. Хелп плиз.
Неужели никто не сталкивался!?
Решение задачи: «Долго формируется таблица в Word»
textual
Листинг программы
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- using Word = Microsoft.Office.Interop.Word;
- using System.Data.OleDb;
- namespace WindowsFormsApplication1
- {
- public partial class Form1 : Form
- {
- private Word.Paragraphs wordparagraphs;
- private Word.Paragraph wordparagraph;
- public Form1()
- {
- InitializeComponent();
- }
- private void Form1_Load(object sender, EventArgs e)
- {
- //Подключаемся к базе.
- OleDbConnection connection = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;" + "Data Source=\\\\SRV\\PlantSpaceDB\\TestDb\\TestDBN.mdb");
- OleDbCommand command = connection.CreateCommand(); // создать команду запроса
- //Создаем запрос на получение данных из базы
- command.CommandText =
- "SELECT naimen, Nprod, Nuchast, SPECIF, NOMDIAM, MaxRabD, MaxRasD, MaxRabT, MaxRasT, MinRasT, MinRabT, MaxRabD&\"-\"&MaxRasD FROM [Башнефть]"; //Выборка без повторяющихся элементов из базы
- //Считываем данные в reader
- connection.Open();
- OleDbDataReader reader1 = command.ExecuteReader();
- //Заполняемс строку st данными из таблицы, разделяем значения запятой
- string st = "";
- while (reader1.Read()) {
- st = st + (reader1.GetString(0) + "&" + reader1.GetString(1) + "&" + reader1.GetString(2) + "&" + reader1.GetString(3) + "&" + reader1.GetString(4) + "&" + reader1.GetString(5) + "&" + reader1.GetString(6) + "&" + reader1.GetString(7) + "&" + reader1.GetString(8) + "&" + reader1.GetString(9) + "&" + reader1.GetString(10) + "&" + reader1.GetString(11) + "&");
- }
- //Создаем отчет документа.
- object oMissing = System.Reflection.Missing.Value; //Значение по умолчание
- object oEndOfDoc = "\\endofdoc"; /* \endofdoc is a predefined bookmark */
- //Start Word and create a new document.
- Word.Application wordapp = new Word.Application();
- Word.Document worddocument = wordapp.Documents.Add(ref oMissing, ref oMissing, ref oMissing, ref oMissing);
- Object template = @"C:\template.doc"; //файл шаблона
- Object newTemplate = false;
- Object documentType = Word.WdNewDocumentType.wdNewBlankDocument;
- Object visible = true;
- //Создаем документ 2 worddocument в данном случае создаваемый объект
- worddocument = wordapp.Documents.Add(ref template, ref newTemplate, ref documentType, ref visible);
- //Активируем документ №2
- worddocument = (Word.Document)wordapp.Documents.get_Item(2);
- worddocument.Activate();
- //Получаем ссылки на параграфы документа
- wordparagraphs = worddocument.Paragraphs;
- //Будем работать с первым параграфом
- wordparagraph = (Word.Paragraph)wordparagraphs[1];
- //Выводим текст в первый параграф
- wordparagraph.Range.Text = st;
- //Выделяем вставленную строку в документе
- Object begin = Type.Missing;
- object end = Type.Missing;
- Word.Range wordrange = worddocument.Range(ref begin, ref end);
- wordrange.Select();
- //Задаем параметры создания таблицы
- object Separator = "&"; //Разделитель столбцов строки
- object Format = Word.WdTableFormat.wdTableFormatNone;
- object ApplyBorders = true;
- object AutoFit = true;
- object AutoFitBehavior = Word.WdAutoFitBehavior.wdAutoFitContent;
- object missing = System.Reflection.Missing.Value;
- Object NumRows = 12; //Количество столбцов
- //Создаем таблицу путем конвертирования строки в таблицу.
- Word.Table Table1 = wordrange.ConvertToTable(ref Separator,
- ref missing, ref NumRows, ref missing, Format,
- ref ApplyBorders, ref missing, ref missing, ref missing,
- ref missing, ref missing, ref missing,
- ref missing, ref AutoFit, ref AutoFitBehavior,
- ref missing);
- //Задаем стиль полей таблицы, почему та таблица создается без границ изначально
- Word.Table wordtable1 = worddocument.Tables[1];
- wordtable1.Borders.InsideLineStyle = Word.WdLineStyle.wdLineStyleSingle;
- wordtable1.Borders.OutsideLineStyle = Word.WdLineStyle.wdLineStyleSingle;
- //Выделяем двенадцатый столбец.
- wordtable1.Columns[12].Select();
- object unit;
- object extend;
- //Задаем параметры Selection, выделяем оставшиеся столбцы
- unit = Word.WdUnits.wdLine;
- extend = Word.WdMovementType.wdExtend;
- for (int ii = 1; ii <= 11; ii++)
- wordapp.Selection.HomeKey(ref unit, ref extend); //Двигаем выделение в лево 11 раз. по кол-ву столбцов.
- wordapp.Selection.Copy(); //Копируем выделенную таблицу.
- //Делаем активным второй документ.
- worddocument = (Word.Document)wordapp.Documents.get_Item(1);
- worddocument.Activate();
- //Вставляем скопированную таблицу в место закладки sudakladi
- worddocument.Bookmarks["sudakladi"].Range.Paste();
- //Делаем активным первый документ, и закрываем его.
- worddocument = (Word.Document)wordapp.Documents.get_Item(2);
- worddocument.Close(Word.WdSaveOptions.wdDoNotSaveChanges, Word.WdOriginalFormat.wdWordDocument, false);
- //Делаем таблицу видимой
- wordapp.Visible = true;
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д