Форум » [x]Harbour » Настройка формата листа DOC-файла... » Ответить

Настройка формата листа DOC-файла...

Andrey: Как сделать настройку формата страницы листа .DOC в зависимости от ширины таблицы ? Ширину своей таблицы уже знаю: [pre2]nWidthTsb := oBrw:GetAllColsWidth() // ширина всех колонок таблицы в пикселах[/pre2] Задаю поля страницы (но они в других единицах): [pre2] oWord:ActiveDocument:PageSetup:LeftMargin := 72.0 //~2.5 см // книжная ориентация oWord:ActiveDocument:PageSetup:Orientation := wdOrientPortrait // альбомная ориентация oWord:ActiveDocument:PageSetup:Orientation := wdOrientLandscape[/pre2] Сколько пикселов в формате А4 для книжной и альбомной ориентации листа ? Кто знает как это сделать ?

Ответов - 43, стр: 1 2 3 All

Pasha: Прежде надо точно сформулировать задачу, и не путать теплое с мягким количество пикселей на экране для tsbrowse из hmg и ширину листа A4 в метрической системе или в дюймах или пикселях. В таблице word таблица tsbrowse наверное будет представлена по другому ?

SergKis: Andrey Паша прав. А инфа по переводу в Google, к примеру https://www.calc.ru/piksel-v-santimetr.html

Dima: Andrey http://biznessystem.ru/kakoj-razmer-v-pikselyah-imeet-list-formata-a4/


Andrey: Pasha пишет: не путать теплое с мягким количество пикселей на экране для tsbrowse из hmg и ширину листа A4 в метрической системе или в дюймах или пикселях. Вот я это и хочу понять. Спасибо большое за ссылки ! Пошёл учить матчасть...

Andrey: Как мне в Word сделать страницу формата А1? Формат А1 соответствует следующему размеру - 594х841 мм. А редактор Word имеет ограничение в установке размеров - 55,87 см по любой из сторон листа. Таким образом, установить формат А1 в редакторе невозможно.

Dima: Andrey Спроси гугл )) https://social.technet.microsoft.com/Forums/office/ru-RU/f929546a-5411-4954-9838-f2c7f393faa3/-210-word-2007?forum=msoclientru

Andrey: Ну да... Буду знать теперь: Ms Word не поддерживает форматы А2,А1,А0 ! А OpenOffice поддерживает !

Andrey: Наконец то понял... До этого как то не особо интересовался. Единицы измерения Word http://machula.ru/edinitsyi-izmereniya-word/ То бишь параметры - oWord:ActiveDocument:PageSetup:LeftMargin := 72.0 //~2.5 см Переводятся как 72 пункта (72 points)

Andrey: Dima пишет: http://biznessystem.ru/kakoj-razmer-v-pikselyah-imeet-list-formata-a4/ Не понял. Я не нашёл как задать DPI в Ворде. Кто подскажет как это сделать ?

PSP: DPI имеет отношение к печати в целом, а не к ворду. https://ru.wikipedia.org/wiki/Dots_per_inch

Dima: Andrey Гугл снова )) https://social.msdn.microsoft.com/Forums/ru-RU/cff55f5d-5ac4-4bda-b224-c756fb04caa5/dpi-ms-word?forum=miscellaneousru

Andrey: Задаю формат листа А3 через word.ch : [pre2] oWord:ActiveDocument:PageSetup:PaperSize := wdPaperA3 // лист A3[/pre2] В программе потом вылетает на этой строке: Error 2447764/-2147352573 DISP_E_MEMBERNOTFOUND: _PAPERSIZE Called from TOLEAUTO:_PAPERSIZE(0) Called from BRW2DOC(99) in module: Tsb2doc.prg А так работает - [pre2]oWord:ActiveDocument:PageSetup:PaperSize := wdPaperA4 // лист A4[/pre2] Как задать размер листа больше А4 ?

SergKis: Andrey Руками можешь поставить в word формат A3 ? Сейчас не знаю, но раньше, если принтер (драйвер) не поддерживал A3, то и word не включал.

Andrey: SergKis пишет: Руками можешь поставить в word формат A3 ? Не ставиться, нет такого формата в Ворде 2003. Сделал по другому:[pre2] // Word имеет ограничение в установке размеров - 55,87 см по любой из сторон листа. // 55.87 сантиметров равно 1 583.717 пунктов // Высоту листа возьмем как у A4 (210х297 мм) == 297 // 297 миллиметров равно 841.889862 пункта oWord:ActiveDocument:PageSetup:PageWidth = 1583 oWord:ActiveDocument:PageSetup:PageHeight = 841 // книжная ориентация oWord:ActiveDocument:PageSetup:Orientation := wdOrientPortrait[/pre2] Спасибо ВСЕМ за подсказки !

