Эффективный алгоритм выгрузки Recordset в Word

Программирование на Visual Basic for Applications
ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Эффективный алгоритм выгрузки Recordset в Word

Сообщение ger_kar » 27.08.2012 (Пн) 7:25

Задача - необходимо выгрузить ADODB.Recordset в таблицу MS Word с максимальной эффективностью в плане производительности
Собственно стандартный алгоритм перебирать по очереди ячейки таблицы и соответствующие поля и записи рекордсета и переносить данные в Word является просто чудовищно непроизводительным и жутко медленным и при большом количестве записей рекордсета такой алгоритм не годится.
Нужен алгоритм по эффективнее. Может будут идеи?
Бороться и искать, найти и перепрятать

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Эффективный алгоритм выгрузки Recordset в Word

Сообщение FireFenix » 27.08.2012 (Пн) 7:37

ger_kar писал(а):еребирать по очереди ячейки таблицы и соответствующие поля и записи рекордсета и переносить данные в Word является просто чудовищно непроизводительным и жутко медленным

Да ладно! Любой вывод нормальной базы данных свыше 1Гига будет очень долго.

ger_kar писал(а):Нужен алгоритм по эффективнее. Может будут идеи?

Формировать самому таблицу и заполнять её данными из БД

А лучше напрямую из БД экспортировать в csv или другой формат. Excel понимает csv
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Эффективный алгоритм выгрузки Recordset в Word

Сообщение ger_kar » 27.08.2012 (Пн) 8:55

FireFenix писал(а):Да ладно! Любой вывод нормальной базы данных свыше 1Гига будет очень долго
Да если речь от такой большой базе. Но тут речь о базе на порядок меньше. Скажем так, что среднее количество экспортируемых записей рекордсета будет составлять примерно 10 - 30 тысяч.
FireFenix писал(а):А лучше напрямую из БД экспортировать в csv или другой формат. Excel понимает csv
Тут проблема с экспортом именно в Word. При экспорте в Excel такой проблемы не стоит и данные экспортируются с приемлемой скоростью. Но требования заказчика сделать вывод и в Word и в Excel.
FireFenix писал(а):Формировать самому таблицу и заполнять её данными из БД
В смысле самостоятельно формировать вордовскую таблицу с заполненными данными и потом открыв документ Word разом вставить сформированную таблицу. Несомненно так бы было быстрее, но я не имею не малейшего понятия как можно такое проделать. Для начала нужно узнать структуру вордовской таблицы в памяти, а уж потом...

Может сделать по другому? Например сделать шаблон документа с макросом, который бы и занимался этой работой, а для экспорта из БД просто активировать этот шаблон и макрос и передавать ему ссылку на рекордсет?
Бороться и искать, найти и перепрятать

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Эффективный алгоритм выгрузки Recordset в Word

Сообщение FireFenix » 27.08.2012 (Пн) 11:33

ger_kar писал(а):Для начала нужно узнать структуру вордовской таблицы в памяти, а уж потом..

Чё?

http://ru.wikipedia.org/wiki/Visual_Studio_Tools_for_Office
+
Код: Выделить всё
Set Table = ActiveDocument.Tables.Add

+
Код: Выделить всё
For i = 1 To 100500
    For j = 1 To 100500
        Table.Rows(i).Cells(j).Range.Text = "Text"

И пошёл
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Эффективный алгоритм выгрузки Recordset в Word

Сообщение ger_kar » 27.08.2012 (Пн) 13:58

То что ты предлагаешь собственно и есть стандарный алгоритм о котором я писал
ger_kar писал(а):Собственно стандартный алгоритм перебирать по очереди ячейки таблицы и соответствующие поля и записи рекордсета и переносить данные в Word
И который меня как раз и не устраивает. Если такой алгоритм запустить в виде макроса VBA то результат по времени еще более менее приемлимый, но если общение с вордом происходит из стороннего процесса, т.е. приложения на VB то скорость экспорта просто аховая и кроме разочарование ничего не возникает.
Говоря про формирование таблицы я имел ввиду не использование стандартной объектной модели ворда. А самостоятельное формирование таблицы (в это время ворд вообще не запущен) в процессе своего приложения, а потом подключить ворд и вставить готовую таблицу одним махом.
Бороться и искать, найти и перепрятать

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Эффективный алгоритм выгрузки Recordset в Word

Сообщение NashRus » 27.08.2012 (Пн) 15:33

Формируй документ в формате HTML и открывай его в Word'e.

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Эффективный алгоритм выгрузки Recordset в Word

Сообщение Sam777e » 28.08.2012 (Вт) 1:56

1. Пробуй, пользуйся.

Я формирую Recordset, а ты работай со своим; и, конечно, не Selection, а какой-нибудь Bookmark из Документа.

Желательно еще отключать / включать Автосохранение.

После создания таблицы форматируй ее и подумай о возвращении параметров Word'а в прежнее состояние.

Главные местa

V = Recordset.GetString

и

With anyRange
.InsertAfter anyRecordsetValue
.ConvertToTable
End With


2. Второй способ. Держи невидимый Excel, туда выгружай свой объект, а потом он очень быстро и легко вставляется в Word: в Excel выделяешь, копируешь, в Word вставляешь. Попробуй, сам увидишь нужный код.

Все делал в Windows XP SP2, Office 2000.
Вложения
ADO_RecordsetToTable.RAR
(9.54 Кб) Скачиваний: 217
Последний раз редактировалось Sam777e 29.08.2012 (Ср) 16:16, всего редактировалось 1 раз.
Здоровья и удачи

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Эффективный алгоритм выгрузки Recordset в Word

Сообщение ger_kar » 28.08.2012 (Вт) 12:22

Sam777e писал(а):Желательно еще отключать / включать Автосохранение
Ну это да, а кроме этого желательно и проверку орфографических и грамматических ошибок отключать.
Sam777e писал(а):Главное место With anyRange .InsertAfter anyRecordsetValue .ConvertToTable End With
Я конечно тоже пытался вставить весь рекордсет махом в таблицу, но у меня так ничего и не вышло. А вставлять сначала рекордсет а потом превращать его в таблицу я не догадался. А идея хорошая. Сейчас буду пробовать. Также попробую вариант с Excel и с HTML, как предложил NashRus.
Спасибо.
Бороться и искать, найти и перепрятать

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Эффективный алгоритм выгрузки Recordset в Word

Сообщение NashRus » 28.08.2012 (Вт) 15:51

Я не предлагал с Excel!
Я говорил о том, что нужно сформировать HTML и тем или иным образом открыть его в Word'e.
Это самое простое и быстрое.

Далее идет самостоятельное формирование doc или docx своими силами или с помощью сторонних в основном платных компонент.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Эффективный алгоритм выгрузки Recordset в Word

Сообщение ger_kar » 28.08.2012 (Вт) 18:04

Попробовал метод Sam777e - 300 страниц вставляется за несколько секунд (что-то около 5) вместо 3 минут если действовать по стандартному алгоритму. Единственное, придется сделать еще один рекордсет, так как в прежнем избыточная информация фильтровалось выбором нужных полей, а по этому методу весь рекордсет вставляется как есть.
Бороться и искать, найти и перепрятать


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 46

    TopList