数据窗口导出excel时的问题
我用dw_1.SaveAs(docname, excel!, True),只能把保存成excel2.1的格式(需要把xls手动打开之后再保存才能使用),现在我要excel2000以上版本的格式,但是如果用 dw_1.SaveAs(docname, excel8!, True),我的汉字列就出现乱码,因为我有个身份证的列,我用别的方法来实现的时候,身份证列就变成了科学记数法了,这个问题怎么解决? 问题点数:50、回复次数:12Top
1 楼edp08(王二)回复于 2006-04-05 11:21:01 得分 30
//====================================================================
// Script: ue_savetoexcel()
//--------------------------------------------------------------------
// Description:
// 所见即所得地保存数据窗口内容到EXCEL文件,并格式化
//--------------------------------------------------------------------
// Returns: none
//--------------------------------------------------------------------
// Author: edp08 Date: Sept. 24, 2002
//--------------------------------------------------------------------
// Mender: edp08 Date: Mar. 31, 2003
//====================================================================
datastore lds_data, lds_col
OLEObject ole_obj, ole_book
long ll_rc, ll_cc, i
CONSTANT INTEGER xlContinuous = 1
CONSTANT INTEGER xlThin = 2
CONSTANT INTEGER xlMedium = 3
CONSTANT INTEGER xlThick = 4
CONSTANT INTEGER xlEdgeLeft = 7
CONSTANT INTEGER xlEdgeTop = 8
CONSTANT INTEGER xlEdgeBottom = 9
CONSTANT INTEGER xlEdgeRight = 10
CONSTANT INTEGER xlInsideVertical = 11
CONSTANT INTEGER xlInsideHorizontal = 12
if rowcount() = 0 then return
SetPointer(HourGlass!)
//格式化数据
ll_rc = of_getcontents(lds_data, lds_col)
if ll_rc = 0 then return
//取得用户指定的保存文件名
string docname, named
IF GetFileSaveName("Save as Excel", docname, named, "XLS", "Excel Files (*.XLS),*.XLS") = 1 THEN
//另存内容
if lds_data.SaveAs(named, Excel5!, false) <> 1 then
of_error("提示", "输出失败!")
else
//连接到Excel,处理表头
ole_obj = CREATE OLEObject
IF ole_obj.ConnectToNewObject("excel.application") <> 0 THEN
MessageBox('OLE错误', 'OLE无法连接!')
destroy ole_obj
else
ole_obj.visible = true
ole_obj.Workbooks.Open(docname)
ole_obj.Selection.EntireRow.Insert
ole_book = ole_obj.Worksheets(1)
ll_cc = lds_col.rowcount( )
for i = 1 to ll_cc
//插入中文表头
ole_book.cells(1, i).value = lds_col.object.coltitle[i]
//Decimal字段求和
if left(lds_col.object.coltype[i], 3) = 'DEC' then
ole_book.cells(ll_rc+2, i).FormulaR1C1 = "=SUM(R[-"+string(ll_rc)+"]C:R[-1]C)"
end if
next
//处理表头字体
ole_book.Range(ole_book.cells(1, 1), ole_book.cells(1, ll_cc)).Select
ole_obj.Selection.Font.Bold = True
ole_obj.Selection.Font.Name = "楷体_GB2312"
ole_obj.Selection.Font.Size = 11
ole_obj.Selection.HorizontalAlignment = -4108
//
ole_book.Range(ole_book.Cells(2, 1), ole_book.Cells(ll_rc+2, ll_cc)).Select
ole_obj.Selection.Font.Size = 10
//
//ole_book.Cells.Select
//ole_obj.Selection.Interior.ColorIndex = 48
//ole_obj.Selection.Interior.Pattern = 1
//
ole_book.Range(ole_book.Cells(1, 1), ole_book.Cells(ll_rc+2, ll_cc)).Select
for i = xlEdgeLeft to xlInsideHorizontal
ole_obj.Selection.Borders(i).LineStyle = xlContinuous
next
ole_obj.Selection.Columns.AutoFit
//ole_obj.Selection.Interior.ColorIndex = 2
//
//ole_obj.ActiveWindow.DisplayGridlines = False
//ole_obj.ActiveWindow.DisplayZeros = False
//ole_obj.ActiveSheet.DisplayAutomaticPageBreaks = True
ole_obj.ActiveWorkbook.Save
//ok!搞掂
ole_obj.disconnectobject( )
destroy ole_book
destroy ole_obj
//ShellExecute(0, 'open', named, '', '', 0)
end if
end if
end if
ChangeDirectory(gs_AppPath)
destroy lds_data
destroy lds_col
SetPointer(Arrow!)
return
Top
2 楼hylaeion(☆霖湘凝☆)回复于 2006-04-05 13:11:37 得分 0
up,用ole,自己定义导出的格式~!Top
3 楼li_d_s(鄙视那些不懂Java却跑来乱骂的人,.NET没啥了不起)回复于 2006-04-05 13:49:43 得分 20
dw2xlsTop
4 楼hygougou(uoguogyh)回复于 2006-04-05 14:21:36 得分 0
///////////////////////////////////////////////////////////////////////////
//
// Parameters : ad_dw : datawindow
// as_file : file name
// Returns : true/false : boolean
// Description : Save the datawindow as a excel file.
//
///////////////////////////////////////////////////////////////////////////
// author : purplekite
// date : 2003-01-23
///////////////////////////////////////////////////////////////////////////
SetPointer(HourGlass!)
//declare the local variables
long i, j, li_pos
string ls_objects, ls_obj, ls_text, ls_err, ls_sql
datastore lds_saveas //导出数据窗
datastore lds_sort //获得根据 object.x 排序的 (band = detail and visible = 1) 的 column/compute
boolean lb_return //返回值
string ls_pbver //pb 版本信息
environment env //环境变量
getenvironment(env)
ls_pbver = string(env.pbmajorrevision)
//创建排序列 datastore
lds_sort = create datastore
ls_sql = 'column=(type=char(1) name = ztext dbname="ztext" )' + '~r~n' + &
'column=(type=char(1) name = zcol dbname="zcol" )' + '~r~n' + &
'column=(type=long name = zx dbname="zx" )' + '~r~n'
ls_sql = 'release ' + ls_pbver + ';~r~ntable(' + ls_sql + ')'
lds_sort.create(ls_sql, ls_err)
if len(ls_err) > 0 then
lb_return = false
goto lab1
end if
//准备数据====================================================
//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
ls_text = ad_dw.describe(ls_obj + '_t.text')
if ls_text <> '!' and ls_text <> '?' then
lds_sort.insertrow(0)
lds_sort.setitem(lds_sort.rowcount(), 'ztext', ls_text)
lds_sort.setitem(lds_sort.rowcount(), 'zcol', ls_obj)
lds_sort.setitem(lds_sort.rowcount(), 'zx', long(ad_dw.describe(ls_obj + '.x')))
end if
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
ls_text = ad_dw.describe(ls_obj + '_t.text')
if ls_text <> '!' and ls_text <> '?' then
lds_sort.insertrow(0)
lds_sort.setitem(lds_sort.rowcount(), 'ztext', ls_text)
lds_sort.setitem(lds_sort.rowcount(), 'zcol', ls_obj)
lds_sort.setitem(lds_sort.rowcount(), 'zx', long(ad_dw.describe(ls_obj + '.x')))
end if
END IF
//如果没有列则跳出
if lds_sort.rowcount() < 1 then goto lab1
//根据 object.x 排序
lds_sort.setsort('zx A')
lds_sort.sort()
//创建导出 datastore
lds_saveas = create datastore
ls_sql = ''
for i = 1 to lds_sort.rowcount()
ls_obj = lds_sort.getitemstring(i, 'zcol')
ls_sql += 'column=(type=char(1) dbname="' + ls_obj + '" )' + '~r~n'
next
ls_sql = 'release ' + ls_pbver + ';~r~ntable(' + ls_sql + ')'
lds_saveas.create(ls_sql, ls_err)
if len(ls_err) > 0 then
lb_return = false
goto lab1
end if
//向 lds_saveas 中写数据
for i = 1 to ad_dw.rowcount()
yield()//释放消息队列, 如果数据量较大, 可以使用这个函数
lds_saveas.insertrow(0)
for j = 1 to lds_sort.rowcount()
ls_obj = lds_sort.getitemstring(j, 'zcol')
if ad_dw.describe(ls_obj + '.type') = 'column' then
ls_text = ad_dw.describe('evaluate(~'LookUpDisplay(' + ls_obj + ')~', ' + string(i) + ')')
else
ls_text = ad_dw.describe('evaluate(~'' + ls_obj + '~',' + string(i) + ')')
end if
lds_saveas.setitem(i, j, ls_text)
next
next
lds_saveas.insertrow(1)
for i = 1 to lds_sort.rowcount()
lds_saveas.setitem(1, i, lds_sort.getitemstring(i, 'ztext'))
next
//准备数据完毕====================================================
//saveas datawindow
lb_return = (lds_saveas.saveas(as_file, excel!, false) = 1)
lab1:
destroy lds_sort
destroy lds_saveas
SetPointer(Arrow!)
return lb_return
Top
5 楼edp08(王二)回复于 2006-04-05 14:40:07 得分 0
楼上的方法导出后,在EXCEL中数据列求和会有问题
关于数据准备,我实现的方法有所不同Top
6 楼zblaoshu1979(周博)回复于 2006-04-05 15:29:34 得分 0
一楼,你是函数里面的
rowcount(),of_getcontents,of_error,ChangeDirectory都是什么函数?Top
7 楼hxy75(小潜)回复于 2006-04-05 15:33:49 得分 0
dw2xls,方便又实用,价格也不高Top
8 楼edp08(王二)回复于 2006-04-05 15:39:33 得分 0
rowcount()内部函数呵,
of_getcontents是所见即所得的取得要保存的数据窗口内容,你不需要,你用你的DW直接saveas即可,
of_error你用MESSAGEBOX,
ChangeDirectory是为了回到原来目录,也是内部函数呵
Top
9 楼zblaoshu1979(周博)回复于 2006-04-05 15:52:19 得分 0
hygougou(uoguogyh)
你的方法得到的还是excel2.1的报表,我想得到最近版本的excel的报表怎么做/Top
10 楼zblaoshu1979(周博)回复于 2006-04-05 16:11:59 得分 0
edp08() 你的函数和我直接dw_1.SaveAs(docname, excel!, True)的结果是一样的,不能解决我的问题,我的问题是:直接dw_1.SaveAs(docname, excel!, True)的格式已经满足我想要的了,但是生成是的excel2.1版本的excel,我想要得到2000以上版本的excelTop
11 楼zblaoshu1979(周博)回复于 2006-04-05 16:42:16 得分 0
我用dw2excel解决了这个问题,谢谢你们Top
12 楼edp08(王二)回复于 2006-04-05 17:29:18 得分 0
你没有明白我的意思,我是告诉你怎么操作导出后的东西
至于导出的格式不对,是因为你用了excel!而不是excel5!,难道你没看出来?
SaveAs(named, Excel5!, false)Top




