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

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

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

Студворк — интернет-сервис помощи студентам
Экспортирую данные из 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 минут. Файловая база, пользователи работают в терминале (максимум 5 пользователей...

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

2
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
12.08.2015, 09:53
Вот здесь обсуждалась подобная тема. Дали два совета:
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  [ТС]
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.08.2015, 13:07
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru