下面的函數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的專欄