|
|
|
Экспорт в excel - Как вариант
|
|||
|---|---|---|---|
|
#18+
Стандарной задачей, не решаемой в нужном виде средствами PowerBuilder, является выгрузка отчетов формата datawindow в Excel. см. также Печатные формы и отчеты в специальных форматах Предлагается следующий набор решений На панели инструментов окна предпросмотра отчетов имеется две кнопки для выгрузки в Еxcel , сдублированные для любого окна во всплывающем по правой кнопке мыши меню I) бледная (... только данные) Работает всегда одинаково: Выгружает только данные, исключает невидимые колонки и приписывает наименования колонок. Порядок колонок не меняется (как в SQL) и может не соотвествовать порядку колонок на экране. Для Grid можно понять что это такое и как-то использовать. Основное преимущество - скорость (секунды на десятки тысяч строк данных) II) красивая (... с оформлением) Вызывает специальный объект для экспорта w_k_copytoexcel и может работать по разному: 1) Использует произвольную программу экспорта указанную в w_k_copytoexcel (w_b_copytoexcel) для конкретного окна. В версии для конкретного заказчика в библиотеке tuning.pbl может быть объект w_k_copytoexcel со специфическим набором программ. 2) Если такой нет, но есть шаблон для выгрузки в справочнике отчетов в поле bufdw или файл шаблона с именем dataobject +'.xls' в поддиректории template: а) Данные отчета выгружаются в .xls файл по алгоритму п.п. I) б) Открывается шаблон , на 3-й лист дописывается спецификация данных в datawindow -Список compute элементов в областях Foreground, Header, Summary 1 колонка - имя 2 колонка -значение -Список колонок dw 11 колонка - имя колонки вц 12 колонка - откуда взять данные (для файла с данными) 13 колонка в которую вставить данные (итоговый док) 14 ширина мм (в dаwindow следует ставить опцию 1/1000) в Ехсel коэф ~ 1/1.88 в)Вызывается макрос VBA import(tempfile,rowcount,colcount) Макрос может оперировать данными c заголовками в файле tempfile, где rowcount,colcount - число строк данных и столбцов (без заголовка), а также данными по п.п. а). Преимущества: При вставке данных блоками (например всей области данных или отдельных столбцов) скорость выгрузки может быть сравнима с таковой по алгоритму п.п.I) Может быть достигнута высокая степень соответствия по внешнему виду. Более того, отчет может быть улучшен путем использования средств Excel не доступных в datawindow. В сравнении с алгоритмом п.п. 1) - не требуется менять код на PowerScript и перекомпилировать программу. В сравнении с алгоритмом п.п. 3) - скорость выше на порядок, форматирование отчета. Недостатки: Требуется индивидуальное программирование макроса VBА для каждого отчета DataWindow должно соотвествовать определенным требованиям, например область detail не должна содержать compute полей(не будут выгружены), а подитоги желательно рассчитать в SQL(иначе потребуется их расчет в макросе) . 3) Если обработка по пп 1 и 2 не выполнена, то вызывается стандартная программа выгрузки в Excel (dw2xls). Преимущества: Универсальность (программирования не требуется) Недостатки: Низкая скорость выгрузки и плохое соотвествие внешнего вида (приемлемо для Grid) // Здесь можно написать какую угодно обработку ------------------------ // Если таковой нет то далее //--------------------------------------------------------------------- // здесь стандарная обработка если есть шаблон c именем dw.dataobject+'.xls' // или блоб в базе // Если таких нет то далее // Выгрузка в xls файл как "Только данные" + кое-что на 3-й лист // запуск EXCEL и макроса VB через OLE string file file=GetTemplate(dw.dataobject) if file<>'' then pointer oldpointer oldpointer=SetPointer(HourGlass!) // Сохраняем в файл string tempfile tempfile=dw.fast_to_xls(true) // данные c заголовками long rowcount,colcount rowcount=dw.rowcount() if rowcount=0 then Messagebox('Внимание!','Документ не формируется - нет данных!') Goto EndProg end if oldpointer=SetPointer(HourGlass!) OLEObject o1 int result o1 = CREATE OLEObject result = o1.ConnectToNewObject("excel.application") if result<0 then Messagebox('Внимание!','Ошибка соединения с Excel',Stopsign!) Goto EndProg end if // o1.Application.Visible = True o1.workbooks.open(file) // список compute которые могут быть перенесены в excel (на 3 лист) // Примечание: именно compute, поскольку их содержимое заранее неизвестно - остальное можно // прямо занести в шаблон // Список видимых колонок для сохранения порядка string ls_report,objname,s_band,s_type,s_visible,s_x,s_id Long pos,n,i pos=1 n=0 i=0 ls_report =trim( dw.Describe("DataWindow.Objects") ) ds.reset() // dw.Object.DataWindow.Units='3' //messagebox('',dw.modify("DataWindow.Units='3'")) DO WHILE len(ls_report)>0 and pos>0 pos=pos(ls_report,char(9)) if pos=0 then ObjName=trim(ls_report) Else ObjName=left(ls_report,pos - 1) End IF ls_report =trim(mid(ls_report,pos + 1)) s_band=dw.Describe(Objname+'.band') s_type=dw.Describe(Objname+'.type') if s_band='header' or s_band='foreground' or s_band='summary' then if s_type='compute' then n=n+1 o1.workbooks[1].Worksheets[3].cells[n,1] =Objname string val val=dw.Describe("evaluate('"+objname+".expression',1)") if IsNumber ( val ) then o1.workbooks[1].Worksheets[3].cells[n,2] =double(dw.Describe("evaluate('"+objname+".expression',1)")) else o1.workbooks[1].Worksheets[3].cells[n,2] =dw.Describe("evaluate('"+objname+".expression',1)") end if End If End If if s_band='detail' and s_type='column' then s_visible=dw.Describe(Objname+'.visible') s_x=dw.Describe(Objname+'.x') s_id=dw.Describe(Objname+'.id') if left(s_visible,1)='1' and s_x<>'?' then i=i+1 ds.insertrow (0) ds.object.x =long(s_x) // порядок на экране ds.object.id =long(s_id) ds.object.width =long(dw.Describe(Objname+'.width')) /100 // Это в миллиметрах ds.object.name =Objname End If End If LOOP colcount=ds.rowcount() ds.SetSort("id A") ds.Sort() for n= 1 to colcount ds.object.i[n] =n // номер в прореженном списке колонок созданном fast_to_xls next ds.SetSort("x A") ds.Sort() for n= 1 to colcount o1.workbooks[1].Worksheets[3].cells[n,11] =ds.object.name[n] // имя колонки o1.workbooks[1].Worksheets[3].cells[n,12] =ds.object.i[n] // колонка откуда взять данные o1.workbooks[1].Worksheets[3].cells[n,13] =n // колонка в которую вставить данные o1.workbooks[1].Worksheets[3].cells[n,14] =ds.object.width[n] // ширина next //------------------------------------------------------------------- // Макрос может оперировать данными c заголовками (fast_to_xls) (file) // // Списком compute элементов 3-й лист 1 кол - имя // 2 кол значение // // Списком порядка колонок 3-й лист 11 колонка имя // 12 колонка откуда взять данные (из file) // 13 колонка в которую вставить данные (итоговый док) // 14 ширина мм (в окне следует ставить опцию 1/1000) в Ехсel коэф ~ 1/1.88 o1.Application.Run("import",tempfile,rowcount,colcount) o1.Application.Visible = True EndProg: destroy(o1) filedelete(tempfile) ds.reset() SetPointer(Arrow!) return end if // Если специальная обработка не определена то ------------- dw2xls(dw) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2006, 22:47 |
|
||
|
|

start [/forum/topic.php?fid=15&tid=1337955]: |
0ms |
get settings: |
7ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
65ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
34ms |
get tp. blocked users: |
2ms |
| others: | 225ms |
| total: | 372ms |

| 0 / 0 |