Andrey: Экспорт в таблицу Ворда из Tsbrowsa получается у меня нормально. Единственно, что некрасиво делается - это автоматическое растягивание таблицы по ширине страницы !!! Можно ли как то это убрать ? Кто нибудь сталкивался с этим ? Код создания таблицы: [pre2] nLenHead++ // шапка таблицы if AScan( oBrw:aColumns, { |o| o:cFooting != Nil } ) > 0 nLenHead++ endif nRowDbf := oBrw:nLen - oBrw:nAt + nLenHead + 1 // кол-во строк в таблице + шапка + подвал таблицы nColDbf := Len( oBrw:aColumns ) // кол-во столбцов в таблице // ------- создание таблицы --------------- oRange = oActive:Range(len(cTitle)+2) // таблица с автоподстройкой по ширине странице oTbl:= oWord:ActiveDocument:Tables:Add(oRange,nRowDbf,nColDbf,wdWord9TableBehavior,wdAutoFitContent)[/pre2] Пробовал менять константу wdAutoFitContent на 0,1,2 - всё равно одинаково растягивает таблицу.

Andrey: Перехожу с HBOLE.LIB на HBWIN.LIB [pre2] TRY oWord := GetActiveObject( "Word.Application" ) CATCH TRY oWord := CreateObject( "Word.Application" ) CATCH cMsg := "Не могу запустить - Microsoft Word (Ошибка:" + Ole2TxtError() + ")!;;" cMsg += "(Не установлен на этом компьютере !);" MsgStop(cMsg,"ОШИБКА!") RETURN NIL END END[/pre2] А чем заменить функцию Ole2TxtError() ?

gfilatov2002: Andrey пишет: чем заменить функцию Ole2TxtError() ? Попробуй использовать win_oleErrorText()

Dima: win_oleErrorText()

Andrey: СПАСИБО ! А есть описание функций HBWIN.LIB ?

Sergy: Andrey пишет: А есть описание функций HBWIN.LIB Тут есть: https://github.com/Petewg/harbour-core/wiki/HBWIN

Dima: Sergy пишет: Тут есть Хотел я ему эту ссылку дать , но там же далеко не все функции...

Andrey: Спасибо ! Добавил к себе в документацию...

Sergy: Dima пишет: Хотел я ему эту ссылку дать , но там же далеко не все функции... После изучения "далеко не всех функций" есть смысл залезть в \hb\contrib\hbwin\*.* - там точно "всё есть".

Dima: Sergy пишет: там точно "всё есть" Тоже не рискнул дать ему этот вариант

Andrey: Сделал такую конструкцию: [pre2] Try oWord := CreateObject( "Word.Application" ) Catch cMsg := REPLICATE( "-._.", 16 ) + ";;" cMsg += SPACE( 5 ) + "On this computer MS Word is not installed !;;" cMsg += SPACE( 5 ) + " Error code [" + win_oleErrorText() + "];;" cMsg += SPACE( 5 ) + " Error code [" + Ole2TxtError() + "];;" cMsg += REPLICATE( "-._.", 16 ) + ";;" cMsg := AtRepl( ";", cMsg, CRLF ) MsgStop( cMsg , "Error!") Return .F. End Try[/pre2] Результат при отсутствии Ворда на компе: Получается, что можно пользоваться обеими функциями ? Непонятно получается. Я у себя в проекте указываю нужные мне библиотеки: -lminigui -ltsbrowse -lhbxlsxml -lhbwin А к проекту ещё добавляются библиотеки, в ходе компиляции ? Ole2TxtError() содержится в 2х библиотеках - hbole.lib и xhb.lib

Dima: Andrey пишет: hbole.lib gfilatov2002 пишет: Ожидал подобное замечание, поскольку произошел отказ от устаревшей библиотеки HbOLE И на хрена ты её туда лепишь теперь ?

Andrey: Dima пишет: И на хрена ты её туда лепишь теперь ? Ничего я не леплю. Вот читай что у меня в проекте: Andrey пишет: Я у себя в проекте указываю нужные мне библиотеки: -lminigui -ltsbrowse -lhbxlsxml -lhbwin Как другие библиотеки добавляются к моему проекту ?

Andrey: Опять вопрос по Ворду: Как сохранить активный документ ? Вот код:[pre2] ..... oWord := TOleAuto():New( "Word.Application" ) oDocs := oWord:Documents oDocs:Open( cFileDoc ) oActive := oWord:ActiveDocument oSelect := oWord:Selection oMarks := oActive:BookMarks MyDocFindRepl(oWord, aDocVal) // Функция поиска и замена простых переменных по тексту doc MyDocTable(oWord, oSelect, aDimDbf) // Функция поиска и замена для таблицы по тексту doc oWord:Visible := lActivate // значение равно .T. oWord:WindowState := 1 // Maximize oWord:Selection:HomeKey(6) // начало документа oActive:Saved := lSave // значение равно .T. oActive:SaveAs( cFileDoc ) // сохранить документ [/pre2] Файл не сохраняестя.... Что нужно добавить/исправить чтобы файл сохранялся ?

Pasha: Andrey пишет: Что нужно добавить/исправить чтобы файл сохранялся ? Наверное надо убрать эту строку: oActive:Saved := lSave // значение равно .T. А то как-то странно получается: после Saved:=.t. word знает, что документ уже сохранен. И зачем тогда удивляться, что по SaveAs он не сохраняется ? Только что же была установлена отметка, что уже и так.

Andrey: Pasha пишет: Наверное надо убрать эту строку: Да перенес это из какого то проекта давно уже. А запись и не нужна была, так и кочевала из проекта в проект. Убрал. Заработало ! Спасибо большое !

Pasha: Andrey пишет: Да перенес это из какого то проекта давно уже. А запись и не нужна была, так и кочевала из проекта в проект. А вызов SaveAs тоже из другого проекта ? Ты если в ворде открываешь документ, изменяешь, потом сохраняешь его через Сохранить как ? Или просто Сохранить ? Тогда надо использовать не SaveAs, а Save

Andrey: Pasha пишет: Тогда надо использовать не SaveAs, а Save Понял. Спасибо !!! Ещё один вопрос: Как сделать поиск замену в подвале документа ? В свое время (с твоей помощью) сделал поиск-замену по тексту: [pre2]/////////////////////////////////////////////////////////////////////////////////////////// // Функция поиска и замена простых переменных по тексту doc FUNCTION MyDocFindRepl(oWord, aDocVal) LOCAL nI, oFind, cFind, cReplace oFind := oWord:Selection:Find FOR nI := 1 TO LEN(aDocVal) cFind := UPPER(ALLTRIM(aDocVal[nI,1])) cReplace := CStr( aDocVal[nI,2] ) // стандартная функция перевода в текст oFind:ClearFormatting() oFind:Replacement:ClearFormatting() oFind:Text := cFind // пример "#M->Date1" oFind:Replacement:Text := cReplace // пример "01/01/2016" oFind:Forward := .T. //oFind:Wrap := 1 oFind:Wrap = wdFindContinue oFind:Format = .F. oFind:MatchCase = .F. oFind:MatchWholeWord = .F. oFind:MatchWildcards = .F. oFind:MatchSoundsLike = .F. oFind:MatchAllWordForms = .F. oFind:Execute(cFind,0,0,0,0,0,1,1,0,cReplace,wdReplaceAll) NEXT RETURN NIL[/pre2] А как делать в подвале документа - не знаю. Сейчас просто потребовалось.

Pasha: А что такое подвал документа ? В общем случае ответ простой. Как в ворде делается - так и через ole делать. Включить макросы, и..

Andrey: Pasha пишет: Как в ворде делается - так и через ole делать. Включить макросы, и.. Вот получил макрос: [pre2]Sub Макрос9_подвал() ' ' Макрос9_подвал Макрос ' If ActiveWindow.View.SplitSpecial <> wdPaneNone Then ActiveWindow.Panes(2).Close End If If ActiveWindow.ActivePane.View.Type = wdNormalView Or ActiveWindow. _ ActivePane.View.Type = wdOutlineView Then ActiveWindow.ActivePane.View.Type = wdPrintView End If ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader If Selection.HeaderFooter.IsHeader = True Then ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter Else ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader End If Selection.Font.Size = 10 Selection.TypeText Text:="Строка тест 1" Selection.TypeParagraph Selection.TypeText Text:="Строка тест 2" Selection.MoveUp Unit:=wdLine, Count:=1, Extend:=wdExtend Selection.HomeKey Unit:=wdLine, Extend:=wdExtend Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument End Sub[/pre2] Блин... и как его переделать под Харбор ?

Pasha: Ну взять и переделать. Тут и переделывать то ничего не надо. Какая строка вызывает затруднения ?

Andrey: Pasha пишет: Какая строка вызывает затруднения ? Вообще всё - темный лес сейчас для меня. Забыл уже как раньше переделывал... Уже года два/три не занимался макросами. Если не сложно, помоги пожалуйста.

Pasha: Andrey пишет: If ActiveWindow.View.SplitSpecial <> wdPaneNone Then Ну помоги я так понимаю научи, а не тупо папазавасюрешалматематику. Начнем с первой строки. oWindow := oActive:ActiveWindow If oWindow:View:SplitSpecial <> 0 для трансляции строки вида Selection.MoveUp Unit:=wdLine, Count:=1, Extend:=wdExtend надо найти описание метода MoveUp, и перевести ключевые параметры в позиционные

Andrey: Pasha пишет: а не тупо папазавасюрешалматематику. Да, да ... Есть такое... Я вот макрос сделал и не понимаю зачем этот ВЕРХНИЙ кусочек, по моему это не относиться к колонтитулу, а относится к перемещению по меню... Нашёл вот более правильное на VB: [pre2]Добавление текста в нижние колонтитулы документа: Следующий пример кода задает шрифт текста, который необходимо вставить в основной нижний колонтитул каждого раздела документа, а затем вставляет текст в нижний колонтитул. В этом примере кода используется активный документ. For Each section As Word.Section In Me.Application.ActiveDocument.Sections Dim footerRange As Word.Range = section.Footers(Word.WdHeaderFooterIndex.wdHeaderFooterPrimary).Range footerRange.Font.ColorIndex = Word.WdColorIndex.wdDarkRed footerRange.Font.Size = 20 footerRange.Text = "Confidential" Next [/pre2] Правильно ли я мыслю или нет ? Или продолжать - сражаться с макросом ?

Pasha: Так подвал это нижний коллонититул, что ли ? Что вообще надо сделать ? А с макросом сражаться не надо. В макрос оформляются те команды, которые выполняет word, и которые можно повторить через ole. Поэтому надо включить макрос, выполнить только необходимые действия без лишних движений, и затем посмотреть, какими командами word их выполняет. Ну и просто повторить их.

Andrey: Pasha пишет: Так подвал это нижний коллонититул, что ли ? Что вообще надо сделать ? 1) Удалить то что там стоит (нижний колонтитул). 2) Вставить 10 шрифтом красным цветом 4 строчки - "Тест строка 1", "Тест строка 2", и т.д.

Pasha: Ну вроде бы так: переключиться на нижний коллонтитул ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter выделить строку Selection.EndKey Unit:=wdLine, Extend:=wdExtend удалить ее Selection.Delete Unit:=wdCharacter, Count:=1 ввести текст Selection.TypeText Text:="444" Selection.TypeParagraph переключиться обратно на документ ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument Действия в коллонтитуле я делал от балды. Сделай, что там тебе надо, в макросе будет записано то, что ты делаешь. Ну и переводи на харбор. А то подвал какой-то, фиг поймешь

Andrey: Сделал функцию записи в нижний колонтитул. Отдельный пример работает отлично. Порядок следования библиотек в проекте: [pre2]-lminigui -ltsbrowse.lib -lhbole -lhbwin -lxhb[/pre2] Вставляю в свою большую систему, функция перестаёт работать. Порядок следования библиотек в проекте: [pre2]-lminigui -ltsbrowse.lib -lhbwin -lhbole -lxhb[/pre2] Вот такая ошибка: Вот сам код функции: [pre2]/////////////////////////////////////////////////////////////////////////////////////////// // Функция замены и вставки нижнего колонтитула в doc // The function to replace and insert the footer in doc FUNCTION MyDocFooter(oActive, aStroka) Local footerRange, oSection, ofooterRange, oRange Local aFColor, nI, cStroka := "" //aStroka := { "Тестовая строка № 1", "Тестовая строка № 2", "Тестовая строка № 3" } For nI := 1 TO LEN(aStroka) cStroka += aStroka[nI] If nI != LEN(aStroka) cStroka += CRLF Endif Next aFColor := BLUE // цвет текста For Each oSection In oActive:Sections // строка 914 - вылет здесь ofooterRange := oSection:Footers For Each footerRange In ofooterRange oRange := footerRange:Range oRange:Font:Color := RGB(aFColor[1],aFColor[2],aFColor[3]) oRange:Font:Name := "Times New Roman" oRange:Font:Size := 10 oRange:Font:Bold := .T. oRange:Text = cStroka oRange:ParagraphFormat:Alignment = wdAlignParagraphCenter Next Next RETURN NIL[/pre2] Подскажите пожалуйста почему так происходит и как исправить ?

Pasha: Для начала наверное надо прекратить использовать очень старую библиотеку hbole (это видно по тому, что задействован класс TOleAuto), а использовать аналогичные средства из hbwin, тем более там отличия в основном только в инициализации. Ну а на такой вопрос: почему тестовый пример работает, а в большом проекте вылет вряд ли кто-нибудь вообще ответит по понятным причинам.



полная версия страницы