数据窗输出到excel问题

czdpilgrim 2003-08-01 08:17:25
pb的数据窗输出后只能保存detail的内容,如何将dw原封不动的输出到excel呢,包括header,computer列等?
...全文
47 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jingxh 2003-08-11
  • 打赏
  • 举报
回复
试试先
wuhanjuan 2003-08-11
  • 打赏
  • 举报
回复
天,我yuning
stjauns 2003-08-11
  • 打赏
  • 举报
回复
的确是很复杂啊~~~~~~~~我觉得一下代码已经够用了:
global type gf_2excel from function_object
end type

forward prototypes
global subroutine gf_2excel (datawindow fdw)
end prototypes

global subroutine gf_2excel (datawindow fdw);if fdw.dataobject='' or isnull(fdw.dataobject) then return
long l_rc
long l_col,l_colcount,l_row
string s_temp,ls_colname

s_temp = fdw.Object.Datawindow.Column.Count
l_colcount = long(s_temp)
fdw.accepttext()
OLEObject ole_object , ole_workbooks

ole_object = CREATE OLEObject
IF ole_object.ConnectToNewObject("Excel.Application") <> 0 THEN
MessageBox('OLE错误','OLE无法连接!')
return
END IF
ole_object.workbooks.add
ole_object.Visible = True
ole_workbooks = ole_object.Worksheets(1)

for l_col=1 to l_colcount
ls_colname = fdw.describe('#'+string(l_col)+'.name')
if left(right(ls_colname,2),1)='_' then ls_colname=left(ls_colname,len(ls_colname)-2)//if is duplicate,cut'_#'
s_temp=ls_colname+'.ColType'//get coltype string
s_temp=fdw.Describe(s_temp)//get coltype
for l_row=0 to fdw.rowcount()
if l_row=0 then//set title
ole_workbooks.cells(l_row+1,l_col).value=fdw.describe(ls_colname+'_t.text')
else//set value
// choose case left(lower(s_temp),5)
// case 'datet'//datetime
// ole_workbooks.cells(l_row+1,l_col).value=fdw.getitemdatetime(l_row,ls_colname)
// case 'decim','int','long','numbe','real','ulong'//decimal,int long,number,real,ulong
// ole_workbooks.cells(l_row+1,l_col).value=fdw.getitemdecimal(l_row,ls_colname)
// case else//char(n)
ole_workbooks.cells(l_row+1,l_col).value=fdw.Describe("Evaluate('LookUpDisplay("+ls_colname+")',"+string(l_row)+")")//fdw.getitemstring(l_row,ls_colname)
// end choose
end if
next
next
Ole_Object.DisConnectObject()
Destroy Ole_Object
destroy ole_workbooks
end subroutine
9670 2003-08-10
  • 打赏
  • 举报
回复
将header,cumputer作为一行处理,
将其放入临时datawindow中
同时可将原dw中有编码的列转化为汉字导出即可
wzm1022 2003-08-10
  • 打赏
  • 举报
回复
没有那么复杂!
arich 2003-08-10
  • 打赏
  • 举报
回复
收下啦,先调试调试下。。。。。。
jwzhang 2003-08-06
  • 打赏
  • 举报
回复
好棒噢!!!谢谢楼上的慷慨!!!
zfbriant 2003-08-02
  • 打赏
  • 举报
回复
/*---将数据窗口中的值导入Excell---*/
li_count = li_starrow - 3
for i = 3 to ll_rownum
w_progress_message_tmp.event ue_percent(i/ll_rownum*100) /* 进度条*/
li_flag = 1
FOR li_pos = 1 to upperbound(ls_group)
/*---取分组合计值,判断是否输出分组合计---*/
ls_data[li_pos] = adw.Describe("Evaluate('" + adw.Describe(ls_group[li_pos]+'_c.expression') + "',"+string(i - 2)+")")
IF isnull(ls_data[li_pos]) or ls_data[li_pos] = "!" or ls_data[li_pos]="?" THEN
ls_data[li_pos] = ""
END IF
IF ls_data[li_pos] = ls_olddata[li_pos] THEN
li_flag = li_flag*1
ELSE
li_flag = 0
END IF
/*---取分组合计值,判断是否输出分组合计完毕---*/
NEXT
IF li_flag <> 1 THEN
/*---[一组数据输出完毕]输出分组合计---*/
int k
for j = 2 to ll_colnum - 2
if j = 2 then
k = 1
else
k = j
end if
column_name = ls_objs[k]+"_c"
ls_value = adw.Describe("Evaluate('" + adw.Describe(column_name + '.expression') + "',"+string(i - 3)+")")
ls_coltype=adw.Describe(column_name+'.coltype')

IF isnull(ls_value) or ls_value="!" or ls_value = "?" THEN
ls_value = ""
END IF
if pos(upper(ls_coltype),"CHAR")>0 then //对字符型数据处理
ole_object.cells(i+li_count,k).NumberFormat ="@"
end if
IF detailflag = 1 THEN
// ole_object.cells(i+li_count,k).Font.Bold =true
ole_object.cells(i+li_count,k).value = ls_value
//ole_object.cells(i+li_count,k).columnwidth=900
ELSE
// ole_object.cells(3+li_count,k).Font.Bold =true
ole_object.cells(3+li_count,k).value = ls_value
//ole_object.cells(i+li_count,k).columnwidth=900
END IF
next
IF detailflag = 1 THEN
//ole_object.cells(i+li_count,1).Font.Bold =true
ole_object.cells(i+li_count,1).value = i+li_count - 2
ELSE
//ole_object.cells(3+li_count,1).Font.Bold =true
ole_object.cells(3+li_count,1).value = 3+li_count - 2
END IF

FOR li_pos = 1 to upperbound(ls_group)
ls_olddata[li_pos] = ls_data[li_pos]
NEXT
li_count ++
/*-----输出分组合计完毕----*/
END IF
/*------输出组内数据------*/
IF detailflag = 1 THEN
for j = 2 to ll_colnum - 2
if j = 2 then
k = 1
else
k = j
end if
column_name = ls_objs[j]
if adw.Describe(column_name + '.type') = 'column' then
ls_value = adw.Describe("Evaluate('LookupDisplay("+column_name+")',"+string(i - 2)+")")
end if
if adw.Describe(column_name + '.type') = 'compute' then
ls_value = adw.Describe("Evaluate('" + adw.Describe(column_name + '.expression') + "',"+string(i - 2)+")")
end if
IF isnull(ls_value) or ls_value="!" or ls_value = "?" THEN
ls_value = ""
END IF
if k = 1 then picpath = ls_value//add by wzf 20030726 for draw pic by pb
ls_coltype=adw.Describe(column_name+'.coltype')
if pos(upper(ls_coltype),"CHAR")>0 then //对字符型数据处理
ole_object.cells(i+li_count,k).NumberFormat ="@"
end if
// ole_object.cells(i+li_count,k).Font.Bold =false
ole_object.cells(i+li_count,k).value = ls_value
next
// ole_object.cells(i+li_count,1).Font.Bold =false
// ole_object.cells(i+li_count,1).value = i+li_count - 2
END IF

// add by wzf 20030725 for pic
if not isNUll(picpath) and picpath <> '' and FileExists(picpath) and FileLength(picpath)> 0 then
ole_object.Worksheets(1).Shapes.AddPicture(picpath, True, True, 0, (i - 3)*75 + 80, 70, 70)
end if
// add by wzf 20030725

/*------组内数据输出完毕-----*/
zfbriant 2003-08-02
  • 打赏
  • 举报
回复
ole_object.Workbooks.open(gs_syspath+as_tempfile)
open(w_progress_message_tmp) /* 进度条 */
w_progress_message_tmp.st_1.text='正在生成excel数据,请稍后......'

ll_rownum = adw.rowcount() + 2 //Excel表格中的行数为数据窗口行数+2,前两行处理标题
ll_colnum =long(adw.Object.DataWindow.Column.Count) //取得字段总数
ls_objtag[1] = "No."
setnull(ls_width[1])
i = 1
FOR ll_num = 1 TO ll_colnum
IF adw.Describe("#"+String(ll_num)+".Visible")="1" THEN //列标志为noseek的不显示
i = i+1
ls_obj = adw.Describe("#"+String(ll_num)+".name") //字段名称的实际存储值
ls_objs[i] = ls_obj
ls_objtag[i]=adw.Describe(ls_obj+"_t.text") //字段名称的显示值
ls_width[i]= adw.Describe(ls_obj + '.width') //每列的宽度
END IF
NEXT
ll_colnum = i //表格列数
/*-------初始操作完毕-------*/

/*---------生成标题---------*/
//ole_object.Cells(1,1).value =reptitle
//ole_object.Range('A1').Select
//ole_object.Selection.Font.Size =24
//ole_object.selection.HorizontalAlignment =3
//ole_object.Range('A1:'+mid(s_english,ll_colnum,1)+'1').Select
//ole_object.Range('A1:'+mid(s_english,ll_colnum,1)+'1').Merge
///*-------生成标题完毕-------*/

///*-------设置标题栏-------*/
//for i = 1 to ll_colnum
// ls_value = ls_objtag[i]
// ole_object.cells(2,i).value = ls_value //1
// if isnull(ls_width[i]) then
// ld_width=12
// else
// ld_width=dec(ls_width[i])/35
// end if
// ole_object.Columns(i).ColumnWidth=ld_width
// ole_object.Columns(i).HorizontalAlignment =3
// ole_object.Columns(i).Borders.LineStyle= 1
// ole_object.Columns(i).Font.Bold =True
//next
/*------设置标题栏完毕-----*/

/*-------取分组字段-------*/
ls_syntax = trim(adw.object.datawindow.syntax)
li_pos = pos(ls_syntax," by=(")
IF li_pos > 0 THEN
flag = 1
ls_syntax = trim(Mid(ls_syntax,li_pos+5))
li_pos = pos(ls_syntax,")")
ls_syntax = trim(Mid(ls_syntax,2,li_pos - 2))
li_count = 1
li_pos = pos(ls_syntax,'"')
do while li_pos > 0
ls_temp = trim(Mid(ls_syntax,1,li_pos -1))
ls_syntax = trim(Mid(ls_syntax,li_pos + 1))
ls_syntax = Mid(ls_syntax,2,len(ls_syntax) -1)
li_pos = pos(ls_syntax,'"')
ls_group[li_count] = ls_temp
li_count+=1
loop
END IF
For li_pos = 1 to upperbound(ls_group)
ls_olddata[li_pos] = adw.Describe("Evaluate('" + adw.Describe(ls_group[li_pos]+'_c.expression') + "',1)")
IF isnull(ls_olddata[li_pos]) or ls_olddata[li_pos] = "!" or ls_olddata[li_pos]="?" THEN
ls_olddata[li_pos] = ""
END IF
next
/*-----取分组字段完毕-----*/
zfbriant 2003-08-02
  • 打赏
  • 举报
回复
$PBExportHeader$f_tran_excell_eachprice.srf
$PBExportComments$单价位报价单有图.----design by wolf 2003.07.24
global type f_tran_excell_eachprice from function_object
end type

forward prototypes
global function integer f_tran_excell_eachprice (datawindow adw, string reptitle, integer detailflag, string as_tempfile)
end prototypes

global function integer f_tran_excell_eachprice (datawindow adw, string reptitle, integer detailflag, string as_tempfile);/******************************************************
* 函数名: f_tran_excell()
*-----------------------------------------------------
* 功 能:将数据窗口内容导为Excell文件,限制为26行
*=====================================================
* 参 数:
* value--Datawindow--Adw [源数据窗口]
* value--String------Reptitle [Excell标题]
* value--Integer-----Detailflag [Detail区是否显示 1==显示 0==隐藏]
* as_tempfile---string ----- [模版文件-全路径]
*
* 返回值:
* Integer 1==成功 0==失败
*-----------------------------------------------------
* 备注: 本函数可适用于数据窗口分组的情况,数据窗口含有分
* 组时,在分组合计区域必须包含所有以可视字段的字段
* 名加上'_c'命名的计算列,无用的计算列将表达式写为
* ''即可
*======================================================
* AUTHOR:TCHJ DATE:2003/05/26
********************************************************/

/*-----定义程序用到的变量-----*/
Oleobject ole_object
String s_english="ABCDEFGHIJKLMNOPQRSTUVWXYZ",column_name,ls_coltype
String ls_objects,ls_obj,ls_objs[],ls_objtag[],ls_width[],ls_value
string ls_colname,ls_syntax,ls_temp,ls_group[],ls_olddata[],ls_data[]
Integer li_ret,i,j,li_pos,li_count,li_flag,flag=0
long ll_colnum,ll_rownum,ll_pos,ll_len,ll_num = 0
dec ld_width
pointer oldpointer

int li_starrow,li_starcol
li_starrow = 5
li_starcol = 1
string picpath //add by wzf 20030726 for draw pic by pb
/*---------定 义 完 毕--------*/


if fileexists(gs_syspath+as_tempfile)=false then
messagebox(gs_sysname,gs_syspath+as_tempfile+'模板不存在!请确认')
return 0
end if
/*-------打开EXCELL文档-------*/
ole_object = CREATE OLEObject
li_ret = ole_object.ConnectToObject("Excel.Application")
IF li_ret <> 0 THEN
/*--如果Excel还没有打开则新建--*/
li_ret = ole_object.ConnectToNewObject("Excel.Application")
if li_ret <> 0 then
MessageBox('OLE错误','OLE无法连接!错误号:' + string(li_ret))
return 0
end if
END IF
/*-------打开文档完毕-------*/

/*-------一些初始操作-------*/
oldpointer = SetPointer(HourGlass!)
//ole_object.visible=false
double22822 2003-08-02
  • 打赏
  • 举报
回复
先做一个xls的模板,将datawindow的标题写好,再做程序向里面写数据!
wzsyiyun 2003-08-01
  • 打赏
  • 举报
回复
升级你的pb,用saveasascii()
klbt 2003-08-01
  • 打赏
  • 举报
回复
需要用文件写入函数配合saveas函数
紫炎圣骑 2003-08-01
  • 打赏
  • 举报
回复
没有试过楼上说的方法,不过看起来可行!

祝你成功!
hexubing 2003-08-01
  • 打赏
  • 举报
回复
可以实现,有点麻烦。
header,computer好实现,如何将dw原封不动的输出到excel,难度太大啦了!

有一个捷径,将其saveas到一个HTML文件,将扩展名更为XLS,用EXCL打开这个文件时,效果较为满意,且速度较快!

740

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 脚本语言
社区管理员
  • 脚本语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