powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Экспорт в excel - Как вариант
1 сообщений из 1, страница 1 из 1
Экспорт в excel - Как вариант
    #33468519
AVGritsenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стандарной задачей, не решаемой в нужном виде средствами 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)
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Экспорт в excel - Как вариант
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]