PB数据窗口导入EXCEL问题!

EdgerLee 2003-01-14 10:48:36
建了一个很复杂的数据窗口,想原样导入EXCEL中,用了好多方法,大部分都是规则导出的,只有纪大侠做的那个可以导出格式但全是乱码,有没有人遇到过啊?
或能给个好的函数方法!谢了!
纪大侠的函数:
int li_value
string ls_path,ls_fname

li_value = GetFilesaveName("请选择导出文件", &
+ ls_path, ls_fname, "XLS", &
+ "Excel文件 (*.xls), *.xls," &
+ "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.SaveAs(ls_path, HTMLTable!, True) = -1 then
MessageBox("提示信息", "导出数据出错. 不能写入文件 !", Exclamation!)
return false
end if

messagebox('提示信息','数据导出成功 !', Exclamation!)
return true
...全文
572 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
冷箫轻笛 2003-01-24
  • 打赏
  • 举报
回复
mark!
bobi1314 2003-01-21
  • 打赏
  • 举报
回复
建了一个很复杂的数据窗口,想原样导入EXCEL中,用了好多方法,大部分都是规则导出的,只有纪大侠做的那个可以导出格式但全是乱码,有没有人遇到过啊?
或能给个好的函数方法!谢了!
纪大侠的函数:
int li_value
string ls_path,ls_fname

li_value = GetFilesaveName("请选择导出文件", &
+ ls_path, ls_fname, "XLS", &
+ "Excel文件 (*.xls), *.xls," &
+ "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.SaveAs(ls_path, HTMLTable!, True) = -1 then
MessageBox("提示信息", "导出数据出错. 不能写入文件 !", Exclamation!)
return false
end if

messagebox('提示信息','数据导出成功 !', Exclamation!)
return true


代码中有个错误是:saveas()函数使用错误了
saveas(files,type,return)
其中的type应改为:Excel!
才能为Excel文件格式,
正确的是如下:
ad_dw.SaveAs(ls_path, HTMLTable!, True) //错误
ad_dw.SaveAs(ls_path, Excel!, True) //正确
请试试!有问题给我信息:bobidoc@eyou.com
hai_yu2000 2003-01-17
  • 打赏
  • 举报
回复
saveascii
xiaobzg 2003-01-17
  • 打赏
  • 举报
回复
收藏
shantian 2003-01-17
  • 打赏
  • 举报
回复
up
killerdanny 2003-01-16
  • 打赏
  • 举报
回复
SAVE*类的函数,只保存主缓冲区的内容,向计算列这样东西是没有办法保存的!所以通用的方法没有。
一般数据不多就用OLE,要是数据多的话,一般处理是建一个中间DW,然后照样把数据倒入这个DW,要记住一定要放入主缓冲区,包括计算列的值也作为数据插入。然后用SAVEAS保存。
EdgerLee 2003-01-16
  • 打赏
  • 举报
回复
那代码不行啊!

我建的数据窗口有好几个区,上面还放了一堆计算列和文本。
htp_htp 2003-01-15
  • 打赏
  • 举报
回复
就是你 说的窗体
就是一个进度条
没有什么其它的控件和代码
:)
htp_htp 2003-01-15
  • 打赏
  • 举报
回复
saveasascii
和函数saveas的用法一样

呵呵
pb6好像没有这个函数
还是用我 写的代码吧
绝对好用,经过测试的
其中有一个是进度条,可以屏蔽掉
:)

ropriest 2003-01-14
  • 打赏
  • 举报
回复
up
myclife 2003-01-14
  • 打赏
  • 举报
回复
这是老问题了!!!

