HELP,哪位大侠遇到这种问题,关于导出数据到EXCEL中。。。

侠雨飞飞 2003-01-07 09:43:36
简单的数据窗口倒也罢了,问题是偶的数据窗口是孙悟空西天取经弄会来的,历经九九八十一难,里边的零碎特别多,那也不是大问题,完全可以照葫芦画瓢,但,
它是分组报表,我使用的办法是建立EXCEL模板,然后把数据窗口数据输出,现在只能输出具体的数据行,分组统计无法输出的:(
如果在EXCEL模板里先分组倒是好主意,但我试过,好像分不了,因为没有数据
555~~,我的心太乱。。。。。。
...全文
22 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
taobujue 2003-05-19
  • 打赏
  • 举报
回复
up
  • 打赏
  • 举报
回复
分組的,包含有嵌套窗口的, 導出HTML的我就做出了,但導出EXCEL的還沒有做過
侠雨飞飞 2003-01-08
  • 打赏
  • 举报
回复
呵呵,我实现了
有点复杂,我使用的EXCEL模板,就是先把数据窗口中要显示的字段,标题都在EXCEL里画好,EXCEL中的单元格跟数据窗口字段名一一一对应

这个前面很多前辈说过的方法综合一下就可以实现了,不用模板也可以
关键的分组报表部分
我建立了一个结构,主要包含列名,分组列名,总求何列名
利用自定义函数使它们三个对应起来
在忘EXCEL单元里写数据时,对于某一列,
for k = 1 to rds[j].rowcount()
ls_express=rds[j].describe(ls_celname+'.visible')

if ls_express<>'1' then //不可见
continue

end if

ls_value = rds[j].Describe( "Evaluate('lookupdisplay(" + ls_celname + ")', " + string (k) + ")" )
if isnull(ls_value) then ls_value = ''

if k=1 then
ole.ActiveSheet.cells.item(long(ls_row)+ k - 1,ll_cell).value = ls_value
else
if k=rds[j].findgroupchange(k,1) then


//ole.ActiveSheet.cells[long(ls_row)+k,ll_cell].EntireRow.Insert
//写入汇总信息
if ll_cell=1 then
ole.ActiveSheet.cells.item(long(ls_row)+ k - 1+li_xiaoji ,ll_cell).value = '小计:'

else
ole.ActiveSheet.cells.item(long(ls_row)+ k - 1+li_xiaoji ,ll_cell).value = ''
end if
for li_si = 1 to upperbound(groupfield[])
if groupfield[li_si].dwindex=j then
if groupfield[li_si].fields=ls_celname then
ls_trailer=groupfield[li_si].computes
ls_v=rds[j].Describe("Evaluate('" + ls_trailer + '.expression' + "',"+string(k -1)+")")
if isnull(ls_v) then ls_v = ''
ole.ActiveSheet.cells.item(long(ls_row)+ k - 1+li_xiaoji ,ll_cell).value =ls_v


end if
end if
next

//写入当前分组第一行的数据
ole.ActiveSheet.cells.item(long(ls_row)+ k -1+li_xiaoji+1 ,ll_cell).value = ls_value
li_xiaoji++//***********
else//不是分组第一行
ole.ActiveSheet.cells.item(long(ls_row)+ k -1+li_xiaoji ,ll_cell).value = ls_value


end if

end if


next


由此实现
:)
wsfzhy 2003-01-08
  • 打赏
  • 举报
回复
用saveasascii應該可以吧。
leepoy 2003-01-08
  • 打赏
  • 举报
回复
寻寻觅觅,冷冷清清,凄凄惨惨戚戚??

888888888888 2003-01-08
  • 打赏
  • 举报
回复
关注
tchatcha 2003-01-07
  • 打赏
  • 举报
回复
PowerBulider数据窗口转MicroSoft Execl、Word程序源代码
一、f_cncharnum函数 f_cncharnum.srf
$PBExportHeader$f_cncharnum.srf
$PBExportComments$得到字符串中汉字或者双字节的个数
global type f_cncharnum from function_object
end type

forward prototypes
global function integer f_cncharnum (string aString)
end prototypes

global function integer f_cncharnum (string aString);
//函数名: f_cncharnum
//用途: 返回一个字符串中汉字的个数
//输入: aString - string, 给定的字符串
//返回值: li_num - Integer, 给定的字符串中汉字的个数
//注意: 1. 此方法基于汉字的国标汉字库区位编码的有效性,不符合此编码的系统此函数无效!
// 2. 若汉字串含有非汉字字符,如图形符号或ASCII码,则这些非汉字字符将保持不变.
//例如: li_ret = f_cncharnum("摆渡人ferryman") li_ret = 3

string ls_ch //临时单元
string ls_SecondSecTable //存放所有国标二级汉字读音
integer li_num = 0 //返回值
integer i,j

For i = 1 to Len(aString)
ls_ch = Mid(aString,i,1)
If Asc(ls_ch) >= 128 then //是汉字
li_num++
i = i+1
End if
Next

Return li_num

end function


二、PBToExcel函数f_outputtoexcel_new.srf

$PBExportHeader$f_outputtoexcel_new.srf
global type f_outputtoexcel_new from function_object
end type

forward prototypes
global function integer f_outputtoexcel_new (datawindow adw)
end prototypes

global function integer f_outputtoexcel_new (datawindow adw);
//函数名: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')
end if
ls_objects = right(ls_objects,len(ls_objects) - ll_pos)
loop

//得到数据窗口数据的列数与行数(行数应该是数据行数 + 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
end function

三、PBToWord函数f_outputtoword_new.srf

$PBExportHeader$f_outputtoword_new.srf
global type f_outputtoword_new from function_object
end type

forward prototypes
global function integer f_outputtoword_new (datawindow adw)
end prototypes

global function integer f_outputtoword_new (datawindow adw);
//函数名:f_outputtoword_new
//输入: adw - datawindow,指定的数据窗口
//返回值: Integer
constant integer ppLayoutBlank = 12
OLEObject ole_object
ole_object = CREATE OLEObject

integer li_ret

li_ret = ole_object.ConnectToObject("","word.application")
IF li_ret <> 0 THEN
//如果Word还没有打开,则新建。
li_ret = ole_object.ConnectToNewObject("word.application")
if li_ret <> 0 then
MessageBox('OLE错误','OLE无法连接!错误号:' + string(li_ret))
return 0
end if
ole_object.Visible = True
END IF

long ll_colnum,ll_rownum
constant long wdWord9TableBehavior = 1
constant long wdAutoFitFixed = 0
constant long wdCell = 12
string ls_value
pointer oldpointer

oldpointer = SetPointer(HourGlass!)

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')
end if
ls_objects = right(ls_objects,len(ls_objects) - ll_pos)
loop

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

ole_object.Documents.Add()
ole_object.ActiveDocument.Tables.Add(ole_object.Selection.Range, ll_rownum, ll_colnum)

string ls_colname
integer i,j,k

for i = 1 to ll_colnum
//得到标题头的名字
ls_value = ls_objtag[i]
ole_object.Selection.TypeText(ls_value)
for k = 1 to f_cncharnum(ls_value)
ole_object.Selection.TypeBackspace()
next
ole_object.Selection.MoveRight(wdCell)
next

adw.setredraw(false)
ole_object.Selection.MoveLeft(wdCell)
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.Selection.MoveRight(wdCell)
ole_object.Selection.TypeText(ls_value)
for k = 1 to f_cncharnum(ls_value)
ole_object.Selection.TypeBackspace()
next
next
next
adw.setredraw(true)

constant long wdFormatDocument = 0

SetPointer(oldpointer)
//保存新建的文档
if messagebox("保存","文档已经成功完成,是否保存?",Question!,YesNo!) = 1 then
string docname, named
integer value

value = GetFileSaveName("选择文件",docname, named, "DOC","Doc Files (*.DOC), *.DOC")

IF value = 1 THEN
ole_object.ActiveDocument.SaveAs(docname, 0,False,"",True,"",False,False,False, False,False)
end if

end if
//断开OLE连接
Ole_Object.DisConnectObject()
Destroy Ole_Object

return 1
end function
xuebuctxy 2003-01-07
  • 打赏
  • 举报
回复
我写这程序是刚学pb不久的时候,作的有些麻烦,我将分组数写入配置文件了,按哪个字段分组也写进去了,然后开始找
其实后来发现不用那么麻烦,这些信息都可以提取,用FindGroupChange()函数就可以找到分组点了
侠雨飞飞 2003-01-07
  • 打赏
  • 举报
回复
崇拜的眼神凝视着 xuebuctxy(xuemin)
:P

呵呵~
我的意思是怎么实现分组
我是一行一行的把DATAWINDOS的数据赋值到EXCEL的CELLS中的
但分组信息你是怎么实现的??

xuebuctxy 2003-01-07
  • 打赏
  • 举报
回复
我作过分组数据的导出
但我没看明白你的问题到底是什么

你解释清楚点吧!
xuebuctxy 2003-01-07
  • 打赏
  • 举报
回复
我作过分组数据的导出
但我没看明白你的问题到底是什么

你解释清楚点吧!
xhwly 2003-01-07
  • 打赏
  • 举报
回复
用saveasascii應該可以吧。
dw_1.Saveasascii(s_filepath," ","")
zhyx21century 2003-01-07
  • 打赏
  • 举报
回复
use ole
侠雨飞飞 2003-01-07
  • 打赏
  • 举报
回复
伤心的昏倒~~
在代码里应该可以实现的,我刚才看了看VB的代码,方法里有
insert([shift])
和group([start],[end],[by],[periods])
可以在赋值前insert一行到excel中,最后再group

好像很罗嗦,我insert一下,不能用,不知道参数是什么?
唉,苦也~
dotnba 2003-01-07
  • 打赏
  • 举报
回复
不懂耶
orient_yang 2003-01-07
  • 打赏
  • 举报
回复
我以前做过,应该是可以的。
记不清了。
侠雨飞飞 2003-01-07
  • 打赏
  • 举报
回复
呵呵,简单的数据导出我也实现了,问题是复杂的,比如数据窗口中含嵌套报表
或者分组的
哪位大侠来实现实现:P
我看了N多同仁的帖子了,介绍的函数功能都太弱,要不就是太单一了

打算放弃了,导出数据来让用户自己再在EXCEL里分一下组好了

寻寻觅觅,冷冷清清,凄凄惨惨戚戚
sunnylei 2003-01-07
  • 打赏
  • 举报
回复
用OLE, VB能实现的,DELPHI能实现的, PB都能实现
侠雨飞飞 2003-01-07
  • 打赏
  • 举报
回复
还是不能分组啊

609

社区成员

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

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