Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скорость заполнения 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   Вверх
Нитонисе
Дата 2.6.2010, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



xvr, как-то все очень сложно) чувствую нужно еще будет и VBA изучить, чтоб все это реализовать)
Надо бы что нибудь попроще.
PM MAIL   Вверх
Alca
Дата 2.6.2010, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Нитонисе, у тебя там тока таблицы??? Графики есть???

Добавлено через 6 минут и 9 секунд
Если тупо таблицы могу предложить грязный хак  smile 


--------------------
PM WWW ICQ Skype Jabber   Вверх
Нитонисе
Дата 2.6.2010, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Alca @  2.6.2010,  17:58 Найти цитируемый пост)
Нитонисе, у тебя там тока таблицы??? Графики есть???

Таблицы и текстовая часть. Вид таблиц и их количество зависит от данных, хранящихся в глобальных переменных. Текстовую же часть в процессе работы программы формирую в ричэдит, а при формировании отчета копирую в буфер и вставляю в ворд.
PM MAIL   Вверх
Alca
Дата 2.6.2010, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Цитата

Надо бы что нибудь попроще.

Я выводил таблицы в эксель так:
- создаю таблицу с нужным форматирование, используя HTML (тэг <table>, <th>, <tr>, ...);
- сохраняю в текстовый файл с расширением xls;
- открываю файл экселем, используя функцию ShellExecute (ну или CreateProcess);
- эксель скажет пару ласковых слов, сейвлю CTRL+S;
Можно еще поиграться со стилями в HTML документа. 
Так намного быстрее делаются таблицы.  smile 

Это сообщение отредактировал(а) Alca - 2.6.2010, 22:08


--------------------
PM WWW ICQ Skype Jabber   Вверх
Нитонисе
Дата 3.6.2010, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Alca, это мне еще и HTML придется выучить?)
PM MAIL   Вверх
Alca
Дата 3.6.2010, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



По мне так HTML проще, чем все что тебе предлагали выше

Добавлено через 4 минуты и 22 секунды
Код

<HTML>
<TABLE BORDER=1 CELLSPACING=0 BORDERCOLOR=#0000FF CELLPADDING=5 WIDTH=450 rules=all>
<TR><TH>№</TH><TH>ID засоба</TH><TH>ID смарт-карти</TH><TH>Отримано вiд</TH><TH>Дата отримання</TH><TH>Пiдстава (договiр)</TH><TH>Пiдпис особи, що здiснила операцiю</TH><TH>Передано до</TH><TH>Дата передачi</TH><TH>Пiдстава (договiр)</TH><TH>Пiдпис особи, що здiснила операцiю</TH><TH>Примiтка</TH></TR>
</TABLE>
</HTML>


Это сообщение отредактировал(а) Alca - 3.6.2010, 11:58


--------------------
PM WWW ICQ Skype Jabber   Вверх
borisbn
Дата 3.6.2010, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(Нитонисе @  3.6.2010,  11:26 Найти цитируемый пост)
Alca, это мне еще и HTML придется выучить?)

Ничего сложного smile
Знаешь, как я выучил ? Во всех ( ну почти во всех ) браузерах есть режим "Просмотр исходного кода" или "Проинспектировать элемент". Включаешь этот режим и смотришь, что как выглядет на страничке, и как это закодировано в HTML. Потренируйся на простых страничках, ибо эта - IMHO сложная (форум, всё-таки) smile


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Нитонисе
Дата 3.6.2010, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо за совет, может как нить и займусь осваиванием этого хакерского метода, но хотелось бы что-то родное сиплюсплюсшное)) Видимо простыми методами создание больших ворд-отчетов не ускорить(
PM MAIL   Вверх
xvr
Дата 3.6.2010, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Есть вполне 'родной' метод - напрямую сформировать Word'овый документ (без Word'а). Описание бинарного формата Word'овых документов лежит где то на сайте MS
(Но этот метод для настоящих джедаев  smile )

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


Опытный
**


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

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



А может тут дело в коде, который я использую?
Я заметил что тормоза начинаются на строчках такого типа:
Код

MyTable->Rows->Item(1)->SetHeight(20,wdAdjustNone);
MyTable->Rows->Item(2)->SetHeight(20,wdAdjustNone);

Тут я задаю высоту первых двух строчек таблицы.
И во время компиляции на этих строчках появляются предупреждения:
[C++ Warning] UMain.cpp(1504): W8006 Initializing Word_2k::WdRowHeightRule with Word_2k::WdRulerStyle
Так как предупреждение не критическое, то программа компилируется и нормально работает, если не считать тормозов.
Может быть снижение скорости из-за этих строк? И о чем вообще предупреждает компилятор?
PM MAIL   Вверх
xvr
Дата 4.6.2010, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Нитонисе @  4.6.2010,  18:26 Найти цитируемый пост)
Я заметил что тормоза начинаются на строчках такого типа:
Их всего 2, или больше? Таблица к этому моменту уже заполненна? Попробуй ресайзить пустую таблицу, а потом заполнять
Цитата

И о чем вообще предупреждает компилятор? 
О том, что 2й параметр у SetHight не из той оперы  smile Он ожидает enum типа Word_2k::WdRowHeightRule, а ты ему дал Word_2k::WdRulerStyle
Код

typedef enum WdRowHeightRule
{
  wdRowHeightAuto = 0, 
  wdRowHeightAtLeast = 1, 
  wdRowHeightExactly = 2
} WdRowHeightRule;
Попробуй MyTable->Rows->Item(1)->SetHeight(20,wdRowHeightExactly)
PM MAIL   Вверх
Нитонисе
Дата 4.6.2010, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(xvr @  4.6.2010,  19:03 Найти цитируемый пост)
Их всего 2, или больше? Таблица к этому моменту уже заполненна? Попробуй ресайзить пустую таблицу, а потом заполнять

Таблиц около 15-ти, в каждой выравниваю по 2-3 верхних строчки. Плюс еще ширину столбцов задаю у всех таблиц, там тоже тормозит, но компилятор не ругается. А работаю таким образом с пустой таблицей.

Цитата(xvr @  4.6.2010,  19:03 Найти цитируемый пост)
Попробуй MyTable->Rows->Item(1)->SetHeight(20,wdRowHeightExactly)

На этот код предупреждений не дает  smile 

Это сообщение отредактировал(а) Нитонисе - 4.6.2010, 20:48
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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