Форум программистов, компьютерный форум, киберфорум
Наши страницы
VBScript/JScript/WSH/WMI/HTA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
eabrz
0 / 0 / 0
Регистрация: 26.05.2016
Сообщений: 7
1

Создание многостраничного документа Word для массовой печати

26.05.2016, 10:34. Просмотров 692. Ответов 12
Метки нет (Все метки)

Добрый день, уважаемые форумчане.
Задача: есть шаблон Word'а, в котором используются поля значений. Для организации массовой печати данного шаблона (пользователь после проверки заполненных данных запустит печать стандартным образом) необходимо на каждой странице выводить разные данные для трех полей, получаемые из курсора при обращении к БД, остальные поля значений остаются неизменными для всех страниц.
У меня получилось добавлять копированием необходимое количество страниц в зависимости от количества записей в курсоре, а вот с присвоением значений беда. Наименование полей, в которых должны быть изменяемые данные при таком создании страниц одинаковые.
В связи с этим вопрос: можно ли каким-либо образом вывести для каждой страницы свое значение из курсора для трех полей значений? Если при таком исполнении невозможно задачу решить, то подскажите, пожалуйста, как это можно реализовать. Желательно указать код.
Шаблон такого вида:
-----------------------------------------------
Код
Исх. N_______                       XXXX<-здесь первое поле, кот. должно изменяться (name)
От ХХХХ                                ХХХХ<-здесь второе поле, кот. должно изменяться (adr1)

                  Уважаемый ХХХХ<-здесь третье поле, кот. должно изменяться (short_name)
.... (текст)

ХХХХ                                     ХХХХ
должность                           ФИО
---------------------------------------------
В шаблоне ХХХХ - присвоено макросом полю значения до его заполнения, пример:
Visual Basic
1
2
3
4
5
Sub InsField()
With ActiveDocument.Variables
    .Add Name:="short_name", Value :="XXXX"
End With
End Sub
Часть кода (может быть коряво, тк с vbs работаю что говорится с колес):
Visual Basic
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
...
Set DS= #sql_cur{
select h.name name
            , INITCAP(substr(h.name, instr(h.name, ' ',1)+1) short_name
            , up.address_info(h.Id, 1) adr1
from up.hum h
where ....
order by h.name
}
 
n= DS.RecordCount
 
Set wrd = CreateObject ("Word.Application")
Set doc = wrd.Documents.Open(SaveDocName)
 
Set page = doc.Range()
   wrd.Selection.WholeStory
   wrd.Selection.Copy
 
 for i=2 to n
 
  With page
    wrd.Selection.EndOf
    wrd.Selection.InsertBreak
    wrd.Selection.PasteAndFormat (wdFormatOriginalFormatting)
    .EndOf
   wrd.Selection.TypeBackSpace
  End With
 Next
wrd.Selection.MoveUp 7, n-(n-1)
 
'Присвоение значений из переменных
doc.Variables ("date").Value = date
doc.Variables ("fio").Value = fio
doc.Variables ("name").Value = name 
...
doc.Fields.Update
 
doc.SaveAs(SaveDocName)
wrd.Visible = True
Set page=Nothing
Set n=Nothing
Set i=Nothing
Set wrd=Nothing
Set doc =Nothing
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2016, 10:34
Ответы с готовыми решениями:

Создание документа word и выводящий в нем текущую дату и ФИО!
срочно!!! создать VBS скрипт, создающий документ word и выводящий в нем текущую...

Создание многостраничного документа Word на основе шаблона
Доброго времени суток Уважаемые форумчане. С word работаю достаточно давно и...

Какой можно выбрать принтер для массовой цветной печати листовок?
Какой можно выбрать принтер для массовой цветной печати листовок?

При печати документа из word появляются цифры в документе которых быть не должно
Здравствуйте, такая беда, наш юрист как то печатает документ, что вылазят вот...

Из Excel в Word / Задать количество листов для печати в Word
Добрый день многоуважаемые, надеюсь на ваш совет. Есть задание из Excel...

12
tisha_
57 / 57 / 36
Регистрация: 16.09.2015
Сообщений: 296
Завершенные тесты: 3
26.05.2016, 11:10 2
Вам обязательно в один документ выводить, может стоит на каждого клиента отдельный файл формировать? Выделите отдельную директорию и сохраняйте документ обзывая его айдишником с наименованием клиента, например.

Добавлено через 19 минут
и да, получившийся файл можно и не сохранять, а сразу отправлять на печать
Visual Basic
1
w.ActiveDocument.PrintOut
0
eabrz
0 / 0 / 0
Регистрация: 26.05.2016
Сообщений: 7
26.05.2016, 11:33  [ТС] 3
Как раз нужно в одном, чтобы пользователь нажал кнопку печати и по всем клиентам сразу получил печатный документ, а не заходил в каждый из файлов и из каждого запускал документ на печать.
0
tisha_
57 / 57 / 36
Регистрация: 16.09.2015
Сообщений: 296
Завершенные тесты: 3
26.05.2016, 12:08 4
можно формировать в разные, а потом объединить в один)
0
eabrz
0 / 0 / 0
Регистрация: 26.05.2016
Сообщений: 7
30.05.2016, 09:47  [ТС] 5
Многопоточное создание файлов, к сожалению, не поддерживается.
0
tisha_
57 / 57 / 36
Регистрация: 16.09.2015
Сообщений: 296
Завершенные тесты: 3
30.05.2016, 09:56 6
eabrz, вы можете делать выгрузку в разные файлы, а потом объединить их в один
0
eabrz
0 / 0 / 0
Регистрация: 26.05.2016
Сообщений: 7
31.05.2016, 03:49  [ТС] 7
tisha_, можете привести пример кода вашего предложения?
0
tisha_
57 / 57 / 36
Регистрация: 16.09.2015
Сообщений: 296
Завершенные тесты: 3
31.05.2016, 09:57 8
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
END_OF_STORY = 6
MOVE_Selection = 0
path = "C:\123\testWord"
Set fso = CreateObject("Scripting.FileSystemObject")
Set Files = FSO.GetFolder(path).Files 
Set objWord = CreateObject("Word.Application") : objWord.Visible = True : Set objDoc = objWord.Documents.Add()  
Set oDoc = objWord.Documents
objDoc.SaveAs(path & "\mainFile.docx")
objWord.ActiveWindow.Close
For Each File In Files 
    objWord.Documents.Open path & "" & File.Name
    Set objSelection = objWord.Selection 
    objSelection.WholeStory
    objSelection.Copy
    objWord.ActiveWindow.Close
    objWord.Documents.Open path & "\mainFile.docx"
    Set objSelection = objWord.Selection 
    objSelection.PasteAndFormat (0)
    objWord.ActiveDocument.Save
    objWord.ActiveWindow.Close
Next
0
eabrz
0 / 0 / 0
Регистрация: 26.05.2016
Сообщений: 7
01.06.2016, 05:10  [ТС] 9
Не поняла первые 2 строки, разъясните , пожалуйста
0
tisha_
57 / 57 / 36
Регистрация: 16.09.2015
Сообщений: 296
Завершенные тесты: 3
01.06.2016, 09:14 10
eabrz, удалите эти строки, они не используются
0
eabrz
0 / 0 / 0
Регистрация: 26.05.2016
Сообщений: 7
01.06.2016, 09:46  [ТС] 11
Происходит открытие документов (мелькают), в итоге программа выдает сообщение, что файл поврежден
0
tisha_
57 / 57 / 36
Регистрация: 16.09.2015
Сообщений: 296
Завершенные тесты: 3
01.06.2016, 10:02 12
добавьте игнорирование скрытых файлов, если мешает мелькание установите атрибут Visible = false при открытии

Добавлено через 1 минуту
или проверку имени файла на символы ~$
0
eabrz
0 / 0 / 0
Регистрация: 26.05.2016
Сообщений: 7
02.06.2016, 15:48  [ТС] 13
tisha_, спасибо, но все-таки пришлось переделать шаблон в Excel'е и с ним работать на vbs.

Visual Basic
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
...
Set DS= #sql_cur{
select h.id id
         , h.name name
         , INITCAP(substr(h.name, instr(h.name, ' ',1)+1) short_name
         , up.address_info(h.Id, 1) adr1
from up.hum h
where ....
order by h.name
}
 
Set objXL = CreateObject ("Excel.Application")
Set objBk = objXL.WorkBooks.Open(OpenDotName)
 
i=1
 
Do While Not DS.EOF
 
'--Добавление листов в книгу по количеству записей в курсоре и наименование их по id клиента
     objBk.WorkSheets("obraz").Copy, objBk.WorkSheets(objBk.WorkSheets.Count)
     objBk.WorkSheets(objBk.WorkSheets.Count).Name = DS("id")
 
'--Присвоение ячейкам изменяемых значений по клиентам
     objXL.Cells(1,5).Value = DS("name")
     objXL.Cells(2,5).Value = DS("adr1")
     objXL.Cells(7,3).Value = DS("short_name")
 
'--Присвоение ячейкам постоянных значений
     objXL.Cells(2,3).Value   = date
     objXL.Cells(18,5).Value = srok
     ...
     DS.movenext
     i=i+1
loop
 
'--Скроем от пользователя лист с шаблоном
    objBk.WorkSheets("obraz").Select
    objBk.WorkSheets("obraz").Visible = False
 
   objBk.SaveAs(SaveDocName)
   objXl.Visible = True
0
02.06.2016, 15:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2016, 15:48

Собрать из многостраничного документа на одну страницу?
Здравствуйте. Имеется многостраничный документ Corel Draw. Можно ли как-то...

Открытие многостраничного документа не с самого начала
Уважаемые форумчане! Подскажите пожалуйста, как в Word'е-2003 открывать...

Сквозная нумерация сторонних документов при массовой печати
Доброго времени суток! Господа профессионалы, необходимо реализовать решение...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru