本文爲摘自CSDN論壇帖子收集整理後彙總版本:
---2004年9月3日整理
---原貼見:
http://community.csdn.net/Expert/topic/3328/3328715.xml?temp=8.050799E-04
鑑於現在很多朋友詢問 pb 數據導出到excel 中的問題,導出去後格式和數據
類型不對了,自己寫了幾個用戶對象,
希望能拋磚引玉,加強技術交流,得到大家的支持。
1. nvo_excel 只要是兩個接口函數
導出數據存儲的數據,可以定義 excel 的標題
public function integer uf_toexcel (datastore ads_data, readonly string as_title)
導出數據窗口的數據,可以定義 excel 的標題
public function integer uf_toexcel (datawindow adw_data, readonly string as_title)
2. 下面是兩個用戶對象的 sru 文件,自己導入到工程中
$PBExportHeader$uo_ds_base.sru
$PBExportComments$數據存儲基類
forward
global type uo_ds_base from datastore
end type
end forward
global type uo_ds_base from datastore
string dataobject = "d_expression"
end type
global uo_ds_base uo_ds_base
forward prototypes
public function any uf_getitemvalue (long al_row, string as_colname)
public function string uf_about ()
public function string uf_globalreplace (string as_source, string as_old, string as_new)
end prototypes
public function any uf_getitemvalue (long al_row, string as_colname);
//*************************************************//
//function : 得到任意的列的值
//parm :
// 1. al_row : 指定行
// 2. as_colname : 指定列的列名
//return : -1 is fail or success is value to you
//author : hzh
//date : 2002.11.05
//************************************************//
String s_tempcoltype
any a_ret
s_tempcoltype = Lower(THIS.Describe(as_colname + ".coltype"))
//for string type
IF Left(s_tempcoltype,4) = "char" OR Left(s_tempcoltype,4) ="varc"then
a_ret = THIS.GetItemString(al_row,as_colname)
END IF
//for decimal type
IF Left(s_tempcoltype,7) = "decimal" then
a_ret = THIS.GetItemDecimal(al_row,as_colname)
END IF
//for date type
IF s_tempcoltype = "date" THEN
a_ret = THIS.GetItemDate(al_row,as_colname)
END IF
//for datetime type
IF s_tempcoltype = "datetime" THEN
a_ret = THIS.GetItemDateTime(al_row,as_colname)
END IF
//for number type
IF s_tempcoltype = "number" THEN
a_ret = THIS.GetItemNumber(al_row,as_colname)
END IF
//for time type
IF s_tempcoltype = "time" THEN
a_ret = THIS.GetItemTime(al_row,as_colname)
END IF
//for timestamp type
IF s_tempcoltype = "timestamp" THEN
a_ret = THIS.GetItemTime(al_row,as_colname)
END IF
//for int or long
IF s_tempcoltype = "int" OR s_tempcoltype = "long" THEN
a_ret = THIS.GetItemnumber(al_row,as_colname)
END IF
IF IsNull(a_ret) THEN
RETURN -1
END IF
RETURN a_ret
end function
public function string uf_about ();
string s_func = ""
s_func = " 1. 求得表達式的值 (uf_evaluate) " +&
" 2. 根據 SQL ,創建數據存儲 (uf_setsqlselect) ~r~n " +&
" 3. 得到任意列的值(uf_getitemvalue) ~r~n "
//s_func += SUPER :: uf_about()
RETURN "uo_ds_base object member's functions : ~r~n" + s_func
end function
public function string uf_globalreplace (string as_source, string as_old, string as_new);
//**************************************************************//
//function : 用指定的字符串替換指定字符串
//parm :
// 1. as_source : 原來的字符串
// 2. as_old : 將要被替換的字符串
// 3. as_new : 用來替換的字符串
//return : 新的字符串
//author : hzh
//date : 2002.11.14
//*************************************************************//
Long l_newlen, l_oldlen, l_start
String s_null, s_source
IF IsNull(as_source) OR IsNull(as_old) OR IsNull(as_new) THEN
SetNull(s_null)
RETURN s_null
ELSE
l_oldlen = Len(as_old)
l_newlen = Len(as_new)
as_Old = Lower(as_old)
s_Source = Lower(as_source)
END IF
l_start = Pos(s_source, as_old)
DO WHILE l_start > 0
as_source = Replace(as_source, l_start, l_oldlen, as_new)
s_source = Lower(as_Source)
l_start = Pos(s_source, as_old, (l_start + l_newlen))
LOOP
RETURN as_source
end function
on uo_ds_base.create
call super::create
TriggerEvent( this, "constructor" )
end on
on uo_ds_base.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on
-----------------------------------------------------------------
$PBExportHeader$nvo_excel.sru
$PBExportComments$和 excel 通訊的功能函數
forward
global type nvo_excel from nonvisualobject
end type
end forward
global type nvo_excel from nonvisualobject
end type
global nvo_excel nvo_excel
type prototypes
Private:
Function uint GetModuleFileNameA(ulong hModule,ref string lpFilename,ulong nSize) Library "kernel32.dll"
end prototypes
type variables
Private:
//存儲要導出的數據
uo_ds_base ids_data
//列名
String is_columnname[]
//列的標題
String is_columntitle[]
//列的顯示格式
String is_columnformat[]
//列的類型
String is_columntype[]
end variables
forward prototypes
public function integer uf_toexcel (datastore ads_data, readonly string as_title)
public function integer uf_toexcel (datawindow adw_data, readonly string as_title)
private function integer uf_setdatasource (datawindow adw_data)
private function integer uf_setdatasource (datastore ads_data)
private function integer uf_datatoexcel (string as_title)
public function string uf_about ()
private function integer uf_initcolumn ()
end prototypes
public function integer uf_toexcel (datastore ads_data, readonly string as_title);
/**********************************************************/
//Function : 轉換數據到 excel
//parm :
// 1. ads_data : 包含源數據的對象
// 2. as_title : excel 的標題
//return : 1 is success and -1 is fail
//Author : hzh
//date : 2003.12.08
/**********************************************************/
IF THIS.uf_setdatasource(ads_data) <> 1 THEN RETURN -1
IF NOT IsValid(ids_data) THEN RETURN -1
IF ids_data.RowCount() < 1 THEN RETURN -1
THIS.uf_initcolumn()
THIS.uf_datatoexcel(as_title)
RETURN 1
end function
public function integer uf_toexcel (datawindow adw_data, readonly string as_title);
/**********************************************************/
//Function : 轉換數據到 excel
//parm :
// 1. adw_data : 包含源數據的對象
// 2. as_title : excel 的標題
//return : 1 is success and -1 is fail
//Author : hzh
//date : 2003.12.08
/**********************************************************/
IF THIS.uf_setdatasource(adw_data) <> 1 THEN RETURN -1
IF NOT IsValid(ids_data) THEN RETURN -1
IF ids_data.RowCount() < 1 THEN RETURN -1
THIS.uf_initcolumn()
THIS.uf_datatoexcel(as_title)
RETURN 1
end function
private function integer uf_setdatasource (datawindow adw_data);/**********************************************************/
//Function : 設置數據存儲
//parm : None
//return :
//Author : hzh
//date : 2003.12.08
/**********************************************************/
ids_data.dataobject = adw_data.dataobject
//ids_data.uf_setddobject()
RETURN adw_data.ShareData(ids_data)
end function
private function integer uf_setdatasource (datastore ads_data);
/**********************************************************/
//Function : 設置數據存儲
//parm : None
//return :
//Author : hzh
//date : 2003.12.08
/**********************************************************/
ids_data.dataobject = ads_data.dataobject
//ids_data.uf_setddobject()
RETURN ads_data.ShareData(ids_data)
end function
private function integer uf_datatoexcel (string as_title);
/**********************************************************/
//Function : 轉換數據到 excel
//parm :
// 1. as_title : excel 的標題
//return : 1 is success and -1 is fail
//Author : hzh
//date : 2003.12.08
//Modifier :
// 1. 2003.12.10 by hzh
//Reason :
// 1. 增加對計算列的處理
/**********************************************************/
long l_cnt,l_i,l_cols,l_rows
string s_colnum ,s_colname,s_range
OLEObject xlapp , xlsub
//l_cols = long(ids_data.Object.DataWindow.Column.Count)
l_cols = UpperBound(is_columntitle)
l_rows = ids_data.RowCount()
IF NOT IsValid(xlApp) THEN
xlApp = CREATE OLEObject
END IF
IF xlApp.ConnectToNewObject( "Excel.Application" ) < 0 THEN
MessageBox('ga_app.dwmessagetitle',"不能連接 EXCEL 服務器,請檢查你的計算機中是 ~r~n " +&
"否安裝了MS EXCEL ? 假如安裝,請與程序供應商聯繫 !",QuesTion!)
RETURN -1
END IF
//增加空文檔 (EXCEL table)
xlApp.Application.Workbooks.add()
xlApp.Application.Visible = TRUE
IF NOT IsValid(xlsub) THEN
xlsub = CREATE OLEObject
END IF
//定位到第一格
xlsub = xlapp.Application.ActiveWorkbook.Worksheets[1]
//取得最後列的字母表達式
IF Long(l_cols) > 26 then
//AA、AB...還是BA、BB、BC...
int i_colstart,i_colend
i_colstart = Mod(l_cols,26)
i_colend = l_cols / 26
s_colnum = "'" + Char(i_colstart + 96 ) + Char(i_colend + 96) + "'"
ELSE
//是 A,B,C...格式
s_colnum = char(l_cols + 96)
END IF
//標題的設置
xlsub.cells[1,1] = as_title
xlsub.cells[1,1].HorizontalAlignment = 3
xlsub.cells[1,1].VerticalAlignment = 3
xlsub.cells[1,1].Font.Size = 18
//去處格子
xlsub.range("A1:" + s_colnum + "1").Merge()
FOR l_i = 1 TO l_cols
//設置標題列的名字
xlsub.cells[2,l_i] = is_columntitle[l_i]
NEXT
----------------------------------------------------
//畫表格線
//數據行從第二行開始
s_range = "A2:" + s_colnum + Trim(String(l_rows + 2))
xlsub.range(s_range).borders(1).linestyle = 1
xlsub.range(s_range).borders(2).linestyle = 1
xlsub.range(s_range).borders(3).linestyle = 1
xlsub.range(s_range).borders(4).linestyle = 1
//將數據寫到EXECL
FOR l_i = 1 TO l_cols
FOR l_cnt = 1 TO l_rows
IF is_columntype[l_i] = 'column' THEN
String s_evaluate
s_evaluate = "Evaluate('LookUpDisplay(" + is_columnname[l_i]
s_evaluate += ")'," + String(l_cnt) + ')'
xlsub.cells[l_cnt + 2,l_i].FormulaR1C1 = ids_data.Describe(s_evaluate)
ELSE
xlsub.cells[l_cnt + 2,l_i].FormulaR1C1 = &
ids_data.uf_getitemvalue(l_cnt,is_columnname[l_i])
END IF
xlsub.cells[l_cnt + 2,l_i].NumberFormatLocal = is_columnformat[l_i]
NEXT
NEXT
xlapp.Application.ActiveWorkbook.saved = FALSE
xlApp.DisConnectObject()
IF IsValid(xlApp) THEN
DESTROY xlapp
END IF
IF IsValid(xlsub) THEN
DESTROY xlsub
END IF
RETURN 1
end function
public function string uf_about ();
/**********************************************************/
//Function : 用戶對象功能介紹
//parm : None
//return : 介紹的文本和對應的公共函數
//Author : hzh
//date : 2003.12.08
/**********************************************************/
String s_func = ""
//s_func = super :: uf_about()
s_func = s_func + "~r~nvo_excel object member's functions : ~r~n"
s_func+= " 1. 用戶對象功能介紹 (uf_about) ~r~n" +&
" 2. 程序數據導出爲 excel 表,已經重載 (uf_toexcel) ~r~n"
RETURN s_func
end function
private function integer uf_initcolumn ();
/**********************************************************/
//Function : 初始化列信息
//parm :
//return : of no use
//Author : hzh
//date : 2003.12.08
//Modifier :
// 1. 2003.12.10 by hzh
//Reason :
// 1. 增加對計算列的處理
/**********************************************************/
Int i_cnt
String s_colname,s_datatype
//清空對象
FOR i_cnt = 1 TO UpperBound(is_columnname)
SetNull(is_columnname[i_cnt])
SetNull(is_columntitle[i_cnt])
SetNull(is_columnformat[i_cnt])
SetNull(is_columntype[i_cnt])
END FOR
String s_objects
uo_ds_base ds_excel
IF NOT IsValid(ds_excel) THEN
ds_excel = CREATE uo_ds_base
END IF
ds_excel.dataobject = 'dw_excel_columns'
s_objects = ids_data.Describe("DataWindow.Objects")
// 將 DETAIL 區域內的所有可見目標放到 ds_excel 中,
// 並按照 object.x 屬性大小排序
DO WHILE Len(s_objects) > 0
Int i_pos
Long l_x
String s_name,s_type,s_band,s_visible,s_objtype
String s_objzw,s_zw
i_pos = Pos(s_objects, "~t")
IF i_pos <= 0 THEN i_pos = Len(s_objects) + 1
// Object 名字
s_name = Left(s_objects,i_pos - 1)
s_objects = Mid(s_objects,i_pos + 1, Len(s_objects))
//Object 數據類型
s_type = Lower(ids_data.Describe(s_name + ".coltype"))
// Object X 座標
l_x = Long(ids_data.Describe(s_name + ".x"))
// Object 所屬區域
s_band = Lower(ids_data.Describe(s_name + ".band"))
// Object 是否可見
s_visible = ids_data.Describe(s_name + ".visible")
// Object 類別
s_objtype = Lower(ids_data.Describe(s_name + ".type"))
// 如果 object 在 Detail 區,且可見,並且是 column 或 Compute Column
IF s_band = "detail" AND s_visible = "1" AND &
(s_objtype = "column" OR s_objtype = "compute" ) THEN
// Object 中文標頭,支持標準命名
s_objzw = s_name + "_t"
s_zw = ids_data.describe(s_objzw + ".text")
// 去掉標題中多餘的換行符,空格和引號
s_zw = ds_excel.uf_globalreplace(s_zw,"~n","")
s_zw = ds_excel.uf_globalreplace(s_zw," ","")
s_zw = ds_excel.uf_globalreplace(s_zw,'"',"")
Long l_newrow
l_newrow = ds_excel.InsertRow(0)
ds_excel.SetItem(l_newrow, "colname",s_name)
ds_excel.SetItem(l_newrow, "x",l_x)
ds_excel.SetItem(l_newrow, "coltype",s_type)
ds_excel.SetItem(l_newrow, "coltitle",s_zw)
ds_excel.SetItem(l_newrow, "objtype",s_objtype)
END IF
LOOP
//排序,設置到列數組中
ds_excel.SetSort("x a")
ds_excel.Sort()
FOR i_cnt = 1 TO ds_excel.RowCount()
is_columnname[i_cnt] = Lower(ds_excel.GetItemString(i_cnt,'colname'))
is_columntitle[i_cnt] = ds_excel.GetItemString(i_cnt,'coltitle')
is_columntype[i_cnt] = ds_excel.GetItemString(i_cnt,'objtype')
s_datatype = Left(Lower(ds_excel.GetItemString(i_cnt,'coltype')),4)
CHOOSE CASE s_datatype
CASE 'char','varc','int','long'
is_columnformat[i_cnt] = 'G/通用格式'
//特別指定日期專用格式爲 char(10)
s_datatype = Lower(ds_excel.GetItemString(i_cnt,'coltype'))
IF s_datatype = 'char(10)' THEN
is_columnformat[i_cnt] = 'yyyy""年""m""月""d""日""'
END IF
CASE 'deci'
is_columnformat[i_cnt] = "0.00_ "
CASE 'date','datetime'
is_columnformat[i_cnt] = 'yyyy""年""m""月""d""日""'
CASE 'time'
is_columnformat[i_cnt] = 'h""時""mm""分""ss""秒""'
CASE ELSE
is_columnformat[i_cnt] = 'G/通用格式'
END CHOOSE
NEXT
IF IsValid(ds_excel) THEN
DESTROY ds_excel
END IF
RETURN 1
end function
on nvo_excel.create
call super::create
TriggerEvent( this, "constructor" )
end on
on nvo_excel.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on
event constructor;
IF NOT IsValid(ids_data) THEN
ids_data = CREATE uo_ds_base
END IF
end event
event destructor;
IF IsValid(ids_data) THEN
DESTROY ids_data
END IF
end event
--------------------------------------------
$PBExportHeader$dw_excel_columns.srd
$PBExportComments$臨時得 轉換對象
release 7;
datawindow(units=0 timer_interval=0 color=16777215 processing=1 HTMLDW=no print.documentname="" print.orientation = 0 print.margin.left = 110 print.margin.right = 110 print.margin.top = 96 print.margin.bottom = 96 print.paper.source = 0 print.paper.size = 0 print.prompt=no print.buttons=no print.preview.buttons=no grid.lines=0 )
header(height=68 color="536870912" )
summary(height=0 color="536870912" )
footer(height=0 color="536870912" )
detail(height=76 color="536870912" )
table(column=(type=char(40) updatewhereclause=no name=coltitle dbname="coltitle" )
column=(type=char(30) updatewhereclause=no name=colname dbname="colname" )
column=(type=long updatewhereclause=no name=x dbname="x" )
column=(type=char(10) updatewhereclause=no name=objtype dbname="objtype" )
column=(type=char(20) updatewhereclause=no name=coltype dbname="coltype" )
)
text(band=header alignment="2" text="Coltype" border="2" color="0" x="718" y="4" height="60" width="361" name=coltype_t font.face="宋體" font.height="-10" font.weight="400" font.family="0" font.pitch="2" font.charset="134" background.mode="2" background.color="80269524" )
text(band=header alignment="0" text="coltitle" border="2" color="0" x="1088" y="4" height="60" width="434" name=t_1 font.face="宋體" font.height="-10" font.weight="400" font.family="0" font.pitch="2" font.charset="134" background.mode="2" background.color="80269524" )
text(band=header alignment="0" text="objtype" border="2" color="0" x="1531" y="4" height="60" width="320" name=t_2 font.face="宋體" font.height="-10" font.weight="400" font.family="0" font.pitch="2" font.charset="134" background.mode="2" background.color="80269524" )
text(band=header alignment="2" text="Colname" border="2" color="0" x="9" y="4" height="60" width="457" name=colname_t font.face="宋體" font.height="-10" font.weight="400" font.family="0" font.pitch="2" font.charset="134" background.mode="2" background.color="80269524" )
text(band=header alignment="2" text="X" border="2" color="0" x="475" y="4" height="60" width="233" name=x_t font.face="宋體" font.height="-10" font.weight="400" font.family="0" font.pitch="2" font.charset="134" background.mode="2" background.color="80269524" )
column(band=detail id=1 alignment="0" tabsequence=32766 border="2" color="0" x="1088" y="0" height="72" width="434" format="[general]" name=coltitle edit.limit=0 edit.case=any edit.autoselect=yes font.face="宋體" font.height="-10" font.weight="400" font.family="2" font.pitch="2" font.charset="134" background.mode="2" background.color="16777215" )
column(band=detail id=4 alignment="0" tabsequence=32766 border="2" color="0" x="1531" y="0" height="72" width="320" format="[general]" name=objtype edit.limit=0 edit.case=any edit.autoselect=yes font.face="宋體" font.height="-10" font.weight="400" font.family="2" font.pitch="2" font.charset="134" background.mode="2" background.color="16777215" )
column(band=detail id=2 alignment="0" tabsequence=10 border="2" color="0" x="9" y="0" height="72" width="457" format="[general]" name=colname edit.limit=0 edit.case=any edit.focusrectangle=no edit.autoselect=yes edit.autohscroll=yes font.face="宋體" font.height="-10" font.weight="400" font.family="2" font.pitch="2" font.charset="134" background.mode="1" background.color="536870912" )
column(band=detail id=3 alignment="1" tabsequence=20 border="2" color="0" x="475" y="0" height="72" width="233" format="[general]" name=x edit.limit=0 edit.case=any edit.focusrectangle=no edit.autoselect=yes edit.autohscroll=yes font.face="宋體" font.height="-10" font.weight="400" font.family="2" font.pitch="2" font.charset="134" background.mode="1" background.color="536870912" )
column(band=detail id=5 alignment="0" tabsequence=30 border="2" color="0" x="718" y="0" height="72" width="361" format="[general]" name=coltype edit.limit=0 edit.case=any edit.focusrectangle=no edit.autoselect=yes edit.autohscroll=yes font.face="宋體" font.height="-10" font.weight="400" font.family="2" font.pitch="2" font.charset="134" background.mode="1" background.color="536870912" )
htmltable(border="1" )
htmlgen(clientevents="1" clientvalidation="1" clientcomputedfields="1" clientformatting="0" clientscriptable="0" generatejavascript="1" )
----------------------------------------------------------
上面的程序 Bug 列表 :
1.
/**********************************************************/
//Function : 轉換數據到 excel
//parm :
// 1. as_title : excel 的標題
//return : 1 is success and -1 is fail
//Author : hzh
//date : 2003.12.08
//Modifier :
// 1. 2003.12.10 by hzh
//Reason :
// 1. 增加對計算列的處理
/**********************************************************/
long l_cnt,l_i,l_cols,l_rows
string s_colnum ,s_colname,s_range
OLEObject xlapp , xlsub
FOR l_i = 1 TO UpperBound(is_columntitle)
IF IsNull(is_columntitle[l_i]) THEN EXIT
l_cols++
NEXT
2.
函數 : uf_initcolumn 處理 datetime 格式不是很好
CASE 'date'//,'datetime'
s_datatype = Lower(ds_excel.GetItemString(i_cnt,'coltype'))
IF s_datatype = 'datetime' THEN
is_columnformat[i_cnt] = 'yyyy-m-d h:mm'
ELSE
is_columnformat[i_cnt] = 'yyyy""年""m""月""d""日""'
END IF
3. 這個不是錯誤,可以加強一下功能
//特別指定日期專用格式爲 char(10)
s_datatype = Lower(ds_excel.GetItemString(i_cnt,'coltype'))
IF s_datatype = 'char(10)' THEN
is_columnformat[i_cnt] = 'yyyy""年""m""月""d""日""'
END IF
//特別指定時間專用格式爲 char(8)
s_datatype = Lower(ds_excel.GetItemString(i_cnt,'coltype'))
IF s_datatype = 'char(8)' THEN
is_columnformat[i_cnt] = 'h""時""mm""分""ss""秒""'
END IF
//特別指定日期時間專用格式爲 char(19)
s_datatype = Lower(ds_excel.GetItemString(i_cnt,'coltype'))
IF s_datatype = 'char(19)' THEN
is_columnformat[i_cnt] = 'yyyy-m-d h:mm'
END IF
根據代碼,只有 char(8),10,19 纔有啊,這是我設計日期,時間等的專用格式
-----------------------------------------------------------
我再把另外一個帖子當中中國龍的方法也貼過來,那個帖子可能由於CSDN歷史帖子管理原因無法成功添加爲FAQ,也很可惜,大家如果有其他好的方法也請一併貼上來:
llitcwl(中國龍):
//====================================================================
// [PUBLIC] Function uf_data2excel 在 u_data2word inherited from nonvisualobject
//--------------------------------------------------------------------
// 說明:將數據倒入excel中,支持計算列及顯示格式,要求在題頭的計算列要寫tag值
//--------------------------------------------------------------------
// 參數1:[value] datawindow adw
// 說明:數據窗口
//--------------------------------------------------------------------
// 返回: (INTEGER) 成功返回1,不成功返回0
//--------------------------------------------------------------------
// 作者: cwl 日期: 2002.03.18
//====================================================================
//變更日誌:020515加入對交叉表倒出的支持(主要是修改了保存題頭部分)
constant integer ppLayoutBlank = 12
OLEObject ole_object
ole_object = CREATE OLEObject
integer li_ret,li_crosstab=0
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
//題頭區
long ll_headnum
string ls_head[],ls_headtag[]
//合計區
long ll_sumnum,i=1,startpos=1,endpos,li_pos
string ls_sum[],ls_sumtag[],ls_bind,token[],list,ls_temp,ls_crosstabcol
n_cst_string lu_string //PFC string處理對象
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 = false//不可見
END IF
if adw.Object.DataWindow.Processing='4' then //交叉表處理
adw.Object.DataWindow.Crosstab.StaticMode='true'//將數據靜態化
li_crosstab=1
end if
pointer oldpointer
oldpointer = SetPointer(HourGlass!)
//新增一個工作區
ole_object.Workbooks.Add
ls_objects = trim(adw.Describe('datawindow.Objects'))
list=ls_objects
EndPos = pos(list, '~t', StartPos)
//得到對象列表
Do while ( EndPos > 0 )
token[i] = Mid(list, StartPos, EndPos - StartPos)
i ++
StartPos = EndPos + 1
EndPos = pos(list, '~t', StartPos)
LOOP
token[i] = Mid(list, StartPos)
ll_rownum=UpperBound(token)
for i=1 to ll_rownum
ls_obj = token[i]
if ls_obj='title' then messagebox('',adw.Describe(ls_obj + '.type'))
if lower(adw.Describe(ls_obj + '.type')) = 'column' or &
lower(adw.Describe(ls_obj + '.type')) = 'compute' then
ls_bind=lower(adw.Describe(ls_obj + '.band'))
if ls_bind = 'detail' then
ll_num += 1
ls_objs[ll_num] = ls_obj
if li_crosstab=0 then //一般處理
ls_objtag[ll_num] = adw.Describe(ls_obj + '_t.text')
elseif li_crosstab=1 then //交叉表處理
li_pos=lu_string.of_lastpos(ls_obj,'_',len(ls_obj))//找出最後一次出現'_'的位置
if li_pos=0 or (not isnumber(mid(ls_obj,li_pos+1))) then //不是交叉列
ls_objtag[ll_num] = adw.Describe(ls_obj + '_t.text')
else
ls_temp=mid(ls_obj,li_pos)
ls_crosstabcol=mid(ls_obj,1,li_pos - 1)//取出交叉列名
// messagebox('',ls_crosstabcol+',,,,'+ls_temp)
ls_objtag[ll_num]=adw.Describe( ls_crosstabcol + "_t"+ls_temp+".Text" )//取出交叉表的題頭
end if
end if
elseif (ls_bind = 'summary') then
ll_sumnum += 1
ls_sum[ll_sumnum] = ls_obj
ls_sumtag[ll_sumnum] = adw.Describe(ls_obj + '.tag')
else
ll_headnum += 1
ls_head[ll_headnum] = ls_obj
ls_headtag[ll_headnum] = adw.Describe(ls_obj + '.tag')
end if
end if
next
//得到數據窗口數據的列數與行數(行數應該是數據行數 + 2)
ll_colnum = ll_num
ll_rownum = adw.rowcount() + 2
string column_name
string ls_colname
integer j,k
//寫題頭
for i=1 to ll_headnum
ls_value = ls_headtag[i]
if ls_value<>'?' then
ole_object.cells(1,(i - 1)*2+1).value = ls_value
end if
column_name = ls_head[i]
ls_value=this.uf_getdata(adw,column_name,1)
ole_object.cells(1,(i)*2).value = ls_value
next
//寫結尾
for i=1 to ll_sumnum
ls_value = ls_sumtag[i]
if ls_value<>'?' then
ole_object.cells(ll_rownum+1,(i - 1)*2+1).value = ls_value
end if
column_name = ls_sum[i]
ls_value=this.uf_getdata(adw,column_name,1)
ole_object.cells(ll_rownum+1,(i)*2).value = ls_value
next
//寫標題
for i = 1 to ll_colnum
//得到標題頭的名字
ls_value = ls_objtag[i]
ole_object.cells(2,i).value = ls_value
next
//寫數據
for i = 3 to ll_rownum
for j = 1 to ll_colnum
column_name = ls_objs[j]
ls_value=this.uf_getdata(adw,column_name,i - 2)
ole_object.cells(i,j).value = ls_value
next
next
SetPointer(oldpointer)
ole_object.Visible = True
ole_object.disconnectobject()
DESTROY ole_object
return 1
//====================================================================
// [PUBLIC] Function uf_getdata 在 u_data2word inherited from nonvisualobject
//--------------------------------------------------------------------
// 說明:得到一個數據窗口列及計算列的準確顯示值
//--------------------------------------------------------------------
// 參數1:[value] datawindow dw_1
// 說明:
// 參數2:[value] string col
// 說明:對象名
// 參數3:[value] integer row
// 說明:行
//--------------------------------------------------------------------
// 返回: (STRING) 值
//--------------------------------------------------------------------
// 作者: cwl 日期: 2002.03.18
//====================================================================
string ls_edittype,ls_value,ls_format
integer id
ls_edittype=lower(dw_1.Describe(col+".Edit.Style"))//得到編緝風格
choose case ls_edittype
case 'ddlb','dddw'//應該得到顯示值
ls_value=dw_1.describe( "Evaluate('LookUpDisplay("+col+") ',"+string(row)+" )")
case else
id=long(dw_1.Describe(col+".id"))
ls_format=dw_1.Describe(col+".Format")
if mid(ls_format,1,1)='[' or ls_format='?' or ls_format='' then //不作格式處理
if id=0 then //計算列
ls_value=dw_1.Describe("Evaluate(~"" + dw_1.Describe(col + '.expression')&
+ "~","+string(row)+")")
else
ls_value=string(dw_1.object.data[row,id])
end if
else
if id=0 then //計算列
ls_value=string(dw_1.Describe("Evaluate('" + dw_1.Describe(col + '.expression')&
+ "',"+string(row)+")"),ls_format)
else
ls_value=string(dw_1.object.data[row,id],ls_format)
end if
end if
end choose
if isnull(ls_value) then ls_value=''
return ls_value
或者直接存成html文件
----------------------------------------------------------
繼續響應,這是以前一位仁兄的代碼:
/**********************************************************/
/* 函數名稱:uf_dwsaveas_excel
功能 :將數據窗口數據導出EXCEL文件,並將EXCEL文件默認英文標題替換成中文。
參數 :datawindow datawin,爲用戶要導出數據窗口的數據窗口控件名
返回值:integer 1,success;-1,error
流程描述:先用saveasAscii()倒出爲excel文件,再替換表頭爲中文名
設計人:yanhui 2003年11月
修改人:葉文林 2004.4.8
原因:爲提高程序的可讀性作了少量的修改(如:增加註釋、改變排版風格等)*/
/**********************************************************/
/***************以下程序將導出爲EXCEL文檔******************/
integer li_rtn,ii,li_asc
string ls_name,ls_pathname
boolean lb_exist
if datawin.RowCount()<1 then
MessageBox("提示信息","請先檢索數據再導出至Excel!")
return -1 //error
end if
li_rtn=GetFileSaveName("保存文件",ls_pathname,ls_name,"xls","Excel文件(*.xls),*.xls")
if li_rtn=1 then
lb_exist = FileExists(ls_pathname)
IF lb_exist THEN
li_rtn = MessageBox("保存", ls_pathname+"已經存在,是否覆蓋?",Exclamation!, YesNo!)
end if
if li_rtn=1 then
//當文件存在用戶選擇覆蓋,或是文件本就不存在時。注意變量li_rtn
li_rtn=datawin.SaveAsAscii(ls_pathname)
if li_rtn=1 then
// MessageBox("提示信息","導出數據成功!")
else
MessageBox("錯誤信息","導出數據失敗!")
return -1 //error
end if
else
return -1 //error
end if
else
return -1
end if
/**********以下程序將導出的EXCEL英文標題替換爲漢字*********/
long numcols , numrows , c, r
OLEObject xlapp , xlsub
int ret
numcols = long(datawin.Object.DataWindow.Column.Count)
numrows = datawin.RowCount()
// 產生oleobject的實例
xlApp = Create OLEObject
//連接ole對象
ret = xlApp.ConnectToNewObject( "Excel.Sheet" )
if ret < 0 then
MessageBox("連接失敗!","連接到EXCEL失敗,請確認您的系統是否已經安裝EXCEL!~r~n"&
+"錯誤代碼:"+string(ret))
return -1
end if
// 打開EXCEL文件
xlApp.Application.Workbooks.Open(ls_pathname)
////使文件可見
//xlApp.Application.Visible = true
// 得到活動工作表的引用,改善程序性能
xlsub = xlapp.Application.ActiveWorkbook.Worksheets[1]
string ls_colname,ls_text,ls_modistr,ls_col
//取字段名更改爲對應的文本text值
FOR c=1 to numcols
ls_col="#"+string(c)+".name"
ls_colname=datawin.describe(ls_col)
ls_modistr=ls_colname+"_t.text"
ls_text=datawin.describe(ls_modistr)
xlsub.cells[1,c]=ls_text
NEXT
xlApp.DisConnectObject()
Destroy xlapp
MessageBox("提示信息","導出數據成功!")
return 1 //success
--------------------------------------------------------------
收藏的一個導出爲 excel 的例子
(支持導出分組帶、合計帶,並且支持多層嵌套報表導出,基本是所見及所得)
///////////////////////////////////////////////////////////////////////////
//
// 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