Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скорость заполнения Word-отчета 
:(
    Опции темы
Нитонисе
Дата 1.6.2010, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Использую в своей программе отчет в Word. Он достаточно большой - порядка 15 больших таблиц. Формируется достаточно длительное время - секунд 30-60. Естественно это не очень нравится. Можно ли как-то ускорить этот процесс?
Вспоминая работу текстовых компонентов Memo и RichEdit, отмечаю что если эти компоненты скрыты, то автоматически генерируемый текст любого объема в них появляется моментально. А если компонент видимый и соответственно виден весь процесс наполнения текстом, то это действие тоже длится определенное время. Может быть можно применить это и к Word? Если да, то как заполнять Word в невидимом режиме?
PM MAIL   Вверх
xvr
Дата 1.6.2010, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Ищи проперть типа Application.ScreenUpdating (это у Excel)
Еще рекомендую минимизировать число вызовов Word'а через OLE интерфейсы - крайне тормознутая вещь. Вызовы того же самого изнутри Word'ового документа через его VBA на порядок быстрее


PM MAIL   Вверх
Platov
Дата 1.6.2010, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.7.2009

Репутация: 2
Всего: 2



Чтобы в фоне работать вставь такой код при инициализации
Код

if(!App.IsEmpty()) App.OlePropertySet("Visible",false);


а после того как отчет сформируется
Код

if(!App.IsEmpty()) App.OlePropertySet("Visible",true);



PM MAIL   Вверх
Нитонисе
Дата 1.6.2010, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Platov, попробовал, этот метод не ускоряет заполнение ворда.


Цитата(xvr @  1.6.2010,  13:14 Найти цитируемый пост)
Вызовы того же самого изнутри Word'ового документа через его VBA на порядок быстрее

а как их запользовать?  smile 
PM MAIL   Вверх
xvr
Дата 1.6.2010, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Нитонисе @  1.6.2010,  16:50 Найти цитируемый пост)
а как их запользовать?
Сделать Word документ из макросов, которые будут грузить данные (из текстового документа или из clipboard'а) и формировать отчет в виде другого Word'овского документа. Открывать его и запускать в нем этот макрос



PM MAIL   Вверх
Нитонисе
Дата 1.6.2010, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(xvr @  1.6.2010,  17:05 Найти цитируемый пост)
Сделать Word документ из макросов, которые будут грузить данные (из текстового документа или из clipboard'а) и формировать отчет в виде другого Word'овского документа. Открывать его и запускать в нем этот макрос

А можно какой нибудь простейший пример? Например написания "Hello, World!" макросом.
PM MAIL   Вверх
xvr
Дата 1.6.2010, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Нитонисе @  1.6.2010,  18:16 Найти цитируемый пост)
Например написания "Hello, World!" макросом. 
Запросто. 

NB. Макрос можно запускать через метод Application.Run


Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  hello_world.doc 22,50 Kb
PM MAIL   Вверх
Нитонисе
Дата 1.6.2010, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(xvr @  1.6.2010,  20:51 Найти цитируемый пост)
Запросто. NB. Макрос можно запускать через метод Application.Run

Хм. А можно чтобы кнопка была не в ворде, а на форме другого приложения? То есть мы ее нажимаем, открывается ворд и там макросом пишется эта строчка. Я просто хочу понять как это взаимоувязывается.
PM MAIL   Вверх
xvr
Дата 1.6.2010, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Нитонисе @  1.6.2010,  22:36 Найти цитируемый пост)
Хм. А можно чтобы кнопка была не в ворде, а на форме другого приложения? То есть мы ее нажимаем, открывается ворд и там макросом пишется эта строчка. Я просто хочу понять как это взаимоувязывается. 
Можно. Я же писал - делаем в Word'е макрос (назовем его DoImport), потом вызываем его через OLE - Application.Run("DoImport")
Код

App.OlePropertyGet("Application").OleProcedure("Run","DoImport");


PM MAIL   Вверх
Нитонисе
Дата 1.6.2010, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(xvr @  1.6.2010,  22:44 Найти цитируемый пост)
Можно. Я же писал - делаем в Word'е макрос (назовем его DoImport), потом вызываем его через OLE - Application.Run("DoImport")

То есть мне надо создать сервер, открыть этот файл и запустить макрос этой командой?
PM MAIL   Вверх
xvr
Дата 2.6.2010, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Нитонисе @  1.6.2010,  23:16 Найти цитируемый пост)
То есть мне надо создать сервер, открыть этот файл и запустить макрос этой командой? 
Да. Только сначала нужно где то снаружи создать файл с данными, который этот макрос будет читать.


PM MAIL   Вверх
Нитонисе
Дата 2.6.2010, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(xvr @  2.6.2010,  09:06 Найти цитируемый пост)
Да. Только сначала нужно где то снаружи создать файл с данными, который этот макрос будет читать.

Как можно создать файл с данными? Если бы это был просто текст, то я бы занес его в буфер обмена и вставил в открытый вордовский документ, такая операция происходит достаточно быстро даже с большими объемами текста. Но вот как это провернуть с таблицой переменной структуры?

Это сообщение отредактировал(а) Нитонисе - 2.6.2010, 12:23
PM MAIL   Вверх
xvr
Дата 2.6.2010, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Нитонисе @  2.6.2010,  12:23 Найти цитируемый пост)
Но вот как это провернуть с таблицой переменной структуры?
Все зависит от структуры таблиц. И структуры отчета. И собственно данных. Универсальных способов похоже не будет.
В любом случае данные для занесения придется брать в текстовом виде (из файла) и из них как то формировать таблицу скриптом на VBA. Или пытаться передать в виде xml (надо смотреть, что с ним умеет делать Word)


PM MAIL   Вверх
Нитонисе
Дата 2.6.2010, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(xvr @  2.6.2010,  13:48 Найти цитируемый пост)
В любом случае данные для занесения придется брать в текстовом виде (из файла) и из них как то формировать таблицу скриптом на VBA.

Сейчас все данные хранятся в оперативной памяти - в переменных. На их основе и формируются таблицы. У таблиц может быть разное количество строк, столбцов, по разному могут объединяться ячейки. Это зависит от набора данных. 
Как можно сформировать таблицу, хотя бы даже с переменным количеством строк? Как в макрсо ввести эту переменную?
PM MAIL   Вверх
xvr
Дата 2.6.2010, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Нитонисе @  2.6.2010,  14:04 Найти цитируемый пост)
Как в макрсо ввести эту переменную? 
Никак. В макро можно передать параметры, но таблицу ими не описать  smile Таблицу должен формировать макрос В word'е, на основании данных из файла. Этот файл вы должны создать сами ПЕРЕД вызовом макроса, а макрос его должен открыть в документе Word'а (кстати, это может быть xml файл, Word вроде поддерживает работу с xml). Потом макрос должен  обойти xml (или просто текстовый файл) и по его данным построить таблицу. Можно считать, что в файле будут записанны команды построения, а макрос работает интерпретатором.
Вот только кажется мне, что это будет не быстрее, чем дергать Word снаружи :(

Еще можно внедрить в Word (в VBA) свой ActiveX объект, который может подергать Word'овые объекты изнутри.


PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0584 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.