Форум » Clipper » Report from Clipper to Excel » Ответить

Report from Clipper to Excel

les: Есть Clipper-ный отчёт с упрощенной (для внутреннего употребления) шапкой, который Clipper автоматом перегоняет в Excel. Но налоговая хочет еметь его с очень навороченной шапкой ( http://webfile.ru/533208 ). На скорую руку склепал генерацию .html файла в стиле Excel. Работает, но прога внутри выглядит жутко, да и неудобно это клепать. Вопрос: как к этой шапке по-эллегантнее подгрузить данные из отчёта ( путём генерации из Clipper-а какого-либо скрипта и его запуска ).

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

_sergey: 1. можно написать в excel'е на VBA скрипт (функцию), которая загрузит данные из dbf и расставит их в нужные клетки страницы листа экселя.. или можно этот же скрипт написать vb-script (*.vbs): открыть лист, открыть dbf-таблицу, и в цикле по таблице отобрать нужные записи.. единственная проблема -- в VBA (jet ole db) криво работают индексы (я пример выложил в webfile.ru/533312) 2. можно изпользовать мою халявную прогу rec3p.exe: в программе на клиппере далаешь отчёт в текстовый файл с использованием псевдографики, табуляции, всяких межстрочных интервалов и узких шрифтов -- и вызываешь rec3p с именем файла твоего отчёта. правда, в этом случае отчёт будет распечатан, а не сохранён в эксель..

les: _sergey пишет: цитатаможно этот же скрипт написать vb-script (*.vbs): открыть лист, открыть dbf-таблицу, и в цикле по таблице отобрать нужные записи.. Спасибо за примеры. Это то что мне и надо. Если не влом - подскажи, где взять нормальное описание объекта "Excel.Application". Просмотрел кучу док - все мура. Т.к. это офтопик - давай в мыло les@azovmash.com или ICQ (149-152-548).

_sergey: самое простое -- запускаешь word или excel, жмёшь alt+F11 (редактор VBA), ctrl+r, enter, пишешь название объекта, жмёшь F1. если помощь для VBA установлена (выбирается при установке офиса), то откроется то, что надо. можно ещё в MSDN опискать, или на сайте microsoft.com в разделе MSDN (должен быт такой)


les: _sergey пишет: цитатасамое простое -- запускаешь word или excel, жмёшь alt+F11 (редактор VBA), ctrl+r, enter, пишешь название объекта, жмёшь F1. Спасибо. Я ведь спрашивал про НОРМАЛЬНОЕ описание. Вопрос решен. Никому не советую идти путем *.vbs. Clipper это делает примерно в 50 раз быстрее.

_sergey: там (в справке VBA в excel) "родное" описание, чего такого в нём ненормального? цитатаВопрос решен. Никому не советую идти путем *.vbs. Clipper это делает примерно в 50 раз быстрее. VBA (да и вообще OLE) вставляет ячейки в страницу excel'я действительно медленно, хотя есть разные способы для ускорения, например, отключить прорисовку листа.. Интересно, как ты из прогарммы на клиппере создаёшь лист эекселя? я знаю только о создания файлов excel'я формата BIF, обычной записью бинарный данных в файл (хоть из клиппера, хотя пример я видел на паскале), но ведь тебе les пишет: цитатаНо налоговая хочет еметь его с очень навороченной шапкой так что, кроме как открыть лист через OLE (или DDE, или прямой доступ к формату BIF) и изменять его содержимое -- что-то не вижу можно ещё так поступить! заполнить буфер обмена данными (разделитель между элементами в одной строке -- табуляция, разделитель между строками -- перевод строки (chr(13)+chr(10)) ), а затем вставить всё это в нужную ячейку.. данные "правильно" распределятся по ячейкам листа! (только что пробовал). так что можно на VBA, например, считать файл, выгруженный предварительно clipper'ом, скопировать его в буфер обмена, а потом вставить в лист.

les: _sergey пишет: цитатаИнтересно, как ты из прогарммы на клиппере создаёшь лист эекселя? нарисовал шапку руками, довавил строку с данными, отформатировал, сохранил в формате *.html, из Clipper-а по образу и подобию дописываю нужные данные и открываю в Excel. Геморойно, но работает довольно шустро.

_sergey: здорово, html-файлы сохраняют форматирование! правда, на office-97 не всё форматирование восстановилось при excel xp->html->excel (а именно, границы и раскраска фона ячеек) всякими *.csv и *.txt такого не добиться! (сохранения форматирования)

Vlad04: Почему не в Харборе отчет? Харбор прекрасно работает с Excel.Основная программа на Клиппере, а некоторые отчеты делаю в небольшой проге на Харбор.К сожалению консольный Харбор Клиппер еще не догнал, поэтому полностью на Харбор не перехожу.

SergeJa: Упомянут именно Харбор? или более продвинутый xХарбор?

_sergey: 2 Vlad04: если требуется работать в winapi или ole, то (мне) проще писать программу на с(c++) + winapi или на дельфи или на VBA.. всё равно код harbour транслируется на c++

les: Vlad04 пишет: цитатаХарбор прекрасно работает с Excel Сам-то проверял? У меня в harbour на P4 2GHz через oExcel := TOleAuto():New( "Excel.Application" ) и т.д. отчет 14 столбцов х 1200 строк грузится в Excel около 2х минут - Clipper-e секуд 5. _sergey пишет: цитатаVBA (да и вообще OLE) вставляет ячейки в страницу excel'я действительно медленно согласен на все 100

Vlad04: Сам все проверял. Имеется ввиду xХарбор.Для выгрузки больших отчетов использую библиотеку XlsRep.dll. Она упоминалась здесь на форумах.

_sergey: 2 Vlad04: а можно посмотреть на эту xlsrep.dll? и есть ли исходники? а то интересно! там файл с отчётом заново создаётся (например, в формате BIF, что меня и интересует), или дописывается в существующий, например, в шаблон? (что с использованием только формата BIF не получится) формат BIF тем удобен, что excel его понимает, он задокументирован, а создавать его можно как обычный двоичный DOS-файл (а не OLE-хранилице, как в случае с обычным xls-файлом)

Vlad04: Исходников нет.Автор: nik_x@hotbox.ru - обратись к нему.Он писал , что библиотека получила дальнейшее развитие. Так же можешь посмотреть сайт Водоносова : http://vodonosov.nm.ru/develop/develop.htm. Там есть так же программка для прямого доступа к файлам Excel в Клиппере . Для Харбор ее надо немного подправить.

Dima: Кстати использую исходники Водоносова , скорость супер.......ну это и понятно если исходник глянуть.

les: Dima пишет: цитатаКстати использую исходники Водоносова , скорость супер....... Я некоторое время использовал этот метод - спасибо Водоносову. Потом отказался - совершенно нет форматирования отчета :(

deep: les пишет: цитатанарисовал шапку руками, довавил строку с данными, отформатировал, сохранил в формате *.html, из Clipper-а по образу и подобию дописываю нужные данные и открываю в Excel. а нужные данные дописываешь в какой кодировке? В виндовой, каким образом?

les: deep пишет: цитатаа нужные данные дописываешь в какой кодировке? В виндовой, каким образом? Конечно в cp1251, используя OemToAnsi()

deep: А в какой библиотеке эта функция? В поставке клиппер 5.01 она есть?

les: deep пишет: цитатаА в какой библиотеке эта функция? В поставке клиппер 5.01 она есть? В Clipper-е её нет. Но есть много самописных вариантов

Krosh: Может это поможет. Я использовал такой способ: 1. Clipper делает ТЕКСТОВЫЙ ФАЙЛ в виде форматированной пробелами таблицы (лучше без вертикальных разделителей столбцов, хотя можно и с ними, но их можно использовать в качестве разделителей, см. ниже) или ТЕКСТОВЫЙ ФАЙЛ с данными, разделёнными каким-либо символом разделителем, желательно таким, который не используется в текстовом представлении данных. Это может быть в простейщем случае запятая или ; $ #. Пример: 6211 332346 РУБ 15853.080 0.000 6211 456456 РУБ 0.000 11048.000 6211 023458 РУБ 98648.000 0.000 или 0011;000006;РУБ;1615853.080;0.000;739096811;1 0011;000007;РУБ;211048.000;0.000;738934901;1 0011;000008;РУБ;98648.000;0.000;738968054;1 0011;000009;РУБ;630462.000;0.000;738923079;1 0011;000010;РУБ;685899.000;0.000;738973451;1 2. Создаётся файл Excel с указанной СУПЕРШАПКОЙ и ПРОСТЫМ макросом, который 2.1. открывает указанный ТЕКСТОВЫЙ ФАЙЛ, причём его кодировка может бытьи 1251 и 866 (!) в указанном вами режиме - фиксированная ширина столбцов Пример: Workbooks.OpenText Filename:="C:\Temp\AAAA.txt", Origin:=866, StartRow:=1 _ , DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 2), Array(5, 9), Array(12, 2 _ ), Array(18, 9), Array(20, 2), Array(23, 9), Array(26, 9), Array(36, 2), Array(47, 9), Array _ (60, 2), Array(68, 9), Array(78, 1), Array(100, 1)), TrailingMinusNumbers:=True или в режиме "с разделителями" Workbooks.OpenText Filename:="C:\Temp\AAAA1.txt", Origin:=932, StartRow:= _ 1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _ ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=True, Comma:=False, _ Space:=False, Other:=False, FieldInfo:=Array(Array(1, 2), Array(2, 2), Array( _ 3, 2), Array(4, 2), Array(5, 2), Array(6, 2), Array(7, 1)), TrailingMinusNumbers:=True 2.2. КОПИРУЕТ все строки с первой или со второй (если пропускаем заголовки столбцов) на страницу с шапкой. 2.3. Скопированное оформляется по вкусу (рамки, цвета, шрифты). Это РЕАЛЬНО быстрый способ. Если надо, могу подробнее.

_sergey: высё равно на оформление тоже много времени уйдёт (поцессорного), ведь, как я понял, оформление предполагается производить с использованием VBA?

Krosh: Нет, оформление тоже надо копировать из имеющегося где-то шаблона, например с другого листа. Сделать там нужное оформление первой строки после шапки, внутренних строк и "подвала". Главное не делать никаких программных циклов. Копировать не в цикле, а сразу для диапазона. Внутренние циклы Excel, реализованные внутри exe-шника работают существенно быстрее, чем VBA. Для того, чтобы понять сколько строк/столбцов надо копировать бес подсчёта в цикле есть спец. способ в Excel: Function mlast_row(bname, shname) mlast_row = Workbooks(bname).Worksheets(shname).Cells.SpecialCells(xlCellTypeLastCell).row End Function Function mlast_col(bname, shname) mlast_col = Workbooks(bname).Worksheets(shname).Cells.SpecialCells(xlCellTypeLastCell).Column End Function

_sergey: понятно. а отключение прорисовки листа не ускоряет заполение? я где-то видел команду типа Application.ScreenUpdating

Krosh: А то! И весьма! Application.ScreenUpdating = False выключил сделал Application.ScreenUpdating = True включил Увидел, прослезился

_sergey: тогды лучше Application.ScreenUpdating так и оставить =false

Юра: Лично я формирую отчеты в html, а потом просматриваю хоть в бровзере, хоть в Excel... Однако, с firefox (в отличие от IE) возникла проблема. Неверно обрезает страницы, переносит таблицу на следующую страницу, оставляя заголовок на предыдущей. Если есть знатоки, гляньте, может я несведущий забыл вставить какие-нибудь "заклинания". <HTML> <head> <title></title> <meta name="Author" CONTENT=""> <meta name="GENERATOR" CONTENT="TB2Html for CAVO"> <meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251"> <style> td {font-size:70%;COLOR: black;font-family:"Times New Roman"} .n {font-size:70%;color:#aa0000;font-weight:bold;font-family:"Times New Roman" } .m {font-size:75%;font-weight:bold;font-family:"Times New Roman" } .m1 { color:#AA0000; font-size: 10px;font-weight:bold;font-family: Verdana, Arial, Tahoma, Sans Serif;} </style> </head> <BODY BGCOLOR="" TEXT="black"> <center>ЗАТ СК "ПРОБА". Перiод 01.06.2001-30.06.2005</center><CENTER> ======= а то, что дальше переносит на следующую страницу в случае, если страниц больше одной ========= <TABLE BGCOLOR="silver" BORDER=2 FRAME=ALL CellSpacing=0 CellPadding=0 COLS=8> <CAPTION ALIGN=TOP><B> ЗВIТ ПРО НАДХОДЖЕННЯ СТРАХОВИХ ПЛАТЕЖIВ </B></CAPTION> <TR><Td COLSPAN=1 VALIGN=CENTER class=m> Група </Td> <Td COLSPAN=1 VALIGN=CENTER class=m> Код </Td> <Td COLSPAN=1 VALIGN=CENTER class=m>Вид страхування</Td> <Td COLSPAN=1 VALIGN=CENTER class=m>Сума платежiв</Td> <Td COLSPAN=1 VALIGN=CENTER class=m>Кiлькість</Td> <Td COLSPAN=1 VALIGN=CENTER class=m>Страхова сума</Td> <Td COLSPAN=1 VALIGN=CENTER class=m>На ведення справи</Td> <Td COLSPAN=1 VALIGN=CENTER class=m>% на ведення справи</Td> skip

dar: А где сейчас сайт Водоносова? Хочется тоже посмотреть эту программку прямого доступа к Екселю

Vlad04: Где и был http://vodonosov.nm.ru/develop/develop.htm Но он сейчас замороченный, но вопросы почти не реагирует

dar: Утром что-то не открывался, а сейчас работает

Wasily: Цитата: les пишет: _sergey пишет: цитатаИнтересно, как ты из прогарммы на клиппере создаёшь лист эекселя? нарисовал шапку руками, довавил строку с данными, отформатировал, сохранил в формате *.html, из Clipper-а по образу и подобию дописываю нужные данные и открываю в Excel. Геморойно, но работает довольно шустро. Зачем открывать html в Excel'e?????? Проще, скопировать..... Открываете Интернет Експлорером html, выделить все, копировать, перейти в Excel и вставить... обрамление и все. Я в такой способ делаю праткически со всеми отчетами (и внутренними и внешними.....) :-))))))))

subbota: Clip_msk.lib работает с Excel Смотри http://nova-mir.narod.ru

subbota: Clip_msk.lib работает с Excel Смотри http://nova-mir.narod.ru P.S. Почему-то многие ссылки ведут совсем не туда, куда указывают авторы вот и эта тоже http://vodonosov.nm.ru/develop/develop.htm

Dima: les пишет: Я некоторое время использовал этот метод - спасибо Водоносову. Потом отказался - совершенно нет форматирования отчета :( Кажется я нашел нормальный выход. Текст формируем в формате HTM (есть форматирование и все что надо и даже больше) И далее если по простому то так: Файлик сохраняем с расширением XLS swpruncmd(GetEnv("SYSTEMROOT")+"\system32\cmd.exe /c start test.xls" Excel его покажет как родной и внешне он ни чем не отличается если смотреть его через какой либо браузер. Пример [pre2] <HTML> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> <CAPTION><B><Center>Типа тест</Center></B></CAPTION> <table border="1"> <tr style="font-weight:bold" bgcolor="#EEAEEE"> <td colspan="2" align="center">Итоги</td><td>&nbsp;</td> </tr> <tr style="font-weight:bold"> <td>Колонка1</td><td>Колонка2</td> <td>Колонка 3 </td> </tr> <tr> <td>данные1</td><td>данные 2</td><td>данные 3</td> </tr> <tr> <td>данные1</td><td>данные 2</td> <td>данные 3</td> </tr> <tr> <td>данные1</td><td>данные 2</td> <td>данные 3</td> </tr> </table> </HTML> [/pre2]

PSP: XML тоже в тему... :) Его и OpenOffice Calc без вопросов откроет.

Dima: PSP Примерчик покажешь , что бы можно было получить похожую табличку как в моем примере ? ЗЫ И чем потом его открыть что бы увидеть таблицу а не код в XML

PSP: Dima, в нете много примеров. Хотя бы ВОТ PS: переименованный в xls файл корректно открывает только Excel (как формат html, так и xml). OO Calc открывает эти файлы только с "правильным расширением".

Dima: PSP Пасиб

suv2: вставлю свои 5 копеек есть таблица xls, на первом листе - уже готовое оформление. на второй лист экспорируются данные из текстового файла, которые подготавливает программа. это могут быть как записи базы данных, так и отдельные конкретные числа и тд. Макрос на экселе откывает текст, экспортирует его содержимое на 2й лист, далее распихивает как надо по первому листу. Отключение прорисовки экрана (screenupdating=false) конечно же существенно ускоряет процесс. На хорошем компьютере эксель запускается в фоне, формирует + печатает форму и закрывается менее чем за секунду Тонкости. 1) На рабстанциях в экселе может быть установлен запрет на испольование макросов экселя, поэтому программа на клиппер предварительно проверяет эту установку и в случае необходимости пишет в реестр виндовс разрешение на использование макросов. 2) Поскольку программы могут выполняться на терминальном сервере, программа сначала копирует таблицу эксель и данные для нее из основной папки в уникальный для пользователя темповый каталог. Чтобы понять в каком каталоге нужно искать данные, в экселе есть соотв функции получения папки, в которой открыта таблица. 3) Способ "все отчеты через эксель" кроме прочего хорош тем, что позволяет без проблем печатать на локальном принтере из терминальной сессии на удаленном компьютере. Аналогичная печать из ДОС декларируется но не работает. Поэтому для печати отчетов, формирующихся в клиппер традиционным способом, мне пришлось писать сервер поддержки удаленной печати. Это заморочь, но иногда этого не избежать, например, если имеются мегабайты кода, который что-то там считает и постепенно выводит на принтер.

Dima: Krosh пишет: Application.ScreenUpdating = False выключил сделал Application.ScreenUpdating = True включил Что то разницы по времени работы я не увидел.

dzyao: CA-Clipper Tools version 3.0 Очень много подходящего.

p519446: --- Dima, 28.03.10 21:20 --- Текст формируем в формате HTM (есть форматирование и все что надо и даже больше) --- Народ, подскажите, плз: можно ли затолкать в HTML-код "что-то такое", что заставит эксель открыть таблицу с фиксированным заголовком, т.е. чтобы при вертикальной прокрутке он не уезжал ? ЗЫ. 2 Dima: за показ способа - мегареспект, спасибо! :-)

p519446: PS... PlanMaker-pro (2012) - не пропускает этот фокус, говорит: "неопознанный формат файла"

MIKHAIL: Народ, подскажите, плз: можно ли затолкать в HTML-код "что-то такое", что заставит эксель открыть таблицу с фиксированным заголовком, т.е. чтобы при вертикальной прокрутке он не уезжал ? Рисуешь табличку в Excell, закрепляешь заголовки или столбцы. Сохраняешь в HTML формате, смотриш его в текстовом редакторе. Нужные команды в таблице стилей будут. Но на сколько помню у Excell немного другие, свои таблицы стилей чем у обычного HTML...



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