程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SyBase數據庫 >> SyBase教程 >> pb9實現在兩個工作簿之間進行工作表復制

pb9實現在兩個工作簿之間進行工作表復制

編輯:SyBase教程

下面的函數f_excel_hb,可以實現“將工作簿filename_s中的工作表sheetname_s以新的工作表名稱sheetname_t,復制到工作簿filename_t的最後”
 
 
 
public function boolean f_excel_hb (string filename_s, string filename_t, string sheetname_s, string sheetname_t); 
//========================================================== 
//  合並兩個工作簿中的某個工作表  
//========================================================== 
//  作者:yyoinge 2011-10-12 18:00 
//========================================================== 
//  將工作簿filename_s中的工作表sheetname_s以新的 
//  工作表名稱sheetname_t,復制到工作簿filename_t的最後 
//========================================================== 
if not fileexists(filename_s) then 
    messagebox('','工作簿【' + filename_s + '】(源)不存在') 
    return false 
end if 
if not fileexists(filename_t) then 
    messagebox('','工作簿【' + filename_t + '】(目標)不存在') 
    return false 
end if 
long ll_val 
//聲明ole對象 
oleobject ole_object_s 
//創建ole對象 
ole_object_s=create oleobject 
//連接到excel 
ll_val = ole_object_s.connecttonewobject("excel.application") 
if ll_val <> 0 then 
    messagebox('','ole無法連接Excel!') 
    goto error 
end if 
//打開源和目標工作簿 
ole_object_s.workbooks.open(filename_s) 
ole_object_s.workbooks.open(filename_t) 
string ls_t 
ls_t = filename_t 
filename_s = of_splitpath(filename_s, 2) 
filename_t = of_splitpath(filename_t, 2) 
//隱藏excel 
ole_object_s.visible = false 
ole_object_s.displayalerts = false 
int n,t 
int li 
boolean isexists=false 
oleobject lworksheet 
//判斷源工作簿中的工作表是否存在 
try    
    lworksheet =  ole_object_s.Workbooks(filename_s).sheets(sheetname_s) 
    isexists = true 
catch( oleruntimeerror   er)  
    isexists = false 
end try  
if isexists=false then 
    messagebox('','工作簿【' + filename_s + '】中工作表不存在工作表[' + sheetname_s + ']') 
    goto error 
end if 
//當目標工作簿中存在sheet名為sheetname_t的工作表時,為sheetname_t增加後綴(1),然後再重復進行判斷,直到表名不存在 
isexists = true 
do while isexists 
    try    
        lworksheet =  ole_object_s.Workbooks(filename_t).sheets(sheetname_t) 
        isexists = true 
        sheetname_t += '(1)' 
    catch( oleruntimeerror   er1)  
        isexists = false 
    end try  
loop 
//進行工作表合並(移到目標工作簿的最後) 
//int li 
setnull(li) 
ole_object_s.workbooks(filename_s).Sheets(sheetname_s).copy(li, ole_object_s.workbooks(filename_t).Sheets(long(ole_object_s.workbooks(filename_t).Sheets.count))) 
//重命名工作表 
ole_object_s.workbooks(filename_t).sheets(long(ole_object_s.workbooks(filename_t).Sheets.count)).name = sheetname_t 
//保存目標工作簿 
isexists = true 
//ole_object_s.visible = true 
//ole_object_s.displayalerts = true 
//messagebox('', '') 
try 
    ole_object_s.workbooks(filename_t).save() 
catch( oleruntimeerror   er2) 
    messagebox('提示', '無法保存工作簿【' + filename_t + '】') 
    isexists = false 
end try 
if not isexists then goto error 
//關閉工作簿 
ole_object_s.workbooks(filename_s).close 
ole_object_s.workbooks(filename_t).close 
//退出excel 
ole_object_s.workbooks.close 
ole_object_s.Application.quit(); 
//斷開連接 
ole_object_s.disconnectobject(); 
//注銷ole對象 
destroy ole_object_s; 
return true 
error: 
ole_object_s.workbooks(filename_s).close 
ole_object_s.workbooks(filename_t).close 
ole_object_s.workbooks.close 
ole_object_s.Application.quit(); 
ole_object_s.disconnectobject(); 
destroy ole_object_s; 
return false 
 
 
end function 
 
    其中用到的一個路徑分割函數of_splitpath如下:
 
public function string of_splitpath (string as, integer ai);//========================================================== 
//  分割文件名 
// ai:  1返回路徑,2返回文件名(帶後綴名),32返回文件名(不帶後綴名) 
//========================================================== 
//  作者:yyoinge 2011-10-12 18:00 
//========================================================== 
 
choose case ai 
    case 1  
        if posw(as, '.') = 0 then return as 
        return leftw(as,lenw(as) - posw(reverse(as), '\') + 1) 
    case 2  
        if posw(as, '\') = 0 then return as 
        return rightw(as,posw(reverse(as), '\') - 1) 
    case 3  
        if posw(as, '\') > 0 then as = rightw(as,posw(reverse(as), '\') - 1) 
        return leftw(as, lastpos(as, '.') - 1) 
    case else 
        return as 
end choose 
end function 
 
    pb復制excel工作表的功能,可以幫助我們實現:將1個數據窗口導出到1個excel工作簿的多個工作表sheet中。實現的步驟大致如下:
    (1)將datawindow的數據,按照平均行數(每個sheet中需要保存的行數),依次復制到臨時的datastore中。如:將1個有10行數據的datawindow,導出為每個sheet包含3行數據的多sheet工作簿,則需要依次將1-3行、4-6行、7-9行、10至10行分別復制到臨時的datastore中。
    (2)然後將datastore中的數據saveas導出為單個單sheet的excel文件。
    (3)將第2次開始導出的excel文件(也就是上述例子中的4-6行開始的excel文件),依次合並到第1次導出的excel文件(1-3行)中,並刪除導出的excel文件(1-3行對應的文件暫時不刪除)。
    (4)待所有數據都導出,並復制到第1次導出的excel文件後,將第1次導出的excel文件改名並復制目標導出路徑上,然後刪除第1次導出的excel文件。
 
    具體源碼可以參照PB9將數據窗口導出到一個EXCEL文件的多個工作表中 。
    該源碼使用的是從後到前的導出方法,也就是先導出10-10行,然後導出7-9行。。。最後導出1-3行,因為在該源碼中,復制工作表時使用的方法是:
 
ole_object_s.workbooks(filename_s).Sheets(sheetname_s).copy(ole_object_s.workbooks(filename_t).Sheets(1) //將源工作表復制到目標工作簿的第1個工作表前面 
 
    而上述函數復制工作表的方法為:
 
int li 
setnull(li) 
ole_object_s.workbooks(filename_s).Sheets(sheetname_s).copy(li, ole_object_s.workbooks(filename_t).Sheets(long(ole_object_s.workbooks(filename_t).Sheets.count)))   //將源工作表復制到目標工作簿的最後1個工作表後面 
 
    這邊需要對copy方法進行說明,在VBA中,工作表復制的寫法為:
 
Sheets("工作表名稱").Copy Before := Sheets(1) //將工作表“工作表名稱”復制到第1個工作表前面 
Sheets("工作表名稱").Copy After := Sheets(1)  //將工作表“工作表名稱”復制到第1個工作表後面 
 
 
    而在pb中對應的寫法為:
 
int li setnull(li) 
Sheets("工作表名稱").Copy(Sheets(1), li) //將工作表“工作表名稱”復制到第1個工作表前面 
Sheets("工作表名稱").Copy(li, Sheets(1)) //將工作表“工作表名稱”復制到第1個工作表後面 
 
 
 
 
 
<div style="TOP: 1694px"><pre class="cpp" style="MARGIN: 4px 0px; BACKGROUND-COLOR: rgb(240,240,240)" name="code"><pre>  


作者 yyoinge的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved