导出excel的问题
导出excel的问题
楼主breadjyh(新小鱼)2004-01-18 10:08:31 在 PowerBuilder / DataWindow 提问直接利用datawindow.saveas()的方法导出excel同用ole的方法导出excel速度差距很大,能否说说saveas()是用的什么方法? 问题点数:0、回复次数:9Top
1 楼linleming(落日)回复于 2004-01-18 10:18:42 得分 0
upTop
2 楼ld2099(我是谁?)回复于 2004-01-18 10:24:36 得分 0
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
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 = ls_obj
ls_objtag = 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
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
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
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 = ls_obj
ls_objtag = 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
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
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
Top
3 楼breadjyh(新小鱼)回复于 2004-01-18 10:27:44 得分 0
楼上的方法在论坛中已经看过,不过还是先谢过,这种方法当数据量很大的时候在速度上不是很理想,而且很是耗资源,我是想同大家研究一下pb本身导出到excel中的方法Top
4 楼sinkiangscorpio(诸葛军师)回复于 2004-01-18 17:36:08 得分 0
dw_Quarter.SaveAsAscii("H:\Q2\RESULTS.TXT","&",""")Top
5 楼klbt(快乐白兔)回复于 2004-01-18 22:36:18 得分 0
saveas速度快Top
6 楼breadjyh(新小鱼)回复于 2004-01-20 10:30:43 得分 0
怎么没有人了吗Top
7 楼sinkiangscorpio(诸葛军师)回复于 2004-01-20 14:28:50 得分 0
你还需要什么呢Top
8 楼jxc(GameHeart)回复于 2004-01-30 10:54:12 得分 0
PB 中的saveas 只是保存基本的数据,没有处理反显等,速度肯定快了.Top
9 楼dengxueqiang(小金鱼)回复于 2004-01-30 15:21:20 得分 0
int li_value
string ls_path,ls_fname
li_value = GetFilesaveName("请选择导出文件", &
+ ls_path, ls_fname, "XLS", &
+ "Excel文件 (*.xls), *.xls," &
+ "Text Files (*.TXT),*.TXT," &
+ "Word 文件 (*.doc), *.doc,")
IF li_value <> 1 THEN return false
setpointer(hourglass!)
// 删除原文件
if fileexists(ls_path) then
if messagebox("提示信息", "原文件已经存在, 是否覆盖 ?", Question!, YesNo!) = 2 then return false
if not filedelete(ls_path) then
messagebox("提示信息", "删除原文件失败, 该文件可能正在被使用 !")
return false
end if
end if
if ad_dw.saveasascii(ls_path) = -1 then
MessageBox("提示信息", "导出数据出错. 不能写入文件 !", Exclamation!)
return false
end if
messagebox("提示信息","数据导出成功 !", Exclamation!)
return trueTop
-
相关文章
2秒记住本站域名
玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的readygo.com.cn
