Форум » [x]Harbour » Печать таблицы по шаблону ГОСТ » Ответить

Печать таблицы по шаблону ГОСТ

TimTim: Добрый день! Решил начать новую тему, т.к. мой случай это не простая печать таблицы. Хотя администратор может двинуть тему в вопрос dimao по своему усмотрению. Задача состоит в том, чтобы по вот такому шаблону https://my-files.ru/tgwekj напечатать таблицу. Проблема не только в том, что на каждой странице помимо основной таблицы надо печатать еще и таблицу строки которой расположены вертикально, а еще в том, что страниц отчета может быть больше сотни. Это подробный перечень деталей некоторого изделия. Получается, что страница имеет заголовок, вертикальную таблицу-"боковик" и таблицу-подвал. "Боковик" и таблица-подвал состоят из постоянных данных. Ну и поскольку ГОСТ, то все должно быть строго нужного размера, вплоть до толщины линий. Посмотрел DBF_to_XLS_03 и DBF_to_DOC_03 от Андрея. Это сотню страниц шаблона делать в Word. А если 120 страниц? Пример, \MiniGui\SAMPLES\Advanced\Tsb_Brw2xml впечатляет. Наверное, это то, что нужно. Но можно ли там (и как) печатать вертикальные таблицы параллельно с горизонтальными? И можно ли сразу задать параметры страницы для печати и сделать разбивку на страницы? Любая помощь приветствуется. Заранее спасибо.

Ответов - 15

Andrey: TimTim пишет: Пример, \MiniGui\SAMPLES\Advanced\Tsb_Brw2xml впечатляет. Пример классный, но если много данных, там тогда файл xml будет идти на гигабайты. Эксель на компе пользователя тогда просто "помрёт"...

Haz: Andrey пишет: Пример классный, но если много данных, там тогда файл xml будет идти на гигабайты. Эксель на компе пользователя тогда просто "помрёт"... Много это сколько ? Миллион ? по несколько тысяч строк выгружаю , не помирает ничего , размер xml идет на МЕГОбайты TimTim пишет: Но можно ли там (и как) печатать вертикальные таблицы параллельно с горизонтальными? И можно ли сразу задать параметры страницы для печати и сделать разбивку на страницы? Вертикальные столбцы поддерживаются , параметры страницы, разбивку и колонтирулы задаю последующим открытием через OLE и сохранением.

Haz: Haz пишет: не помирает ничего специально тестанул в поставку xmlxls от автора входит консольный пример , в нем задал 100 000 строк . через 12 секунд был сформирован xml размером 162 МБ , Excel его открывает 10 секунд , не давится сделал в 300 000 строк , формирование 30 сек и примерно столько же открытие в Excel , размер xml 487мб а теперь вопрос , Кому потребуется выгрузка 300 000 строк и более в реальной жизни.


TimTim: Haz пишет: Вертикальные столбцы поддерживаются , параметры страницы, разбивку и колонтирулы задаю последующим открытием через OLE и сохранением. Радует, что это возможно, но теперь понять бы как. Было бы здорово взглянуть на текст формирования вертикальной таблицы-боковика параллельно с основной таблицей и задание параметров страницы и т.д. через OLE. Это из [x]Harbour я никогда не делал.

Haz: TimTim пишет: Было бы здорово взглянуть гляди, не жалко пример приблизителен просто поток текста накидал. В реале все конечно сложнее и красивее будет. demo.prg [pre2] #require "hbxlsxml" PROCEDURE Main() LOCAL oXml, oSheet, cFile := "example.xml" LOCAL i LOCAL oObj LOCAL nRow := 0 LOCAL cStr := "" SET Date FORMAT 'DD.MM.YYYY' REQUEST HB_CODEPAGE_RU1251, HB_CODEPAGE_RU866, HB_CODEPAGE_UTF8 EXTERN hb_StrToUTF8 Set( _SET_DATEFORMAT, "dd.mm.yyyy" ) oXml := ExcelWriterXML():New( cFile ) oXml:setOverwriteFile( .T. ) oXml:setCodePage( "RU1251" ) oObj := oXml:addStyle( "Style1" ) oObj:alignRotate( 90 ) oObj:alignHorizontal( "Center" ) oObj:alignVertical( "Center" ) oObj:SetfontName( 'Arial' ) oObj:fontSize( 10 ) oObj:SetfontColor( "#C0C0C0") oObj := oXml:addStyle( "Style2" ) oObj:Border( "All", 1, "Automatic", "Continuous" ) oObj:alignRotate( 90 ) oObj:alignHorizontal( "Center" ) oObj:alignVertical( "Center" ) oObj:SetfontName( 'Arial' ) oObj:fontSize( 10 ) oObj:SetfontColor( "#000000") oObj := oXml:addStyle( "Style3" ) oObj:Border( "All", 2, "Automatic", "Continuous" ) oObj:alignHorizontal( "Center" ) oObj:alignVertical( "Center" ) oObj:alignWraptext() oObj:SetfontName( 'Arial' ) oObj:SetfontSize( 10 ) oObj:setFontBold() oObj := oXml:addStyle( "Style4" ) oObj:Border( "All", 1, "Automatic", "Continuous" ) oObj:alignHorizontal( "Center" ) oObj:alignVertical( "Center" ) oObj:alignWraptext() oObj:SetfontName( 'Arial' ) oObj:SetfontSize( 10 ) oSheet := oXml:addSheet( "Plan1" ) oObj := oSheet oObj:columnWidth( 1, 22 ) oObj:columnWidth( 2, 22 ) oObj:columnWidth( 3, 22 ) oObj:columnWidth( 4, 45 ) oObj:columnWidth( 5, 200 ) oObj:columnWidth( 6, 45 ) oObj:columnWidth( 7, 200 ) oObj:writeString( 1, 1, "Н.контроль / /" , "Style1" ) oObj:cellMerge( 1, 1, 0, 5 ) oObj:writeString( 1, 2, "перв. Применение" , "Style2" ) oObj:cellMerge( 1, 2, 0, 5 ) oObj:writeString( 1, 3, "" , "Style2" ) oObj:cellMerge( 1, 3, 0, 5 ) oObj:CellHeight( 1, 4, 40 ) oObj:writeString( 1, 4, "Поз. обозначение" , "Style3" ) oObj:writeString( 1, 5, "Наименование" , "Style3" ) oObj:writeString( 1, 6, "Кол" , "Style3" ) oObj:writeString( 1, 7, "Примечание" , "Style3" ) for i := 2 To 6 oObj:CellHeight( i , 4, 25 ) oObj:writeString( i, 4, "" , "Style4" ) oObj:writeString( i, 5, "" , "Style4" ) oObj:writeString( i, 6, "" , "Style4" ) oObj:writeString( i, 7, "" , "Style4" ) end oXml:writeData( cFile ) RETURN [/pre2] собирать так call c:\MiniGui\batch\compile.cmd demo /c /l hbxlsxml

TimTim: Ахренеть! В шоке. Да это уже красиво и работает. Пошел изучать и дописывать.

TimTim: Привет! Никак не могу пристроить еще одну вертикальную ячейку. После ячейки с "Перв.примен." должна идти ячейка с "Справ. №". Как бы я ее не пристраивал, например, oObj:writeString( 1, 1, "Н.контроль / /" , "Style1" ) oObj:cellMerge( 1, 1, 0, 12 ) oObj:writeString( 1, 2, "перв. Применение" , "Style2" ) oObj:cellMerge( 1, 2, 0, 5 ) oObj:writeString( 2 /*7*/, 2, "Справ. №" , "Style2" ) oObj:cellMerge( 2 /*7*/, 2, 0, 5 ) при открытии в Excel пишет ошибку. Метод cellMerge( row, col, width, height ) - объединение ячеек. Первые два параметра номера строки и колонки. А как понять третий и четвертый? В каких единицах задается ширина и высота ячеек и нельзя ли поменять единицы, скажем, в мм?

Haz: TimTim пишет: Никак не могу пристроить еще одну вертикальную ячейку Заполнение только слева направо и сверху вниз TimTim пишет: Метод cellMerge( row, col, width, height ) - объединение ячеек. Первые два параметра номера строки и колонки. А как понять третий и четвертый? третий и четвертый это насколько ячеек вправо и вниз объединть TimTim пишет: В каких единицах задается ширина и высота ячеек и нельзя ли поменять единицы, скажем, в мм? Можно рассчитав коэф пересчета для себя однажды ( я примерно так и делаю ) [pre2] #require "hbxlsxml" PROCEDURE Main() LOCAL oXml, oSheet, cFile := "example.xml" LOCAL i LOCAL oObj LOCAL nRow := 0 LOCAL cStr := "" SET Date FORMAT 'DD.MM.YYYY' REQUEST HB_CODEPAGE_RU1251, HB_CODEPAGE_RU866, HB_CODEPAGE_UTF8 EXTERN hb_StrToUTF8 Set( _SET_DATEFORMAT, "dd.mm.yyyy" ) oXml := ExcelWriterXML():New( cFile ) oXml:setOverwriteFile( .T. ) oXml:setCodePage( "RU1251" ) oObj := oXml:addStyle( "Style1" ) oObj:alignRotate( 90 ) oObj:alignHorizontal( "Center" ) oObj:alignVertical( "Left" ) oObj:SetfontName( 'Arial' ) oObj:fontSize( 10 ) oObj:SetfontColor( "#C0C0C0") oObj := oXml:addStyle( "Style2" ) oObj:Border( "All", 1, "Automatic", "Continuous" ) oObj:alignRotate( 90 ) oObj:alignHorizontal( "Center" ) oObj:alignVertical( "Center" ) oObj:SetfontName( 'Arial' ) oObj:fontSize( 10 ) oObj:SetfontColor( "#000000") oObj := oXml:addStyle( "Style3" ) oObj:Border( "All", 2, "Automatic", "Continuous" ) oObj:alignHorizontal( "Center" ) oObj:alignVertical( "Center" ) oObj:alignWraptext() oObj:SetfontName( 'Arial' ) oObj:SetfontSize( 10 ) oObj:setFontBold() oObj := oXml:addStyle( "Style4" ) oObj:Border( "All", 1, "Automatic", "Continuous" ) oObj:alignHorizontal( "Center" ) oObj:alignVertical( "Center" ) oObj:alignWraptext() oObj:SetfontName( 'Arial' ) oObj:SetfontSize( 10 ) oSheet := oXml:addSheet( "Plan1" ) oObj := oSheet oObj:columnWidth( 1, 22 ) oObj:columnWidth( 2, 22 ) oObj:columnWidth( 3, 22 ) oObj:columnWidth( 4, 45 ) oObj:columnWidth( 5, 200 ) oObj:columnWidth( 6, 45 ) oObj:columnWidth( 7, 200 ) oObj:writeString( 1, 1, "Н.контроль / /" , "Style1" ) oObj:cellMerge( 1, 1, 0, 12 ) oObj:writeString( 1, 2, "перв. Применение" , "Style2" ) oObj:cellMerge( 1, 2, 0, 5 ) oObj:writeString( 1, 3, "" , "Style2" ) oObj:cellMerge( 1, 3, 0, 5 ) oObj:CellHeight( 1, 4, 40 ) oObj:writeString( 1, 4, "Поз. обозначение" , "Style3" ) oObj:writeString( 1, 5, "Наименование" , "Style3" ) oObj:writeString( 1, 6, "Кол" , "Style3" ) oObj:writeString( 1, 7, "Примечание" , "Style3" ) for i := 2 To 6 oObj:CellHeight( i , 4, 25 ) oObj:writeString( i, 4, "" , "Style4" ) oObj:writeString( i, 5, "" , "Style4" ) oObj:writeString( i, 6, "" , "Style4" ) oObj:writeString( i, 7, "" , "Style4" ) end oObj:writeString( 7, 2, "Справ. N" , "Style2" ) oObj:cellMerge( 7, 2, 0, 6 ) oObj:writeString( 7, 3, "" , "Style2" ) oObj:cellMerge( 7, 3, 0, 6 ) for i := 7 To 15 oObj:CellHeight( i , 4, 25 ) oObj:writeString( i, 4, "" , "Style4" ) oObj:writeString( i, 5, "" , "Style4" ) oObj:writeString( i, 6, "" , "Style4" ) oObj:writeString( i, 7, "" , "Style4" ) end oObj:writeString( 16, 1, "Разраб / /" , "Style1" ) oObj:cellMerge( 16, 1, 0, 12 ) // сл секция oObj:writeString( 16, 2, "Подп. и дата " , "Style2" ) oObj:cellMerge( 16, 2, 0, 3 ) oObj:writeString( 16, 3, "" , "Style2" ) oObj:cellMerge( 16, 3, 0, 3 ) for i := 16 To 19 oObj:CellHeight( i , 4, 25 ) oObj:writeString( i, 4, "" , "Style4" ) oObj:writeString( i, 5, "" , "Style4" ) oObj:writeString( i, 6, "" , "Style4" ) oObj:writeString( i, 7, "" , "Style4" ) end // сл секция oObj:writeString( 20, 2, "Инв. N дубл." , "Style2" ) oObj:cellMerge( 20, 2, 0, 2 ) oObj:writeString( 20, 3, "" , "Style2" ) oObj:cellMerge( 20, 3, 0, 2 ) for i := 20 To 22 oObj:CellHeight( i , 4, 25 ) oObj:writeString( i, 4, "" , "Style4" ) oObj:writeString( i, 5, "" , "Style4" ) oObj:writeString( i, 6, "" , "Style4" ) oObj:writeString( i, 7, "" , "Style4" ) end oXml:writeData( cFile ) RETURN [/pre2]

Haz: TimTim пишет: oObj:writeString( 1, 2, "перв. Применение" , "Style2" ) oObj:cellMerge( 1, 2, 0, 5 ) oObj:writeString( 2 /*7*/, 2, "Справ. №" , "Style2" ) oObj:cellMerge( 2 /*7*/, 2, 0, 5 ) при открытии в Excel пишет ошибку. Еще раз повторюсь , заполнение только последовательное сверху вниз, слева направо после этого oObj:writeString( 7, 2, "Справ. №" , "Style2" ) уже нельзя писать в строку меньше 7 и столбец меньше 2 в этой строке .

TimTim: Haz пишет: Еще раз повторюсь , заполнение только последовательное сверху вниз, слева направо Урок усвоил и почти закончил формирование документа. Возникла еще одна проблемка. Формирования ячейки с разными типами линий на границах. По исходникам посмотрел вроде можно, но как? Поэкспериментировал - без успеха.

SergKis: TimTim пишет Формирования ячейки с разными типами линий на границах [pre2] METHOD ExcelWriterXML_Style:border( position, weight, color, linestyle ) LOCAL tmp hb_default( @position, "All" ) // All, Left, Top, Right, Bottom, DiagonalLeft, DiagonalRight hb_default( @weight, 1 ) // 0-Hairline, 1-Thin, 2-Medium, 3-Thick hb_default( @color, "Automatic" ) // Automatic, 6-hexadecimal digit number IN "#rrggbb" format OR it can be any of the MS Internet Explorer named colors hb_default( @linestyle, "Continuous" ) // None, Continuous, Dash, Dot, DashDot, DashDotDot, SlantDashDot, Double работают эти параметры метода, т.е. создаете Style5, Style6, ... и применяете на ячейках oObj := oXml:addStyle( "Style5" ) // oObj:Border( "All", 1, "Automatic", "Continuous" ) oObj:Border( "All", 1, "Automatic", "None" ) oObj:Border( "Left", 2, "Automatic", "Continuous" ) ... [/pre2]

TimTim: Спасибо SergKis ! Понял что делал не так Теперь осталось сделать разбивку на страницы и задать ориентацию листа, поля, колонтитулы. Это тоже можно делать в Xml-документе или это уже через Ole?

SergKis: TimTim пишет Это тоже можно делать в Xml-документе или это уже через Ole? В xml нет управления печатью. Сам ole не использую. Haz пишет То чего нет, к примеру форматирование перед печатью я выполняю открыв xml через ту же ole

Haz: TimTim пишет: Теперь осталось сделать разбивку на страницы Сегодня, весь день занят был. Спасибо Сергей подхватил тему. Завтра постараюсь скинуть про Ole

Haz: Теперь осталось сделать разбивку на страницы все не сложно, после сохранения файла XML открываем его OLE [pre2] oXml:writeData( cFile ) oExcel := win_oleCreateObject( "Excel.Application" ) oExcel:Visible := TRUE oExcel:DisplayAlerts := FALSE oExcel:Workbooks:Open(cFile) oExcel:Sheets(1):Select() oSheet := oExcel:ActiveSheet() //включаем макросы и форматируем как надо //смотрим что в макросе и после предыдущего кода пишем что надо //к примеру так oExcel:ActiveSheet:Outline:ShowLevels(1) WITH OBJECT oExcel:ActiveSheet:PageSetup :Zoom := FALSE :FitToPagesWide := 1 :FitToPagesTall := 100 :LeftMargin := oExcel:Application:InchesToPoints(0.511811023622047) :RightMargin := oExcel:Application:InchesToPoints(0.31496062992126) :TopMargin = oExcel:Application:InchesToPoints(0.748031496062992) :BottomMargin := oExcel:Application:InchesToPoints(0.748031496062992) :HeaderMargin := oExcel:Application:InchesToPoints(0.31496062992126) :FooterMargin := oExcel:Application:InchesToPoints(0.31496062992126) :PrintHeadings := FALSE :PrintGridlines := FALSE :PrintComments := xlPrintNoComments :PrintQuality := 600 :CenterHorizontally := FALSE :CenterVertically := FALSE :Orientation := xlLandscape :Draft := FALSE :PaperSize := xlPaperA4 :FirstPageNumber := xlAutomatic :Order := xlDownThenOver :OddAndEvenPagesHeaderFooter := FALSE :DifferentFirstPageHeaderFooter := FALSE :ScaleWithDocHeaderFooter := TRUE :AlignMarginsHeaderFooter := TRUE :RightFooter = "Пример нижнего колонтитула " + ' Страница &' + 'P из ' + '&' + 'N' ENDWITH // Можно показать перед печатью oExcel:ActiveWindow:SelectedSheets:PrintPreview(TRUE) // Можем сохранить как PDF oExcel:ActiveSheet:ExportAsFixedFormat( xlTypePDF , GetMyDocumentsFolder() + "Отчет.pdf", xlQualityStandard, TRUE, TRUE,1 ,3, FALSE ) // После всего этого восстановим показ ошибок Excel, который ранее выключали oExcel:DisplayAlerts := .T. [/pre2]



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