怎样将datawindow的内容转换成excel里,这样可以很好的编辑,来者有分!!

myf7961 2003-03-29 02:58:07
就是将datawindow的内容转到excel里并打开,这样就好打印了,就象编辑excel数据一样,不是很方便吗?(我看到别人的例子)
...全文
128 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
taobujue 2003-05-19
  • 打赏
  • 举报
回复
up
dancer 2003-04-04
  • 打赏
  • 举报
回复
给你个函数,导入就可以了

//º¯ÊýÃû:f_outputtoexcel_new
//ÊäÈë: adw - datawindow,Ö¸¶¨µÄÊý¾Ý´°¿Ú
//·µ»ØÖµ: Integer
constant integer ppLayoutBlank = 12
OLEObject ole_object
ole_object = CREATE OLEObject

integer li_ret

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
ole_object.Visible = True
END IF

pointer oldpointer

oldpointer = SetPointer(HourGlass!)

ole_object.Workbooks.Add

long ll_colnum,ll_rownum
string ls_value

string ls_objects,ls_obj,ls_objs[],ls_objtag[]
long ll_pos,ll_len,ll_num = 0

ls_objects = trim(adw.Describe('datawindow.Objects'))

do while (pos(ls_objects,"~t") > 0)
ll_pos = pos(ls_objects,"~t")
ll_len = ll_pos - 1
ls_obj = left(ls_objects,ll_len)
if (adw.Describe(ls_obj + '.type') = 'column' or &
adw.Describe(ls_obj + '.type') = 'compute') and &
(adw.Describe(ls_obj + '.band') = 'detail') and (ls_obj <> "asd") then
ll_num += 1
ls_objs[ll_num] = ls_obj
//ls_objtag[ll_num] = adw.Describe(ls_obj + '.tag')
ls_objtag[ll_num] = adw.Describe(ls_obj + '_t.text')
end if
ls_objects = right(ls_objects,len(ls_objects) - ll_pos)
loop

//×îºóÒ»ÁÐ
ll_num += 1
ls_objs[ll_num] = ls_objects
ls_objtag[ll_num] = adw.Describe(ls_objects + '_t.text')


//µÃµ½Êý¾Ý´°¿ÚÊý¾ÝµÄÁÐÊýÓëÐÐÊý£¨ÐÐÊýÓ¦¸ÃÊÇÊý¾ÝÐÐÊý + 1£©
ll_colnum = ll_num
ll_rownum = adw.rowcount() + 1

string ls_colname
integer i,j,k
for i = 1 to ll_colnum
//µÃµ½±êÌâÍ·µÄÃû×Ö
ls_value = ls_objtag[i]
ole_object.cells(1,i).value = ls_value
next

string column_name
for i = 2 to ll_rownum
for j = 1 to ll_colnum
column_name = ls_objs[j]
if adw.Describe(column_name + '.type') = 'column' then
ls_value = adw.Describe("Evaluate('LookupDisplay("+column_name+")',"+string(i - 1)+")")
end if
if adw.Describe(column_name + '.type') = 'compute' then
ls_value = adw.Describe("Evaluate('" + adw.Describe(column_name + '.expression') + "',"+string(i - 1)+")")
end if
ole_object.cells(i,j).value = ls_value
next
next

SetPointer(oldpointer)

ole_object.disconnectobject()
DESTROY ole_object

return 1
tchatcha 2003-04-03
  • 打赏
  • 举报
回复
http://www.pbsky.com/

论坛有例子
he1208 2003-04-03
  • 打赏
  • 举报
回复
我的邮箱是hwh@scemi.com
谢谢!
我要转成execl、dbf的!
cocolong2002 2003-04-02
  • 打赏
  • 举报
回复
UP
tchatcha 2003-04-01
  • 打赏
  • 举报
回复
up
bomber2001 2003-04-01
  • 打赏
  • 举报
回复
可以这样导的吗?只有导数据吧?
(转载http://expert.csdn.net/Expert/topic/1321/1321254.xml?temp=.9275782)
/********经过几次修改,现在的这种转换成电子表格,可直接打印而不用手动去调整
有问题请来电,Email:zhqingguang@163.net*************/
constant integer ppLayoutBlank = 12
OLEObject ole_object
ole_object = CREATE OLEObject

integer li_ret

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
ole_object.Visible = True
END IF

pointer oldpointer

oldpointer = SetPointer(HourGlass!)

ole_object.Workbooks.Add

long ll_colnum,ll_rownum
string ls_value

string ls_objects,ls_obj,ls_objs[],ls_objtag[],ls_width[]
long ll_pos,ll_len,ll_num = 0

ls_objects = trim(adw.Describe('datawindow.Objects'))

do while (pos(ls_objects,"~t") > 0)
ll_pos = pos(ls_objects,"~t")
ll_len = ll_pos - 1
ls_obj = left(ls_objects,ll_len)
if (adw.Describe(ls_obj + '.type') = 'column' or &
adw.Describe(ls_obj + '.type') = 'compute') and &
(adw.Describe(ls_obj + '.band') = 'detail') and (ls_obj <> "asd") then
ll_num += 1
ls_objs[ll_num] = ls_obj //数据窗口中有的列

ls_objtag[ll_num] = adw.Describe(ls_obj +'_t' + '.text') //列汉字名字
ls_width[ll_num]= adw.Describe(ls_obj +'_t' + '.width') //每列的宽度

end if
ls_objects = right(ls_objects,len(ls_objects) - ll_pos)
loop

//得到数据窗口数据的列数与行数(行数应该是数据行数 + 2)
ll_colnum = ll_num
ll_rownum = adw.rowcount() + 2

//生成标题
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:'+f_columname(ll_colnum)+'1').Select
ole_object.Range('A1:'+f_columname(ll_colnum)+'1').Merge


string ls_colname
integer k,i,j
dec ld_width


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

string column_name,ls_coltype
for i = 3 to ll_rownum
for j = 1 to ll_colnum
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

ls_coltype=adw.Describe(column_name+'.coltype')
if pos(upper(ls_coltype),"CHAR")>0 then //对字符型数据处理
ole_object.cells(i,j).NumberFormat ="@"
end if
ole_object.cells(i,j).Font.Bold =false
ole_object.cells(i,j).value = ls_value
next
next

SetPointer(oldpointer)

ole_object.disconnectobject()
DESTROY ole_object
chen33888 2003-03-31
  • 打赏
  • 举报
回复
也给我一份吧!我的e_mail是chen33888@21cn.com!谢了!!
neowolf 2003-03-31
  • 打赏
  • 举报
回复
th820901,你的好东西也给我一份,谢了先:neowolf@163.net
pixiuxiu 2003-03-31
  • 打赏
  • 举报
回复
我的e_mail是wenyuzhen@hotmail.com,
在此谢过了!!
penny_tian 2003-03-31
  • 打赏
  • 举报
回复
试试这个:
string docname, named
integer value

value = GetFileSaveName("选择文件",docname, named, "XLS","Excel文件 (*.XLS), *.xls,文本文件 (*.TXT),*.TXT")
IF value = 1 THEN
dw_body . SaveAsAscii ( docname )
end if
lydavid 2003-03-31
  • 打赏
  • 举报
回复
这么麻烦!
用saveasascii
生成的是文本应该够用了!
myf7961 2003-03-29
  • 打赏
  • 举报
回复
我的e_mail是myf@xswsoft.com ,能用我把分给一半!谢了!!
wangkenping 2003-03-29
  • 打赏
  • 举报
回复
还是用formula one吧
th820901 2003-03-29
  • 打赏
  • 举报
回复
另还有生成WORD,TXT,HTML实例,需要的兄弟就留下E_mail,或发短信息给我.
th820901 2003-03-29
  • 打赏
  • 举报
回复
/*通过OLE对象实现将PB数据窗口中的文件生成EXCEL文件
参考资料《突破PowerBuilder8.0编程实例五十讲》P172 -中国水利水电出版社
2002.10.10 TH
*/
integer li_columnrow,li_row,li_c,li_r
oleobject xlapp,xlsub
integer li_ret
string ls_value

li_columnrow=long(dw_1.object.datawindow.column.count)
li_row=dw_1.rowcount()

xlapp=create oleobject
li_ret=xlapp.connecttonewobject('excel.application')
if li_ret<0 then
messagebox('','ole连接没有成功!!!')
return
end if

xlapp.application.workbooks.open('C:\My Documents\book1.xls')
xlapp.application.visible=true
xlsub=xlapp.application.activeworkbook.worksheets[1]
string ls_colname
integer li_li,li_j
for li_li=1 to li_columnrow
ls_colname=dw_1.describe('#'+string(li_li)+".name")+"_t"
ls_value=dw_1.describe(ls_colname+".text")//得到标题的名字
li_r=1
xlsub.cells[li_r,li_li]=ls_value//把标题名写到对像中
next

for li_c=1 to li_row
for li_r=1 to li_row
xlsub.cells[li_r+1,li_c]=dw_1.object.data[li_r,li_c]//把datawindow中的数据写到对象中
next
next

//for li_c=1 to li_row
// xlsub.cells[li_row + 1,li_c]='dd'
//next
//xlapp.disconnectobject()
destroy xlapp

编译成功,希望能对楼主有所帮助 :)
zhouweiwansui 2003-03-29
  • 打赏
  • 举报
回复
严格说,数据窗口是没办法完全转成excel的,可以编程解决一部分问题
不够问题多多,不是一两句话就可以说明白的
我曾经为这个问题困绕了一个多月,最后逼的用formula one做了一个自定义报表系统,脱离用datawindow做报表了,因为客户要求所有的报表必须能转成excel(中国国情?)
yuanbo824 2003-03-29
  • 打赏
  • 举报
回复
saveas函数
jeff_107 2003-03-29
  • 打赏
  • 举报
回复
学习学习!
dw中的格式好象很难与excel结合哦
myf7961 2003-03-29
  • 打赏
  • 举报
回复
不会吧,为了实现这个功能,我还要在客户机上装vfp这也太差劲了,我看到的也没有装vfp呀!!
加载更多回复(3)

609

社区成员

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

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