如何将DataWindow的记录保存为EXCEL文件?

hawkcq 2002-12-07 02:21:42
要求:
1、能够保存DataWindow中的所有内容(包括标题、页数、日期等等)
2、能够将字段保存为中文名字
3、有分组时能够按分组显示(象DataWindow的分组那样,并能分组汇总)
4、保存后的EXCEL文件能够象普通的EXCEL文件那样修改
.
.
.

现在只想到这些,总之,DataWindow是什么样,保存后的EXCEL文件就是什么样,并能在EXCEL中随意修改。
最好有源程序,提供思路也给分!
在线等待...
...全文
169 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdav 2002-12-11
  • 打赏
  • 举报
回复
该说的都有人说了,我说什么呢?
pinglv 2002-12-11
  • 打赏
  • 举报
回复
1、能够保存DataWindow中的所有内容(包括标题、页数、日期等等)
2、能够将字段保存为中文名字
3、有分组时能够按分组显示(象DataWindow的分组那样,并能分组汇总)
4、保存后的EXCEL文件能够象普通的EXCEL文件那样修改

我的函数能够满足你的第2个要求。并且可以不保存隐藏列。但是每一列的标题必须有。而且是"列名_t"
对于第1个要求,要单独处理可以做的,我的函数只针对一般情况,需要你自己扩充。
第3个嘛,我也不会:((谁会,我跟着学学:P
第4个嘛,无论用什么方法,只要能保存成.xls文件,都可以像普通的excel文件一样修改:P

//==================================================================
// Function - f_exportto_excel
//------------------------------------------------------------------
// Description: 将数据窗口中的数据导出到excel文件中
//
//注意:1、数据窗口中的隐藏列必须排列在前面。
// 如:select bianh,dis,tbdw,… from 表名
// 其中 bianh,dis是数据窗口中不显示的。
//------------------------------------------------------------------
// Arguments:
//
// datawindow datawindow
// <description> 要保存的数据窗口,只适用于free&Grid风格的数据窗口
//------------------------------------------------------------------
// Returns: (none)
//------------------------------------------------------------------
// Author: lvping Date: 2002.4
//==================================================================
OLEObject ole_excel, xlsub
ole_excel = CREATE OLEObject

if datawindow.Describe("DataWindow.Processing") > '1' then //1-----grid风格的数据窗口
return
end if

int li_ret
li_ret = ole_excel.ConnectToObject('Excel.Application')
if li_ret <> 0 then
li_ret = ole_excel.ConnectToNewObject('Excel.Application')
if li_ret <> 0 then
MessageBox('OLE错误','OLE无法连接,请返回重试!') //~r~n错误号:' + String(li_ret))
end if
ole_excel.Visible = false
end if

ole_excel.Application.Workbooks.add()
//ole_excel.Application.Workbooks.Open("c:\file.xls") //,false,true
//ole_excel.Application.Visible = true
ole_excel.Application.Visible = false

long i, j, ll_cols, ll_TargetRow,k
string ls_colname, ls_title //列名,列标题
string ls_data, ls_syntax //数组记录各显示列的值,取各列
string array_title[], array_col[] //以数组记录非隐藏列的列标题
string ls_xzb //X坐标
string ls_x[]
ll_cols = Long(datawindow.Describe("DataWindow.Column.Count")) //记录总列数
xlsub = ole_excel.Application.ActiveWorkbook.Worksheets[1]

//得到显示字段的列标题和坐标
for i = 1 to ll_cols
ls_xzb = datawindow.Describe("#" + String(i) + ".x")
if ls_xzb <> '!' and ls_xzb <> '?' then
ls_colname = datawindow.Describe("#" + String(i) + ".name") + "_t"
ls_title = datawindow.Describe(ls_colname + ".text")
k++
array_title[k] = ls_title //记录其列标题
array_col[k] = datawindow.Describe("#" + String(i) + ".name")
ls_x[k] = ls_xzb
end if
next

//按坐标值从小到大进行冒泡排序
string ls_temp
for i = 1 to upperbound(ls_x) - 1
for j = i + 1 to upperbound(ls_x)
if long(ls_x[i]) > long(ls_x[j]) then
//列标题
ls_temp = array_title[i]
array_title[i] = array_title[j]
array_title[j] = ls_temp
//列名
ls_temp = array_col[i]
array_col[i] = array_col[j]
array_col[j] = ls_temp

ls_temp = ls_x[i]
ls_x[i] = ls_x[j]
ls_x[j] = ls_temp
end if
next
next

//显示标题带
for i = 1 to upperbound(array_title)
xlsub.Cells(1, i).Value = array_title[i]
xlsub.Cells(1, i).Borders.LineStyle = 1
next

long ll_total,ll_pos
//输出各显示列的值
ll_total = datawindow.rowcount()
ll_TargetRow = 1
for i = 1 to ll_total
ll_TargetRow ++
ll_pos = i
//showprgressbar(ll_pos,ll_total,'正在生成数据,请稍等...')
for j = 1 to upperbound(array_title)
ls_syntax = "Evaluate('LookUpDisplay(" + array_col[j] + ")', " + String(i) + ")"
ls_data = String(datawindow.Describe(ls_syntax)) //取列的值
xlsub.cells[ll_TargetRow,j] = ls_data
xlsub.cells[ll_TargetRow,j].Borders.LineStyle = 1
next
next

//将标题带灰显
ole_excel.Rows("1:1").Select
ole_excel.Selection.Font.ColorIndex = 1
ole_excel.Selection.Interior.ColorIndex = 15
ole_excel.Range("H8").Select
//灰显完毕

messagebox('提示','导出完毕!')
ole_excel.Application.Visible = true

ole_excel.DisConnectObject()
Destroy ole_excel
1e21 2002-12-08
  • 打赏
  • 举报
回复
saveasascii函数
flyhot 2002-12-08
  • 打赏
  • 举报
回复
该说的都说了。:)
dotnba 2002-12-08
  • 打赏
  • 举报
回复
这是在另外一个帖子里看的,没仔细看。对不起没注明出处

string ywry1,sffdw1,djhm1,lgrq1,chm1,hc1,tdh1,portd1,rpw1,compute1,compute2
string ls_model_path,ls_model_file,k
oleobject excelserver
integer count,ret,i,j,pd
long row=1
real sumje
ls_model_path = gs_model_path + '1.xls'
ls_model_file = '1.xls'
count=dw_1.rowcount()
ret = getfileopenName('',ls_model_path,ls_model_file,'xls','Excel 文档,*.xls')
if ret<>1 then
messagebox('警告','没有找到模板文件!')
return
end if
excelserver=create oleobject
ret=excelserver.connecttonewobject("excel.application")
if ret<0 then
messagebox('错误',"不能启动EXCEL!")
excelserver.disconnectobject()
destroy excelserver
return
end if
ExcelServer.Visible = TRUE
excelserver.application.workbooks.add(ls_model_path)
if isnull(excelserver) then
return
end if
string ls_ywry,ls_ywry_s,ls_dw,ls_dw_s
string ls_djhm,ls_lgrq,ls_chm,ls_hc,ls_tdh,ls_portd,ls_sf
long ll_add
decimal ldec_usb,ldec_rmb,ldec_usb_hj,ldec_rmb_hj,ldec_usb_hj1,ldec_rmb_hj1
decimal ldec_usb_hj2,ldec_rmb_hj2,ldec_usb_hj3,ldec_rmb_hj3

ls_ywry = ''
ls_ywry_s = ''
ls_dw = ''
ls_dw_s = ''
ldec_usb = 0
ldec_rmb = 0
ldec_usb_hj = 0
ldec_rmb_hj = 0
ldec_usb_hj1 = 0
ldec_rmb_hj1 = 0
ldec_usb_hj2 = 0
ldec_rmb_hj2 = 0
ldec_usb_hj2 = 0
ldec_rmb_hj2 = 0
ldec_usb_hj3 = 0
ldec_rmb_hj3 = 0
ll_add = 0

for i = 1 to count
ls_ywry = trim(dw_1.getitemstring(i,'ywry'))
ls_dw = trim(dw_1.getitemstring(i,'sffdw'))
ls_djhm = trim(dw_1.getitemstring(i,'djhm'))
ls_lgrq = trim(dw_1.getitemstring(i,'lgrq'))
ls_chm = trim(dw_1.getitemstring(i,'chm'))
ls_hc = trim(dw_1.getitemstring(i,'hc'))
ls_tdh = trim(dw_1.getitemstring(i,'tdh'))
ls_portd = trim(dw_1.getitemstring(i,'portd'))
ls_sf = trim(dw_1.getitemstring(i,'row_column'))
ldec_usb = dw_1.getitemnumber(i,'compute_0011_1')
if isnull(ldec_usb) then
ldec_usb = 0
end if
ldec_rmb = dw_1.getitemnumber(i,'compute_0011')
if isnull(ldec_rmb) then
ldec_rmb = 0
end if

if i <> 1 then
if ls_dw_s <> ls_dw then
ExcelServer.Application.ActiveSheet.Cells(i + ll_add + 1,2).value = ls_dw_s
ExcelServer.Application.ActiveSheet.Cells(i + ll_add + 1,9).value = ldec_rmb_hj1
ExcelServer.Application.ActiveSheet.Cells(i + ll_add + 1,10).value = ldec_usb_hj1
ldec_usb_hj1 = 0
ldec_rmb_hj1 = 0
ll_add = ll_add + 1
end if
if ls_ywry_s <> ls_ywry then
ExcelServer.Application.ActiveSheet.Cells(i + ll_add + 1,1).value = ls_ywry_s
ExcelServer.Application.ActiveSheet.Cells(i + ll_add + 1,9).value = ldec_rmb_hj2
ExcelServer.Application.ActiveSheet.Cells(i + ll_add + 1,10).value = ldec_usb_hj2
ldec_usb_hj2 = 0
ldec_rmb_hj2 = 0
ll_add = ll_add + 1
end if
end if

if ls_sf = '收' then
ldec_usb_hj = ldec_usb + ldec_usb_hj
ldec_usb_hj1 = ldec_usb + ldec_usb_hj1
ldec_usb_hj2 = ldec_usb + ldec_usb_hj2
ldec_usb_hj3 = ldec_usb + ldec_usb_hj3
ldec_rmb_hj = ldec_rmb + ldec_rmb_hj
ldec_rmb_hj1 = ldec_rmb + ldec_rmb_hj1
ldec_rmb_hj2 = ldec_rmb + ldec_rmb_hj2
ldec_rmb_hj3 = ldec_rmb + ldec_rmb_hj3
else
ldec_usb_hj = (-1) * ldec_usb + ldec_usb_hj
ldec_usb_hj1 = (-1) * ldec_usb + ldec_usb_hj1
ldec_usb_hj2 = (-1) * ldec_usb + ldec_usb_hj2
ldec_usb_hj3 = (-1) * ldec_usb + ldec_usb_hj3
ldec_rmb_hj = (-1) * ldec_rmb + ldec_rmb_hj
ldec_rmb_hj1 = (-1) * ldec_rmb + ldec_rmb_hj1
ldec_rmb_hj2 = (-1) * ldec_rmb + ldec_rmb_hj2
ldec_rmb_hj3 = (-1) * ldec_rmb + ldec_rmb_hj3
end if

ExcelServer.Application.ActiveSheet.Cells(i + ll_add + 1,1).value = ls_ywry
ExcelServer.Application.ActiveSheet.Cells(i + ll_add + 1,2).value = ls_dw
ExcelServer.Application.ActiveSheet.Cells(i + ll_add + 1,3).value = ls_djhm
ExcelServer.Application.ActiveSheet.Cells(i + ll_add + 1,4).value = ls_lgrq
ExcelServer.Application.ActiveSheet.Cells(i + ll_add + 1,5).value = ls_chm
ExcelServer.Application.ActiveSheet.Cells(i + ll_add + 1,6).value = ls_hc
ExcelServer.Application.ActiveSheet.Cells(i + ll_add + 1,7).value = ls_tdh
// ExcelServer.Application.ActiveSheet.Cells(i + ll_add + 1,8).value = ls_portd
ExcelServer.Application.ActiveSheet.Cells(i + ll_add + 1,8).value = ls_sf
ExcelServer.Application.ActiveSheet.Cells(i + ll_add + 1,9).value = ldec_rmb
ExcelServer.Application.ActiveSheet.Cells(i + ll_add + 1,10).value = ldec_usb


ls_ywry_s = ls_ywry
ls_dw_s = ls_dw
next
ExcelServer.Application.ActiveSheet.Cells(i + ll_add + 1,2).value = ls_dw_s
ExcelServer.Application.ActiveSheet.Cells(i + ll_add + 1,9).value = ldec_rmb_hj1
ExcelServer.Application.ActiveSheet.Cells(i + ll_add + 1,10).value = ldec_usb_hj1
ExcelServer.Application.ActiveSheet.Cells(i + ll_add + 2,1).value = ls_ywry_s
ExcelServer.Application.ActiveSheet.Cells(i + ll_add + 2,9).value = ldec_rmb_hj2
ExcelServer.Application.ActiveSheet.Cells(i + ll_add + 2,10).value = ldec_usb_hj2
ExcelServer.Application.ActiveSheet.Cells(i + ll_add + 3,1).value = 'Total'
ExcelServer.Application.ActiveSheet.Cells(i + ll_add + 3,9).value = ldec_rmb_hj3
ExcelServer.Application.ActiveSheet.Cells(i + ll_add + 3,10).value = ldec_usb_hj3

excelserver.disconnectobject()
destroy excelserver

andyzq 2002-12-07
  • 打赏
  • 举报
回复
学习!
dotnba 2002-12-07
  • 打赏
  • 举报
回复
:)

/**********************************************
* 函数名称: changexecl(datawindow,tile) *
* 函数用法:datawindow为要转化的数据窗口; *
* tile为数据窗口的标题。 *
* 举例:changexecl(dw_1,"这是我们的世界") *
* li0827@163.com 2002/6/15 *
**********************************************/

long numcols , numrows , c, r
OLEObject xlapp , xlsub
int ret,coli
string colname,colname1

numcols = long(dw_data.Object.DataWindow.Column.Count)
numrows = dw_data.RowCount()

xlApp = Create OLEObject

ret = xlApp.ConnectToNewObject( "Excel.application" )
if ret < 0 then
MessageBox("Connect to Excel Failed !",string(ret))
return
end if

xlApp.Application.Workbooks.add()

xlApp.Application.Visible = true

xlsub = xlapp.Application.ActiveWorkbook.Worksheets[1]

string colnum //判断是A、B...或AA、AB...还是BA、BB、BC...
if integer(numcols) > 26 then
string colnumd,colnumd1
int numcols1,numcols2
numcols1 = mod(numcols,26)
numcols2 = numcols / 26
colnumd = char(numcols1 + 96)
colnumd1 = char(numcols2 + 96)
colnum ="'" + colnumd1 + colnumd + "'"
else
colnum = char(numcols + 96)
end if

xlsub.cells[1,1] = tabname //标题
xlsub.cells[1,1].HorizontalAlignment = 3
xlsub.cells[1,1].VerticalAlignment = 3
xlsub.cells[1,1].Font.Size = 20
xlsub.range("a1:" + colnum + "1").Merge()

string ls_colname
integer i
for i = 1 to numcols
//得到标题头的名字
ls_colname = dw_data.describe('#' + string(i) + ".name") + "_t"
xlsub.cells[2,i] = dw_data.describe(ls_colname + ".text")
next
//画表格线
string ls_range
ls_range = "A2:" + colnum + Trim(string(numrows+2))
xlsub.range(ls_range).borders(1).linestyle = 1
xlsub.range(ls_range).borders(2).linestyle = 1
xlsub.range(ls_range).borders(3).linestyle = 1
xlsub.range(ls_range).borders(4).linestyle = 1
//将数据写到EXECL
For c = 1 to numcols
For r = 1 to numrows
xlsub.cells[r + 2,c] = dw_data.object.data[r,c]
Next
Next

xlapp.Application.ActiveWorkbook.saved = false

xlApp.DisConnectObject()
Destroy xlapp
ice2water 2002-12-07
  • 打赏
  • 举报
回复
我也找过,不过都没有办法达到你的要求。标题等无法导入。
关注
llitcwl 2002-12-07
  • 打赏
  • 举报
回复
我也做过,但还不是很如意
这里有两个,你试试
http://www.longlive.com.cn/bbsnew/dispbbs.asp?boardID=1&RootID=5733&ID=5733
http://www.longlive.com.cn/bbsnew/dispbbs.asp?boardID=1&RootID=5735&ID=5735
比较简单是存成HTML,用EXCLE打开。
dongquestion 2002-12-07
  • 打赏
  • 举报
回复
用dw_1.saveasascii(.....),具体看帮助

611

社区成员

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

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