On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение
постоянный участник




Пост N: 307
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 30.07.07 23:10. Заголовок: Как использовать DOC-файл в качестве шаблона ?


Всем привет.
Подскажите как можно реализовать печать Word-документа, в котором в нужном месте нужно поставить значение из полей БД или просто вычисляемые переменные (штук 20).
Т.е. есть заготовка SAMPLE.DOC, в ней нужно поставить в нужных местах @POLE_NUM и т.д.,
а в программе на хХарборе, открыть этот документ (это я знаю как) и проставить по всем @xxxxx соответствующие значения (это я не знаю как).

Может это нужно делать по другому, тогда подскажите как.

Заранее спасибо.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 33 , стр: 1 2 All [только новые]


Администратор




Пост N: 566
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 31.07.07 08:59. Заголовок: Re:


В документе создать в нужном месте закладки

oWord := TOleAuto():New( "Word.Application" )
oDocs := oWord:Documents
oDocs:Open( cFile )

oActive := oWord:ActiveDocument
oSelect := oWord:Selection
oMarks := oActive:BookMarks
aBM := {}

AADD(aBM, 'Дата', '"'+RTrim(Str(Day(Date)))+'" '+Month(Date)+Str(Year(Date),5)+' р.')
AADD(aBM, 'Сумма', StrTran(Str(Summa, 12, 2), '.', ','))
...

SetWMarks(oWord, oMarks, aBM)
oActive:Saved := .t.
oWord:Visible := .t.

Function SetWMarks(oWord, oBookMarks, aMarks)
Local oSelect := oWord:Selection
Local oBookMark, cName, nBM, xValue

for each oBookMark in oBookMarks
cName := HB_AnsiToOEM(oBookMark:Get('Name'))
xValue := nil
if (nBM := ASCAN(aMarks, {|a| Upper(a[1]) = Upper(cName)})) # 0
xValue := aMarks[nBM][2]
endif
if xValue # nil
oBookMark:Select()
oSelect:Invoke("InsertAfter", HB_OemToAnsi(xToSt(xValue)) )
endif
next
Return nil


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 309
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 31.07.07 09:09. Заголовок: Re:


Pasha пишет:

 цитата:
В документе создать в нужном месте закладки



А как их создать ? Чуть подробнее в этом месте....
А если можно и не жалко рабочий пример кинуть мне на мыло 30195@mail.ru ?
Буду очень благодарен.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 567
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 31.07.07 09:37. Заголовок: Re:


Переместить курсор в нужную позицию документа

Вставка - Закладка
Набрать имя закладки (у меня это "Дата", "Сумма")
Добавить

ЗЫ Закладкой можно помечать и выделенную область документа

Пример выслать сложновато... это ведь exe и БД
Пробуй, там ничего сложного нет

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 310
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 01.08.07 20:10. Заголовок: Re:


Спасибо, вроде все получилось.

Только как после ВСТАВОК курсор в WORD'e вернуть на верх документа ?

И второе, как отправить на печать 5 копий сразу ?


Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 568
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 02.08.07 08:20. Заголовок: Re:


Включаешь Сервис - Макросы - Начать Запись

Нажимаешь Ctrl - PgUp, затем печать 5 копий сразу
Останавливаешь запись, смотришь что получилось:

Selection.HomeKey Unit:=wdStory
Application.PrintOut FileName:="", Range:=wdPrintAllDocument, Item:= _
wdPrintDocumentContent, Copies:=5, Pages:="", PageType:=wdPrintAllPages, _
ManualDuplexPrint:=False, Collate:=True, Background:=True, PrintToFile:= _
False, PrintZoomColumn:=0, PrintZoomRow:=0, PrintZoomPaperWidth:=0, _
PrintZoomPaperHeight:=0

Запускаешь справку по Word VBA, смотришь значение константы wdStory
Затем смотришь метод PrintOut
Переводишь ключевые параметры в позиционные

Получаешь:

oSelect:HomeKey(6)
oWord:PrintOut(...)

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 311
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 02.08.07 12:18. Заголовок: Re:


Спасибо !!!

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 323
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 17.08.07 18:25. Заголовок: Re:


Пытаюсь открыть файл WORD'ом *.ТХТ в кодировке OEM или WINDOWS

Получил макрос:

ChangeFileOpenDirectory "C:\BIN\"
Documents.Open FileName:="TXT2SLK.TXT", ConfirmConversions:=False, _
ReadOnly:=False, AddToRecentFiles:=False, PasswordDocument:="", _
PasswordTemplate:="", Revert:=False, WritePasswordDocument:="", _
WritePasswordTemplate:="", Format:=wdOpenFormatAuto, XMLTransform:="", _
Encoding:=866

Подскажите правильный перевод в хХарбор, подробнее, чтоб понятно было и я не буду приставать потом с такими пустяками !

Заранее спасибо.



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 205
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 26.08.07 16:25. Заголовок: Re:


Andrey пишет:

 цитата:
Подскажите правильный перевод в хХарбор, подробнее, чтоб понятно было и я не буду приставать потом с такими пустяками !


Так подробнее или чтоб понятно было ?
И если для тебя это такой пустяк, то зачем приставать ?
Тебе не приходило в голову, что для "правильного перевода" нужно иметь не только обобщенное понятие об ООП, но и его реализации в VBA(VB6), [x]Harbour, особенностях реализации класса TOleAuto ?
В любом случае ловлю на слове.

Если ты получил макрос - то уже знаешь самое главное - как открыть редактор Visual Basic.
На всякий случай напомню: находясь в Ворде нажимаешь ALT-F11 (или меню Сервис -> Макрос -> Редактор VB )

Далее в редакторе нажимаешь F2 (или меню View-> Object Browser )
Вот мы находимся в Object Browser - мощном средстве VB, с помощью которого можна получить море ценной информации.

В выпадающем списке Project\Library (по умолчанию там установлено All Libraries) выбираем нужное, в нашем случае библиотеку Word.
В поле ввода Search Word вводим искомое, для начала ChangeFileOpenDirectory и жмем кнопку Search ( такая с биноклем).

Смотрим на Search Results
Видим, что ChangeFileOpenDirectory есть членом (member) двух класов Application и Global библиотеки Word.
Интуитивно понимаем, что нам лучше воспользоваться классом Application.
Видим также, что ChangeFileOpenDirectory это метод (характерный зеленый значек).
Ниже находим сл. Sub ChangeFileOpenDirectory(Path As String)
Значит нарисовалась такая цепочка библиотека Word - класс Application - метод ChangeFileOpenDirectory с параметром Path

У нас все готово для перевода в хХарбор

Значит
oWord := TOleAuto():New( "Word.Application" )
oWord:ChangeFileOpenDirectory( "C:\BIN\" )

Теперь дальше:
ищем Open. Здесь у нас выбор побогаче Но, впрочем, интересоваться мы будем лишь классом Documents

Function Open(FileName, [ConfirmConversions], [ReadOnly], [AddToRecentFiles], [PasswordDocument], [PasswordTemplate], [Revert], [WritePasswordDocument], [WritePasswordTemplate], [Format], [Encoding], [Visible], [OpenAndRepair], [DocumentDirection], [NoEncodingDialog], [XMLTransform]) As Document

Значит так
oWord:Documents:Open( ... )

впрочем, чаще пишут так
oDocs := oWord:Documents
oDocs:Open( ... )
равнозначно, но удобнее.

Разберемся с параметрами метода Open с помощью справки Microsoft Visual Basic ( легче всего сделать так: щелкнуть мышью по нижней панели Object Browser, там где Function Open(FileName, .. и нажав F1, выбрать необходимое, в нашем случае Open method as it applies to the Documents object ).
Обрати внимание на то, что некоторые параметры в справке определены как Optional Variant, некоторые Required.

По сути тебе надо передать 3 параметра из 16 :
FileName ( 1 в списке параметров), Format := wdOpenFormatAuto (10), Encoding:=866 (11).
В VBA есть такая примочка - поименнованые параметры (или ключевые). Это дает возможность, например, написать так
Documents.Open AddToRecentFiles:=False, FileName:="TXT2SLK.TXT"
или так
Documents.Open FileName:="TXT2SLK.TXT", AddToRecentFiles:=False
не заботясь о порядке следования параметров. Еще VBA (С++) поддерживает значение параметра по умолчанию.

В хХарбор такие вещи не проходят (если только с препроцессором не нашаманишь), ну да и не надо.
По привычке можно написать Open( cFile,,,,,,,,,0,"866") - но это работать не будет, более того приведет к ошибке времени исполнения.
Сработает Open( cFile, .f., .f., .f., "", "", .f., "", "", 0,"866")
Т.е.если ты собрался передать несколько параметров из [x]Harbour, например, как в нашем случае 1, 10, 11, то тебе придется передавать параметры с 1 по 11. Так реализован класс TOleAuto.
Если метод принимает 20 параметров, а реально ты используешь 1 и 20, готовся передавать все 20.
Передавать следует или значения по умолчанию ( см.справку ) или требуемое значение, не NIL.

Также в данном случае обрати внимание на 0 - это значение константы wdOpenFormatAuto, его тоже легче всего найти с помощью Object Browser.

Значит окончательно
cFile := "1.txt"
oWord := TOleAuto():New( "Word.Application" )
oWord:ChangeFileOpenDirectory( "C:\BIN\" )

oDocs := oWord:Documents
oDocs:Open( cFile, .f., .f., .f., "", "", .f., "", "", 0,"866")

Voila..

P.S. В данном случае я использовал Office 2003.
P.P.S. Пример для разбора ты выбрал сам. IMHO для обработки текстовых файлов возможностей [x]Harbour выше крыши.
Мог бы переспросить о печати 5 копий или еще чего-тщ посложнее.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 328
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 28.08.07 18:49. Заголовок: Re:


Спасибо большое Петр !!!

Петр пишет:

 цитата:
Мог бы переспросить о печати 5 копий или еще чего-тщ посложнее.




А можно переспросить про это ? Меня не пошлют, куда подальше ?



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 211
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 28.08.07 22:59. Заголовок: Re:


Andrey пишет:

 цитата:
А можно переспросить про это ?



Про что это ?

5 копий?
Вот макрос
Application.PrintOut FileName:="", Range:=wdPrintAllDocument, Item:= _
wdPrintDocumentContent, Copies:=5, Pages:="", PageType:=wdPrintAllPages, _
ManualDuplexPrint:=False, Collate:=True, Background:=True, PrintToFile:= _
False, PrintZoomColumn:=0, PrintZoomRow:=0, PrintZoomPaperWidth:=0, _
PrintZoomPaperHeight:=0

Видим, что нужно использовать метод PrintOut класса Application, который, как уже мы знаем помещен в библиотеку Word
значит
oWord := TOleAuto():New( "Word.Application" )
..
oWord:PrintOut(...)

Теперь разберемся с параметрами
Из справки
Sub PrintOut([Background], [Append], [Range], [OutputFileName], [From], [To], [Item], [Copies], [Pages], [PageType], [PrintToFile], [Collate], [FileName], [ActivePrinterMacGX], [ManualDuplexPrint], [PrintZoomColumn], [PrintZoomRow], [PrintZoomPaperWidth], [PrintZoomPaperHeight])

Находим с помощью Object Browser или справки значения констант,
теперь одним глазом смотрим на макрос, вторым подглядываем в справку на значения параметров по умолчанию и подставляем параметры ( с 1 по 8 - 8 параметр и есть заветное число копий, в нашем случае 5, остальные нам по условию задачи не нужны ) и получаем

#define wdPrintAllDocument 0
#define wdPrintDocumentContent 0
#define wdPrintAllPages 0

oWord := TOleAuto():New( "Word.Application" )
oDocs := oWord:Documents
oDocs:Open(...)
oWord:PrintOut( .t., .f., wdPrintAllDocument, "", "", "", wdPrintDocumentContent, 5 ) //, "", wdPrintAllPages, .f., .t., "", "", 0, 0, 0, 0 )
oWord:Quit()
Можно обойтись без oDocs:Open(...) но тогда нужно задать значение параметру FileName, в нашем случае оно равно "", т.е. будет печататься активный документ, открытый с помощью метода Open.

Andrey пишет:

 цитата:
Меня не пошлют, куда подальше ?



Возможно так бы и получилось..
Но в этом методе есть небольшой подвох.
Прочитав справку
From Optional Variant. The starting page number when Range is set to wdPrintFromTo.
To Optional Variant. The ending page number when Range is set to wdPrintFromTo
так и тянет написать
oWord:PrintOut( .t., .f., wdPrintAllDocument, "", 0, 0.. и получить ошибку.
К тому же попробуй догадайся, что ActivePrinterMacGX нужно определить как "" не читая Help included with Microsoft Office Macintosh Edition.



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 329
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 29.08.07 22:29. Заголовок: Re:


Спасибо Петр.
Пошел разбираться.
Куда пиво отправить ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 330
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 31.08.07 11:00. Заголовок: Re:


Залез в хелп, нашел что хотел и обломс....

SaveAs(FileName, FileFormat, LockComments, Password, AddToRecentFiles, WritePassword, ReadOnlyRecommended, EmbedTrueTypeFonts, SaveNativePictureFormat, SaveFormsData, SaveAsAOCELetter, Encoding, InsertLineBreaks, AllowSubstitutions, LineEnding, AddBiDiMarks)


Пытаюсть полученный текст записать под другим именем как doc-файл, где
cFileDoc := "C:\test_word\test.doc"

oDocs:SaveAs( cFileDoc, wdFormatDocument,.f.,"",.t.,"",.f.,.f.,.f.,.f.,20880,.f.,.f.,0,.f.)


Вываливается с ошибкой.....


Error Word.Application:DOCUMENTS/16389 E_FAIL: SAVEAS Arguments: ( [ 1] = Type: C Val: E:
\@MyWork\my_HARBOUR\Word_Txt\mar02.doc [ 2] = Type: N Val: 0 [ 3] = Type: L Val:
.F. [ 4] = Type: C Val: [ 5] = Type: L Val: .T. [ 6] = Type: C Val: [ 7] = Type: L Val:
.F. [ 8] = Type: L Val: .F. [ 9] = Type: L Val: .F. [10] = Type: L Val: .F. [11] = Type: N
Val: 20880 [12] = Type: L Val: .F. [13] = Type: L Val: .F. [14] = Type: N Val:
0 [15] = Type: L Val: .F.)

Error at ...: TOLEAUTO:SAVEAS(0) in Module: win32ole.prg
Called from : WORD2OPEN(70) in Module: Word_OpenTxt.prg

Где копать ???


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 215
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 31.08.07 12:59. Заголовок: Re:


Andrey пишет:

 цитата:
Где копать ???



Где копал, там и копай, только глубже

Что представляет собой конструкция oDocs:SaveAs(..) ?
Это вызов метода SaveAs(..) класса Documents ( oDocs := oWord:Documents )
Извини, но SaveAs(..) член класса Document, читай внимательно.
Ты пытаешся вызвать несуществующий метод SaveAs() класса Documents - отсюда и ошибка.

Внимательно прочитав справку ты б написал или
oMyDocument := oDocs:Open( ... )
oMyDocument:SaveAs( cFileDoc, wdFormatDocument )
или
oWord:ActiveDocument:SaveAs( cFileDoc, wdFormatDocument )

Вот так дружок







Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 247
Зарегистрирован: 08.04.06
ссылка на сообщение  Отправлено: 29.06.08 15:05. Заголовок: Ширина текущей строки


Подскажите, плиз, функцию (или это называется метод?) для получения в ворде ширины текущей строки в символах.
Задача стоит такая: текст до одной ширины - оставляем как есть, текст до другой ширины (что-то уже не влезает в A4) - уменьшаем шрифт, а вот если сильно не влезает - переворачиваем в Landscape. Это-то всё не вопрос, а вот как получить искомую ширину?
Наверняка ведь кто-нибудь сталкивался?

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 10
Зарегистрирован: 04.09.08
ссылка на сообщение  Отправлено: 12.09.08 14:39. Заголовок: так так так. я не по..


так так так.
я не понял как все это выглядит.

мы имеем doc-шаблон, например такой:
{{ head }}
Бла бла бла
{% for i :=1 to 10 massiv:
Номер {{ i }} : massiv
---------------
endfor %}

потом открываем из программы шаблон и вызываем метод, например, Render с параметрами для head и massiv.
получаем файл. сохраняем. так?))) если нет, то плохо))))))

