С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
1 / 1 / 1
Регистрация: 01.04.2015
Сообщений: 43
1

Долго формируется таблица в Word

12.08.2015, 08:54. Показов 2359. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Экспортирую данные из DataGridView в таблицу документе Word. Почему то очень долго формируется таблица. Подскажите пожалуйста, где ошибка. Никак не могу разобраться. 20 страниц формируются где-то 5 минут.

Вот код.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
 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);
        }
Добавлено через 14 часов 5 минут
Заполняю построчно. Может в этом дело. Возможно есть способ заполнять таблицу в ворде не построчно а целиком копировать. Хелп плиз.

Добавлено через 3 часа 13 минут
Неужели никто не сталкивался!?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.08.2015, 08:54
Ответы с готовыми решениями:

XML схема веб сервиса долго формируется
Добрый день. Пишу сейчас мобильное приложение и столкнулся с проблемой. Развернул на локалхосте...

Долго формируется отчет оборотно-сальдовая ведомость по счету 60
Формирование счета за 2014 год длиться порядка 20 минут. Файловая база, пользователи работают в...

Стартовая таблица оборудования формируется по 3 символа в секунду
Сгорел моя видюха после ацкого напряга. Сменил, включил, все б ничего, но вот какая шняга......

Разработать программу, в которой за заданым целым числом N формируется таблица
Разработать программу, в которой за заданым целым числом N (2 ≤ N &lt; 99) формируется таблица...

2
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
12.08.2015, 09:53 2
Вот здесь обсуждалась подобная тема. Дали два совета:
1. Использовать формат docx , и работать с ним при помощи Open XML SDK. Формат docx использует xml, а работать с xml намного проще и быстрей. При необходимости можно конвертировать в doc.
2. WordApp.Visible = false;
2
1 / 1 / 1
Регистрация: 01.04.2015
Сообщений: 43
13.08.2015, 13:07  [ТС] 3
Цитата Сообщение от maxillion Посмотреть сообщение
Вот здесь обсуждалась подобная тема. Дали два совета:
1. Использовать формат docx , и работать с ним при помощи Open XML SDK. Формат docx использует xml, а работать с xml намного проще и быстрей. При необходимости можно конвертировать в doc.
2. WordApp.Visible = false;
К сожалению Ваш ответ увидел слишком поздно. 1 предложенный способ я не пробовал, а второй не помогает.

Решил проблему таким образом.

Отправлял таблицу в виде строки, значения разделял определенным символом. Потом в документе word выделял эту строку и создавал таблицу командой creat table. Так получается намного быстрее. Вот код. Если что не так прошу поправить.

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
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;
            
        }
    }
}
0
13.08.2015, 13:07
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.08.2015, 13:07
Помогаю со студенческими работами здесь

Не формируется отчет в Word из Delphi
Программа работает. Запускает документ, но в него вносится всего одна строка &quot;Отчет&quot; , а затем...

Word 2007 долго открывает документы word 2003
Всем привет! Очень долго открываются документы word 2003. При открытии происходит настройка потом...

Сохранение макета в Word (MXL --> таблица в Word)
Есть такой код: ............запрос ТаблицаДанных = Запрос.Выполнить().Выгрузить(); ...

Word долго обновляет связи с Excel
Нужно, чтобы Word 2010 автоматически обновлял связи (неформатированный текст) с ячейками Excel...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru