powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Быстрое заполнение таблицы в MS Word
13 сообщений из 13, страница 1 из 1
Быстрое заполнение таблицы в MS Word
    #36361753
winww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго дня!
Возникала проблема, над которой бьюсь уже 2 неделю. Задача такая, сформировать табличный отчет в Word. Данные хранятся на MS SQL Server. Заполнение каждой ячейки отдельно не годиться очень долго, использование Excel тоже, поэтому для быстрого заполнения делаю следующее:
- Открываю Recordset (rsList)
- В цикле по записям формирую строку, где значения разделяются спец. символом TAB (vbTab) и в конце прибавляю Enter(vbCrlf), получается строка (не массив), что-то вроде:

Иванов vbTab Иван vbTab Сергеевич vbCrlf
Петров vbTab Сергей vbTab Иванович vbCrlf
Сидоров vbTab Сергей vbTab Иванович vbCrlf
(Это условное представление переменной)

- Открываю документ Word
- Прохожу по всем таблицами и нужную таблицу присваиваю объекту (TableWord)
- В конец таблицы добавляю нужное количество строк = количеству записей в рекордсете

Выделяю сразу все мне нужные строки вот таким кодом.
Код: plaintext
1.
2.
3.
4.
5.
' Выделяю ячейку, от которой я начинаю добавлять данные
TableWord.Rows(NumRow).Select 'где  TableWord – таблица,  I – номер строки с которой надо начинать вставку данных
'выделяю  все строчки ниже, это эмитирует  нажатия клавиши «Вниз» удерживая шифт
appWord.Selection.MoveDown Unit:= 5 , Count:=rsList.RecordCount, Extend:= 1 
appWord.Selection.Paste 'Вставляю данные

Это аналогично вставки в Excel, т.е таб - это переход на следующую ячейку, Enter - на следующую строчку. Тут все бы и хорошо и все работает, но надо чтобы Word во время формирования был скрыт. Вот тут и возникает косяки, то что при Visible=false программа не выделяет все записи, причем каждый раз колличество выделенных строк разное и соответственно при вставки данных, заполняются только выделеные строки, вот такая вот байда

Но если за этим наблюдать то все срабатывает хорошо, какой то глюк офиса, как бы его обойти?
...
Рейтинг: 0 / 0
Быстрое заполнение таблицы в MS Word
    #36362403
winww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно сделать иначе, вставлять строку в таблицу, добавленная строка при этом выделенная, и можно сразу вставить однe строчку данных и так далее

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Do while … ' цикл пока не пройдем все строки рекордсета
Clipboard.Clear ' очищаем буфер
Clipboard.SetText stroka, vbCFText ' записываем в буфер готовую строку
appWord.Selection.InsertRowsBelow  1  'вставляем строчку в таблицу, строка остается выделенной
appWord.Selection.Paste 'вставляем данные
stroka = ""  ' обнуляем переменную и  так по кругу
Loop

Но это удлиняет процесс в несколько раз, к примеру, заполнение 800 строк по 1 методу (выделить все строки и вставить) занимает секун 10, то таким образом больше минуты

Специалисты SQL.ru подскажите плиз, задачка специфичная, но очень хотелось бы решить.
Может быть отображать документ но держать его свернутым, но при обращении в word объектам он будет пытаться отобразиться
...
Рейтинг: 0 / 0
Быстрое заполнение таблицы в MS Word
    #36362413
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сам не знаю, откуда я это знаю, но так

Код: plaintext
1.
2.
3.
4.
With Application.Documents( 1 )
  .Range( _
    Start:=.TableWord.Rows(NumRow).Range.Start, _
    End:=.TableWord.Rows(NumRow+rsList.RecordCount- 1 ).Range.End).Paste
End With

Чисто интуитивно предполагаю, что лучше не использовать буфер, а из текстовой переменной заполнить прямиком в таблицу. Может кто-то подскажет как, а то слету не получилось, возможно нельзя без цикла - только буфер?
...
Рейтинг: 0 / 0
Быстрое заполнение таблицы в MS Word
    #36362417
m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
m
Гость
Я помочь в данном вопросе не смогу, но хотелось бы узнать, почему для выведение отчетов нельзя использовать Ексель, или даже лучше Акцесс?
...
Рейтинг: 0 / 0
Быстрое заполнение таблицы в MS Word
    #36362422
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогло или нет отпишись, самому интересно?
...
Рейтинг: 0 / 0
Быстрое заполнение таблицы в MS Word
    #36362432
winww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m,
Да дело в том что Word более понятен и знаком пользователям, и сделав такой механизм я смогу делать более сложные отчеты, к примеру заполнение нескольких таблиц на одной странице и не важно как таблицы располагаются рядом или паралельно, в Excell так сделать сложнее. Excel я использую и он конечно удобен мне как программисту, но вот делаю я не для себя ))

Deggasad
Сейчас буду пробывать
...
Рейтинг: 0 / 0
Быстрое заполнение таблицы в MS Word
    #36362452
m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
m
Гость
Я могу ошибаться, но вставить данные из БД в Эксель на порядок легче, чем в Ворд. Например через тоже ADODB прям запросом из таблицы БД в лист Экселя. А если Вы хотите более сложные отчеты делать, то для этого есть Акцесс. Если отчет должен быть обрабатываемым, тогда связка Эксель-Ворд. Всего лишь мое мнение :)
...
Рейтинг: 0 / 0
Быстрое заполнение таблицы в MS Word
    #36362496
winww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Deggasad,
Ты гений )) Работает!

Я еще потестирую, разные варианты документов, но вот при большом количестве строк 1 метод всегда падал. Твой способ - все отлично и главное быстро, тут видимо уже либо все выделит либо вообще ничего)). Буду изучать объект Range ему должное внимание не уделил, виноват.

Выход таков:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Clipboard.Clear
Clipboard.SetText strBuf, vbCFText   ' помещаем все строки в буфер в виде переменной
     appWord.ActiveDocument.Range( _
     TableWord.Rows(NumRow +  1 ).Range.Start, _
     TableWord.Rows(NumRow + rsList.RecordCount).Range.End).Select ' выделяем диапазон нужных строк
    appWord.Selection.Paste ' вставляем
'где  appWord и есть мой нужный документ Application.Documents
'TableWord - обробатываемая таблица

Здорово, теперь за считанные секунды можно вывести в word кучу инфы
Тест:
Вставить 896 строк из рекордсета (вышло 47 страниц это 20 строк на лист примерно) + программное форматирование текста:
- Выделение по строчке заняло 2 мин 20 сек
- Выделить и вставить - 50 секунд

На практике будет еще быстрее т.к записей реально будет по 100-200

Надеюсь, подводных камней не найду, кого заинтересовал данный метод пишите!
...
Рейтинг: 0 / 0
Быстрое заполнение таблицы в MS Word
    #36362520
winww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m,
С Вами согласен! Делаю только для удобства пользователей ))

Access удобно использовать когда делаешь проект в нем, я же хочу осущесвить это в своей программе, В Access нет возможности такого гибкого форматирования отчета как в Word и Excel, но прога тоже очень хорошая!
...
Рейтинг: 0 / 0
Быстрое заполнение таблицы в MS Word
    #36362580
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня тоже больше устроил бы Эксель (рассылку можно в PDF)
Но есть своя логика (плюсы) и отчетов в ворде. Например легче использовать информацию в совокупности с текстом особенно когда не знаешь точный объем информации. Если информация при этом не на ссылках, а в самом ворде, то ее легко подправить или переформатировать, касается обычных пользователей, не искушенных тонкостями информационных систем.

winww
По теме: Я думал, что основная наша задача как раз избежать метода Select , а ты продолжаешь его упорно использовать, Зачем?
...
Рейтинг: 0 / 0
Быстрое заполнение таблицы в MS Word
    #36362731
winww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Deggasad,

Это я исправил, просто сразу когда проверял хотел глянуть что выделится при Select, сейчас использую сразу метод paste

Код: plaintext
1.
2.
3.
appWord.ActiveDocument.Range( _
     TableWord.Rows(NumRow +  1 ).Range.Start, _
     TableWord.Rows(NumRow + rsList.RecordCount).Range.End).paste

По поводу Word отчетов,
Бывает что приходится готовить отчет (документ), где не только нужно вывести табличные данные, а также дописать сопроводительный текст, схемы и т.д, и приходится такой отчет собирать по кусочкам из нескольких, тут Excel не удобен из за табличной структуры.
...
Рейтинг: 0 / 0
Быстрое заполнение таблицы в MS Word
    #36363278
LeCrunch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Быстрое заполнение таблицы в MS Word
    #36364509
winww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeCrunch,
СП! Хорошая статейка!
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Быстрое заполнение таблицы в MS Word
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]