почитал тему - ничего не понял.
мы сначала открываем файл, потом ставим закладки, а только потом рендерим???? так чтоли?


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 661
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 12.09.08 22:02. Заголовок: Давай ящик, вышлю ра..


Давай ящик, вышлю рабочий пример !

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 253
Зарегистрирован: 08.04.06
ссылка на сообщение  Отправлено: 12.09.08 22:49. Заголовок: Что-то на мой июньск..


Что-то на мой июньский вопрос никто ответил, хотя тема, как вижу, живая...
Повторю попроще: как программно понять, влезет ли текущий документ при печати в границы печатного листа (в смысле правого края)?

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 302
Зарегистрирован: 08.04.06
ссылка на сообщение  Отправлено: 26.05.09 13:32. Заголовок: Петр Собираюсь печа..


Петр
Собираюсь печатать Word'овский документ постранично, т.е. каждую страницу выводить отдельным PrintOut'ом. Вопросик: как узнать, сколько всего страниц нужно напечатать? А то буду печатать третью там, четвёртую, а их всего две...

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 663
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 27.05.09 21:59. Заголовок: Узнать сколько стран..


Узнать сколько страниц в документе можно так
?oWord:ActiveDocument:ActiveWindow:Panes(1/*i*/):Pages():Count


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 305
Зарегистрирован: 08.04.06
ссылка на сообщение  Отправлено: 27.05.09 22:29. Заголовок: Re: Петр


Петр пишет:

 цитата:
?oWord:ActiveDocument:ActiveWindow:Panes(1/*i*/):Pages():Count


Петр, заранее спасибо, но сразу по тексту вопрос: i - это какая-то переменная?

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 33 , стр: 1 2 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 19
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет