目的:通過PB匯入excel到相應的資料庫表中。
思路:先選擇excel檔案,加載到DataWindow,再插入到表中。
這個思路是否可行?
uj5u.com熱心網友回復:
按這個思路,我建了一個應用包含一個事件
open(w_main) //w_main
一個w_main視窗
有一個DataWindowd控制元件w_product
一個cb_1按鈕 clicked事件:
long numcols,numrows,c,r
OLEObject xlapp,xlsub
int ret
//定義變數
numcols = long(dw_product.Object.DataWindow.Column.Count)
//設定行號和列號
numrows = dw_product.RowCount()
//獲得行數
xlApp = Create OLEObject
//創建OLE物件
ret = xlApp.ConnectToNewObject( "Excel.Sheet " )
if ret < 0 then
MessageBox( "連接Excel程式失敗! ",string(ret))
return
end if
//連接Excel,并檢驗回傳值
xlApp.Application.Workbooks.Open( "E:\ybb.xls ")
//打開一個特定的Excel檔案
xlApp.Application.Visible = true
//使該Excel檔案可視
xlsub = xlapp.Application.ActiveWorkbook.Worksheets[1]
//確定第一個作業簿
For c = 1 to numcols
For r = 1 to numrows
xlsub.cells[r,c] = dw_product.object.data[r,c]
Next
Next
//回圈發送資料
xlApp.DisConnectObject()
Destroy xlapp
//斷開連接
運行報錯:
PowerBuilder Application Execution Error (R0002)
---------------------------
Application terminated.
Error: Null object reference at line 6 in clicked event of object cb_1 of w_main.
uj5u.com熱心網友回復:
給你一個函式,直接呼叫即可匯入xls、text或dbf檔案中的資料。當然前提是資料視窗列序要和excel檔案的列序相同。你可以自己起個函式名:string path,filename
integer value,result,li_startrow
//ab_flag boolean 傳入是否有標題行,有=true,無=false
//idw_dw datawindow 資料視窗
//回傳 long
if ab_flag then
li_startrow = 2
else
li_startrow = 1
end if
value = GetFileOpenName("請選擇欲匯入的檔案",path,filename,"xls","xls Files (*.xls),*.xls,Text Files (*.TXT),*.TXT,DBF Files (*.DBF),*.DBF")
if value<>1 then return -1
if right(path,3)='xls' or right(path,3)='XLS' then
OLEObject ObjExcel
ObjExcel = CREATE OLEObject
result = ObjExcel.ConnectToNewObject( "excel.application")
if result <> 0 then
messagebox("資訊提示","連接EXCEL失敗,請檢查計算機中是否安裝了EXCEL!")
Return -1
else
ObjExcel.Workbooks.Open(path)
// ObjExcel.activeworkbook.sheets("sheet2").select
string ls_copy
int i
if ObjExcel.ActiveSheet.Cells.Copy = true then
ObjExcel.Application.Visible = false
idw_dw.SetTransObject(SQLCA)
i = idw_dw.ImportClipboard(li_startrow) //將系統剪切版上的內容粘貼到資料視窗中,其中2為起始行引數
choose case i
case -1
MessageBox('警告','Excel檔案中沒有記錄行或者起始行值大于字串中的行數。')
case -3
MessageBox('警告','無效變元。')
case -4
MessageBox('警告','無效輸入。')
case -13
MessageBox('警告','輸入的資料不支持資料視窗的型別。')
case -14
MessageBox('警告','錯誤決議資料視窗嵌套。')
end choose
Clipboard("") //清空剪切版上的內容
ObjExcel.Quit()
ObjExcel.DisconnectObject() //斷開與OLE的連接
Destroy ObjExcel
return i
else
messagebox("提示","您的EXCEL不支持此功能,請檢查EXCEL版本,建議使用OFFICE-EXCEL")
end if
end if
elseif right(path,3)='txt' or right(path,3)='TXT' then
i = idw_dw.importfile(text!,path,li_startrow)
return i
elseif right(path,3)='dbf' or right(path,3)='DBF' then
i = idw_dw.importfile(DBase3!,path,li_startrow)
return i
else
return -1
end if
uj5u.com熱心網友回復:
序號 功能 代碼案例"String ls_FileName , ls_DirFile
string is_dir
integer li_value
li_value = GetFileOpenName(""請選擇excel檔案名"", ls_DirFile, ls_FileName, ""xls"", ""Excell Files (*.xls), *.xls"")"
"IF li_value=https://bbs.csdn.net/topics/1 THEN
is_dir = left(ls_DirFile,pos(ls_DirFile,ls_FileName) - 1)
sle_EA.text = ls_DirFile
//獲取Excel檔案名稱
If lastpos( ls_DirFile, '.xls' ) = 0 Then
End If
is_xlsName = midw( ls_DirFile, lastpos( ls_DirFile, '\' )+1, lastpos( ls_DirFile, '.xls' ) - lastpos( ls_DirFile, '\' ) - 1 )"
"OLEObject OLE_ExcelA
OLE_ExcelA = Create OLEObject
long ll_error
ll_error = OLE_ExcelA.ConnectToNewObject(""excel.Application"")
OLE_ExcelA.visible = true "
"OLE_ExcelB.Workbooks.Open( sle_eb.text )
mle_2.text = mle_2.text + '成功打開 '+ sle_eb.text +char(13)+char(10)
ll_sumSheet = OLE_ExcelB.Worksheets.count
If ll_sumsheet < 1 Then
OLE_ExcelB.quit()
OLE_ExcelB.Workbooks.close
OLE_ExcelB.DisConnectObject()
destroy OLE_ExcelB;"
" ll_rowA = OLE_ExcelA.ActiveWorkbook.Activesheet.UsedRange.rows.Count
ll_columnA = OLE_ExcelA.ActiveWorkbook.Activesheet.UsedRange.columns.Count"
"ld_sph = double( OLE_ExcelA.cells( ll_num , ll_start_l ).value )
ld_cyl = double( OLE_ExcelA.cells( ll_num , ll_start_l +1 ).value )"
"OLE_ExcelA.quit()
OLE_ExcelA.Workbooks.close
OLE_ExcelA.DisConnectObject()
destroy OLE_ExcelA"
dw_6.saveas( ls_path , EXCEL5! , true )
"OLE_ExcelB.Worksheets( 1 ).Activate
OLE_ExcelB.ActiveSheet.Columns(1).ColumnWidth=10
OLE_ExcelB.ActiveSheet.Columns(2).ColumnWidth=5 "
"OLE_ExcelB.cells( 1,16 ).value = '總價1'
OLE_ExcelB.cells( 1,17 ).value = '總價2'"
" OLE_ExcelB.cells( k + 1 , 16 ).value = dw_4.describe(""evaluate('sum(sumprice for all)', 1)"")
OLE_ExcelB.cells( k + 1 , 17 ).value = dw_4.describe(""evaluate('sum( zongjia1 for all )', 1)"")
OLE_ExcelB.cells( k + 1 , 18 ).value = dw_4.describe(""evaluate('sum( zongjia2 for all )', 1)"")"
"OLE_ExcelB.Columns(""P:P"").Select
OLE_ExcelB.Selection.NumberFormatLocal = ""#,##0.00_ """
"OLE_ExcelA.ActiveSheet.Columns(22).Delete
OLE_ExcelA.ActiveSheet.Columns(22).Delete"
"OLE_ExcelA.ActiveSheet.Range(""F2:F2"").Select
OLE_ExcelA.ActiveWindow.FreezePanes = True"
"string ls_range
ls_range = 'A1:'+'W'+string( dw_1.rowcount( ) + 2 )
OLE_ExcelA.Range( ls_range ).WrapText = true"
"// OLE_ExcelB.range( 'A1:I1' ).select
// OLE_ExcelB.range( 'A1:I1' ).merge
// OLE_ExcelB.range( 'A1:I1' ).HorizontalAlignment = 7"
"// OLE_ExcelB.range( 'A3:I4' ).VerticalAlignment = 2
// OLE_ExcelB.range( 'A3:I4' ).WrapText = true
// OLE_ExcelB.range( 'A3:I4' ).HorizontalAlignment = 7
// //OLE_ExcelB.Range( 'A3:I4' ).Interior.Color = rgb( 128, 255, 255 )"
"ls_rangB = 'A5:I'+string(ll_rowA)
OLE_ExcelB.range( ls_rangB ).VerticalAlignment = 2
OLE_ExcelB.range( ls_rangB ).WrapText = true
OLE_ExcelB.Range( ls_rangB ).Borders( 3 ).LineStyle = 1
OLE_ExcelB.Range( ls_rangB ).Borders( 3 ).Weight = 2"
" ls_range = 'A1:'+'J'+string(ll_sumrowA)
OLE_ExcelA.ActiveSheet.Range(ls_range).Copy
OLE_ExcelA.Worksheets( 1 ).Activate
ls_range = 'A'+string(ll_sumrowB+1) //'J'+string(ll_ColA)
OLE_ExcelA.ActiveSheet.Range( ls_range ).PasteSpecial "
OLE_ExcelA.ActiveSheet.Range( ls_range ).Interior.Color = rgb(0,123,256 )
1.創建Excel物件 eole=CREATEOBJECT(′Excel.application′)
2.添加新作業簿 eole.Workbooks.add
3.設定第3個作業表為作業表 eole.Worksheets(″sheet3″).Activate
4.打開指定作業簿 eole.Workbooks.Open(″c:\temp\ll.xls″)
5.顯示Excel視窗 eole.visible=.t. /true
6. 更改Excel標題欄目 eole.Caption=″PB 呼叫Microsoft Excel″
7.給單元格賦值 eole.cells(1,4).value=https://bbs.csdn.net/topics/ XM / 字符時間數字
8.設定指定列的寬度(單位:位元組) eole.ActiveSheet.Columns(1).ColumnWidth=5
9.設定指定行的高度(單位:磅) eole.ActiveSheet.Rows(1).RowHeight=1/0.035 (設定行高為1cm,1磅=0.035cm )
10.在第18行之前插入分頁符 eole.Worksheets(″Sheet1″).Rows(18).PageBreak=1
11.在第4列之前刪除分頁符 eole.ActiveSheet.Columns(4).PageBreak=0
12.指定邊框線寬度(Borders引數如下) ole.ActiveSheet.Range(″b3:d3″).Borders(2).Weight=3
13.設定四個邊框線條的型別 eole.ActiveSheet.Range(″b3:d3″).Borders(2).Linestyle=1 (其中Borders引數:1-左、2-右、3-頂、4-底、5-斜、6-斜/;Linestyle值:1與7-細實、2-細虛、4-點虛、9-雙細實線 )
14.設定頁眉 eole.ActiveSheet.PageSetup.CenterHeader=″報表1″
15.設定頁腳 eole.ActiveSheet.PageSetup.CenterFooter=″第&P頁″
16.設定頁眉到頂端邊為距2cm eole.ActiveSheet.PageSetup.HeaderMargin=2/0.035
17.設定頁腳到底邊距為3cm eole.ActiveSheet.PageSetup.FooterMargin=3/0.035
18.設定頂邊距為2cm eole.ActiveSheet.PageSetup.TopMargin=2/0.035
19.設定底邊距為4cm eole.ActiveSheet.PageSetup.BottomMargin=4/0.035
20.設定左邊距為2cm veole.ActiveSheet.PageSetup.LeftMargin=2/0.035
21.設定右邊距為2cm eole.ActiveSheet.PageSetup.RightMargin=2/0.035
22.設定頁面水平居中 eole.ActiveSheet.PageSetup.CenterHorizontally=.t.
23.設定頁面垂直居中 eole.ActiveSheet.PageSetup.CenterVertically=.t.
24.設定頁腳紙張大小(1-窄行8511 39-寬行1411) eole.ActiveSheet.PageSetup.PaperSize=1
25.列印單元格網線 eole.ActiveSheet.PageSetup.PrintGridlines=.t.
26.拷貝整個作業表 eole.ActiveSheet.UsedRange.Copy
27.拷貝指定區域 eole.ActiveSheet.Range(″A1:E2″).Copy
28.粘貼 eole.WorkSheet(″Sheet2″).Range(″A1″).PasteSpecial
29.在第2行之前插入一行 eole.ActiveSheet.Rows(2).Insert
30.在第2列之前插入一列 eole.ActiveSheet.Columns(2).Insert
31.設定自字體 eole.ActiveSheet.Cells(2,1).Font.Name=″黑體″
32.設定字體大小 eole.ActiveSheet.Cells(1,1).Font.Size=25
33.設定字體為斜體 eole.ActiveSheet.Cells(1,1).Font.Italic=.t.
34.設定整列字體為粗體 eole.ActiveSheet.Columns(1).Font.Bold=.t.
35.清除單元格 eole.ActiveSheet.Cells(1,4).ClearContents
36.列印預覽作業表 eole.ActiveSheet.PrintPreview
37.列印輸出作業表 eole.ActiveSheet.PrintOut
38.作業表另爲 eole.ActiveWorkbook.SaveAs(″c:\temp\22.xls″)
39.放棄存檔 eole.ActiveWorkbook.saved=.t.
40.關閉作業簿 eole.Workbooks.close
41.退出Excel eole.quit
42. 合并單元格內取其左上角的單元格中的數值 < > 寫入資料的時候隨便寫其中的任意格,最后資料存放在左上角的格子中
43.凍結視窗 Range("A2:A4").Select ActiveWindow.FreezePanes = True
/* 4.Workbook物件
該物件代表作業簿。
(1)Styles屬性:回傳Styles集合,代表指定作業簿的所有樣式。
(2)Add方法:用于新建作業簿,并將其設定為活動作業簿。
(3)Open方法:用于打開作業簿。
(4)OpenText方法:用于載入文本檔案,并將其進行分列處理,然后在作業表中插入經過分列處理的文本資料。
5.Worksheet物件
該物件代表作業表,通過“Worksheets(index)”的語法可獲取Worksheet物件,其中index引數作業表索引號或名稱。
(1)AutoFilter屬性:用于設定是否進行篩選。
(2)UsedRange屬性:回傳Range物件,代表指定作業表中的已用區域。
(3)PrintOut方法:用于列印指定的物件。
(4)PrintPreview方法:將切換之列印預覽視圖。
(5)Select方法:用于選擇指定的物件。
6.Range物件
該物件代表選擇區域,是Excel開發中一個常用的物件。
(1)Address屬性:回傳對指定區域的參考名稱。
(2)Areas屬性:回傳Areas集合,代表多重選擇區域中的所有區域。
(3)Column屬性:回傳第一塊指定區域中的第一列的序號。
(4)Columns屬性:回傳Range物件,代表指定區域中的所有列。
(5)ColumnWidth屬性:回傳或設定指定區域中所有列的列寬。
(6)Formula屬性:用于設定Range物件使用的公式。
(7)MergeArea屬性:回傳Range物件,代表指定單元格的合并范圍。
(8)MergeCells屬性:回傳區域中是否包含合并單元格。
(9)NumberFormat屬性:回傳或設定指定物件的格式代碼。
(10)Row屬性:回傳第一塊指定區域中的第一行的序號。
(11)Rows屬性:回傳Range物件,代表指定區域中的所有行。
(12)Activate方法:用于激活物件。
(13)ApplyNames方法:用于將名稱應用于指定的單元格。
(14)AutoFill方法:用于對指定的單元格進行自動填充。
(15)AutoFit方法:用于將列寬和行高調整為適當值。
(16)Find方法:用于在區域內查找特定資訊,并回傳代表第一個包含所查找資訊的單元格。
(17)Merge方法:用于從指定的Range物件中創建合并單元格。
(18)Replace方法:用于在指定區域內查找和替換。
(19)Subtotal方法:用于創建指定區域內的分類匯總。
*/
uj5u.com熱心網友回復:
pb中打開excel 并將excel資料讀取到資料視窗中然后保存到資料庫中.uj5u.com熱心網友回復:
cb_2 clicked()可以選擇excel檔案,沒有報錯,DataWindow中還是沒有資料。代碼如下:
string str_savename,named,s_grxh
int excelok,li_net
long li_count,i
oleobject excelserver
excelserver=create oleobject
excelok=excelserver.connecttonewobject("excel.application")
//檢查回傳值,以確保已成功地連接到了Excel
if excelok <> 0 then
messagebox("資訊提示","連接EXCEL失敗,請檢查計算機中是否安裝了EXCEL!")
return -1
end if
li_net = GetFileOpenName("選擇檔案", str_savename,named,"xls","Excel檔案(*.xls),*.xls")
if li_net > 0 then
if str_savename = "" then return -1
dw_product.settransobject(sqlca)
dw_product.reset()
excelserver.workbooks.open(str_savename)
excelserver.activesheet.cells.copy
li_count = dw_product.importclipboard(2) //匯入資料
clipboard("")
excelserver.quit()
excelserver.disconnectobject()
destroy excelserver
return 1
else
messagebox('資訊提示','沒有指定匯入檔案!')
return -1
end if
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/63677.html
標籤:基礎類
上一篇:請教一個問題,pb中有沒有deleteurl方法啊,或怎么實作?
下一篇:pb呼叫corba碰到問題