悬而未决:-(
ropriest 2003-01-14
  • 打赏
  • 举报
回复
试试这个方法:

String xlsname, named
Integer value

value = GetFileSaveName("请输入您要保存的文件名", xlsname,named,"xls","Xls Files (*.xls), *.xls")
If value = 1 Then
If not FileExists(xlsname) Then
dw_1.saveas(xlsname,excel!,true)
Else
int net
Net = MessageBox("", "该文件名已经存在,是否覆盖?", &
Exclamation!, YesNo!, 2)

If Net = 1 Then
dw_1.saveas(xlsname,excel!,true)
Else
return 0
End If
End If
Else
Return 2

End If


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
li_ret = ole_object.ConnectToNewObject("excel.Application")
If li_ret <> 0 Then
MessageBox("OLE错误","OLE无法连接!~r~n错误号:" + String(li_ret))
Return 0
End If
ole_object.visible = False
End If


pointer oldpointer
oldpointer = SetPointer(HourGlass!)

ole_object.Workbooks.open(xlsname)
ole_object.WorkSheets[1].Activate

Long ll_column, ll_rowumn
ll_column = long(dw_1.object.datawindow.column.count)
ll_rowumn = dw_1.rowcount() + 1

String ls_colname[],ls_value
Integer ii,j

Long handle

handle = OpenChannel("Excel", xlsname)

//转换标题头为中文,标题头命名应该为列名+"_t"形式
For j = 1 To ll_column
ls_colname[j] = dw_1.describe("#"+string(j)+".name")
ls_value = dw_1.describe(ls_colname[j]+"_t"+".text")
//ole_object.activesheet.cells[1,j].value = ls_value 开始的方法
SetRemote("R1C"+STRiNG(J), ls_value, handle)
Next

//将下拉数据窗口数据值转化为显示值,数据量大时比现用方法速度慢
If ll_column > 0 Then
For j = 1 To ll_column
If dw_1.Describe("#" + String(j) + ".edit.style") = 'dddw' Then
For ii=1 To ll_rowumn - 1
SetRemote("R"+STRiNG(i+1)+"C"+STRiNG(J),dw_1.Describe("Evaluate('LookUpDisplay(#"+string(j)+")',"+string(i)+")"), handle)
Next
End If
Next
End If
CloseChannel(handle)
SetPointer(oldpointer)

ole_object.ActiveWorkBook.Save()
ole_object.application.quit()
ole_object.Disconnectobject()
Destroy ole_object
messagebox("提示:","导出成功!")

Return 1

ice2water 2003-01-14
  • 打赏
  • 举报
回复
http://www.librasoft.net/
bomber2001 2003-01-14
  • 打赏
  • 举报
回复
SaveAsAscII()
yeah!!
这个听好用的
EdgerLee 2003-01-14
  • 打赏
  • 举报
回复
htp_htp(古惑仔-----打打杀杀)
没有这个SaveAscII()函数啊!是不是SaveAsAscII()函数啊?怎么用啊?
下面的那个函数调用了个窗体,上面有什么啊?我用PB6!谢了!
htp_htp 2003-01-14
  • 打赏
  • 举报
回复
建一个函数
变量是window adw
返回值是 integer
函数整体是

//declare the local variables
int li_value,li_FileNum,li_pos,li_count,i,j
string ls_path,ls_fname,ls_data,&
ls_obj,ls_objects,ls_column_t,ls_objlist[],ls_objnew[]


//weather one datawindow is exportting
if isvalid(w_jzh_progress) then return 0

li_value = GetFilesaveName("请选择导出文件", &
+ ls_path, ls_fname, "TXT", &
+ "Excel文件(*.XLS),*.xls," &
+ "文本文件 (*.TXT),*.txt," &
)
IF li_value <> 1 THEN return 0


open(w_jzh_progress)
w_jzh_progress.st_1.text = '正在保存数据......'
w_jzh_progress.hpb_1.maxposition = ad_dw.rowcount()

//all controls
ls_objects = ad_dw.Describe("datawindow.objects")

//按~t位置作判断开始循环
do while (pos(ls_objects,"~t") > 0)
li_pos = pos(ls_objects,"~t")
ls_obj = left(ls_objects,li_pos - 1)
ls_objects = right(ls_objects,len(ls_objects) - li_pos)
//(column or compute ) at detail and visible
IF (ad_dw.Describe(ls_obj+".type") = "column" or &
ad_dw.Describe(ls_obj+".type") = "compute" ) AND &
(ad_dw.Describe(ls_obj+".band") = "detail" ) AND &
(ad_dw.Describe(ls_obj+".visible") = "1" ) THEN
li_count = li_count + 1
ls_objlist[li_count] = ls_obj
END IF
loop

//the last control
ls_obj = ls_objects
IF (ad_dw.Describe(ls_obj+".type") = "column" or &
ad_dw.Describe(ls_obj+".type") = "compute" ) AND &
(ad_dw.Describe(ls_obj+".band") = "detail" ) AND &
(ad_dw.Describe(ls_obj+".visible") = "1" ) THEN
li_count = li_count + 1
ls_objlist[li_count] = ls_obj
END IF

//LineMode模式,有特殊用处,不必加 '~r~n' 换行
li_FileNum = FileOpen(ls_path,LineMode!, Write!, LockWrite!, Replace!)

//整理新数组,避免每次三个 'or' 的有效性判断,节省开销
for i = 1 to li_count
ls_column_t = ad_dw.Describe(ls_objlist[i] + "_t.text") //column_t.text
if ls_column_t = '?' or ls_column_t = '!' or isnull(ls_column_t) then continue
j++
ls_objnew[j] = ls_objlist[i]
next
li_count = j

//title
for i = 1 to li_count
ls_column_t = ad_dw.Describe(ls_objnew[i] + "_t.text") //column_t.text
ls_data = ls_data + ls_column_t + '~t'
next
filewrite(li_filenum,ls_data)

//export data
//avoid some rows be deleted when exportting
for j = 1 to ad_dw.rowcount()
yield()
if w_jzh_progress.ib_cancel then exit
w_jzh_progress.hpb_1.position = j
w_jzh_progress.st_2.text = string(j/ad_dw.rowcount()*100,'##') + '%'
ls_data = ''
for i = 1 to li_count
ls_data = ls_data + ad_dw.Describe("evaluate('LookUpDisplay("+ls_objnew[i]+")',"+string(j)+")") + '~t'
next
filewrite(li_filenum,ls_data)
next

fileclose(li_filenum)

close(w_jzh_progress)
messagebox('提示信息','导出数据成功!')

return 1

真正的所建即所得了


^_^
htp_htp 2003-01-14
  • 打赏
  • 举报
回复
呵呵
用用这个函数
saveascii
保存的即是所见即所得
比较好用了
海带标题头
:)
EdgerLee 2003-01-14
  • 打赏
  • 举报
回复
等…

1,076

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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