Долго формируется таблица в 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;
            
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.467 из 5