Автор | Сообщение |
|
| постоянный участник
|
Пост N: 307
Зарегистрирован: 12.09.06
|
|
Отправлено: 30.07.07 23:10. Заголовок: Как использовать DOC-файл в качестве шаблона ?
Всем привет. Подскажите как можно реализовать печать Word-документа, в котором в нужном месте нужно поставить значение из полей БД или просто вычисляемые переменные (штук 20). Т.е. есть заготовка SAMPLE.DOC, в ней нужно поставить в нужных местах @POLE_NUM и т.д., а в программе на хХарборе, открыть этот документ (это я знаю как) и проставить по всем @xxxxx соответствующие значения (это я не знаю как). Может это нужно делать по другому, тогда подскажите как. Заранее спасибо.
| |
|
Ответов - 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
| |
|
|
| постоянный участник
|
Пост N: 309
Зарегистрирован: 12.09.06
|
|
Отправлено: 31.07.07 09:09. Заголовок: Re:
Pasha пишет: цитата: | В документе создать в нужном месте закладки |
| А как их создать ? Чуть подробнее в этом месте.... А если можно и не жалко рабочий пример кинуть мне на мыло 30195@mail.ru ? Буду очень благодарен.
| |
|
|
| Администратор
|
Пост N: 567
Зарегистрирован: 23.05.05
|
|
Отправлено: 31.07.07 09:37. Заголовок: Re:
Переместить курсор в нужную позицию документа Вставка - Закладка Набрать имя закладки (у меня это "Дата", "Сумма") Добавить ЗЫ Закладкой можно помечать и выделенную область документа Пример выслать сложновато... это ведь exe и БД Пробуй, там ничего сложного нет
| |
|
|
| постоянный участник
|
Пост N: 310
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.08.07 20:10. Заголовок: Re:
Спасибо, вроде все получилось. Только как после ВСТАВОК курсор в WORD'e вернуть на верх документа ? И второе, как отправить на печать 5 копий сразу ?
| |
|
|
| Администратор
|
Пост 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(...)
| |
|
|
| постоянный участник
|
Пост N: 311
Зарегистрирован: 12.09.06
|
|
Отправлено: 02.08.07 12:18. Заголовок: Re:
Спасибо !!!
| |
|
|
| постоянный участник
|
Пост 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 Подскажите правильный перевод в хХарбор, подробнее, чтоб понятно было и я не буду приставать потом с такими пустяками ! Заранее спасибо.
| |
|
|
| постоянный участник
|
Пост 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 копий или еще чего-тщ посложнее.
| |
|
|
| постоянный участник
|
Пост N: 328
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.08.07 18:49. Заголовок: Re:
Спасибо большое Петр !!! Петр пишет: цитата: | Мог бы переспросить о печати 5 копий или еще чего-тщ посложнее. |
| А можно переспросить про это ? Меня не пошлют, куда подальше ?
| |
|
|
| постоянный участник
|
Пост 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.
| |
|
|
| постоянный участник
|
Пост N: 329
Зарегистрирован: 12.09.06
|
|
Отправлено: 29.08.07 22:29. Заголовок: Re:
Спасибо Петр. Пошел разбираться. Куда пиво отправить ?
| |
|
|
|
| постоянный участник
|
Пост 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 Где копать ???
| |
|
|
| постоянный участник
|
Пост 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 ) Вот так дружок
| |
|
|
| |
Пост N: 247
Зарегистрирован: 08.04.06
|
|
Отправлено: 29.06.08 15:05. Заголовок: Ширина текущей строки
Подскажите, плиз, функцию (или это называется метод?) для получения в ворде ширины текущей строки в символах. Задача стоит такая: текст до одной ширины - оставляем как есть, текст до другой ширины (что-то уже не влезает в A4) - уменьшаем шрифт, а вот если сильно не влезает - переворачиваем в Landscape. Это-то всё не вопрос, а вот как получить искомую ширину? Наверняка ведь кто-нибудь сталкивался?
| |
|
|
| |
Пост N: 10
Зарегистрирован: 04.09.08
|
|
Отправлено: 12.09.08 14:39. Заголовок: так так так. я не по..
так так так. я не понял как все это выглядит. мы имеем doc-шаблон, например такой: {{ head }} Бла бла бла {% for i :=1 to 10 massiv: Номер {{ i }} : massiv --------------- endfor %} потом открываем из программы шаблон и вызываем метод, например, Render с параметрами для head и massiv. получаем файл. сохраняем. так?))) если нет, то плохо)))))) почитал тему - ничего не понял. мы сначала открываем файл, потом ставим закладки, а только потом рендерим???? так чтоли?
| |
|
|
| постоянный участник
|
Пост N: 661
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.09.08 22:02. Заголовок: Давай ящик, вышлю ра..
Давай ящик, вышлю рабочий пример !
| |
|
|
| |
Пост N: 253
Зарегистрирован: 08.04.06
|
|
Отправлено: 12.09.08 22:49. Заголовок: Что-то на мой июньск..
Что-то на мой июньский вопрос никто ответил, хотя тема, как вижу, живая... Повторю попроще: как программно понять, влезет ли текущий документ при печати в границы печатного листа (в смысле правого края)?
| |
|
|
| |
Пост N: 302
Зарегистрирован: 08.04.06
|
|
Отправлено: 26.05.09 13:32. Заголовок: Петр Собираюсь печа..
Петр Собираюсь печатать Word'овский документ постранично, т.е. каждую страницу выводить отдельным PrintOut'ом. Вопросик: как узнать, сколько всего страниц нужно напечатать? А то буду печатать третью там, четвёртую, а их всего две...
| |
|
|
| постоянный участник
|
Пост N: 663
Зарегистрирован: 09.10.06
|
|
Отправлено: 27.05.09 21:59. Заголовок: Узнать сколько стран..
Узнать сколько страниц в документе можно так ?oWord:ActiveDocument:ActiveWindow:Panes(1/*i*/):Pages():Count
| |
|
|
| |
Пост N: 305
Зарегистрирован: 08.04.06
|
|
Отправлено: 27.05.09 22:29. Заголовок: Re: Петр
Петр пишет: цитата: | ?oWord:ActiveDocument:ActiveWindow:Panes(1/*i*/):Pages():Count |
| Петр, заранее спасибо, но сразу по тексту вопрос: i - это какая-то переменная?
| |
|
Ответов - 33
, стр:
1
2
All
[только новые]
|
|
|