最近專案中需要做匯出excel以及具有複雜表頭excel的彙總,其實都不算麻煩,基本上都做過匯出excel,具有複雜表頭excel的彙總以前也用active控制項實現了,但是效率都不是太理想。最後在乙個群友的提醒下,嘗試著用opendatasource/datarowset解決,結果發現效率還不錯。
首先說一下匯出excel,比如說我要匯出乙個如下圖的excel
首先要做乙個只有表頭的excel的模版
因為要做的效果裡面是是兩行為乙個完整資料,前4列是合併的。不知道有多少行資料,所以要利用巨集了。下面是我寫的自動合併行的巨集**
subexcel模版的準備工作到此就結束了,下面就是匯入資料了,匯入資料用的是openrowset,macro1()''
macro1 macro''
dim i as
integer
dim count as
integer
dim rownum as
integer
count = sheet1.usedrange.rows.count '
這裡是獲取sheet3中的記錄行數
for i = 6
to count step
2『從第六行開始合併,合併前4列
range("a
" & i & "
:a" & (i + 1) & ""
).select
range("a
" & (i + 1
)).activate
with
selection
.horizontalalignment =xlcenter
.verticalalignment =xlcenter
.wraptext = false
.orientation = 0
.addindent = false
.indentlevel = 0
.shrinktofit = false
.readingorder =xlcontext
.mergecells = false
endwith
selection.merge
range("b
" & i & "
:b" & (i + 1) & ""
).select
range("b
" & (i + 1
)).activate
with
selection
.horizontalalignment =xlcenter
.verticalalignment =xlcenter
.wraptext = false
.orientation = 0
.addindent = false
.indentlevel = 0
.shrinktofit = false
.readingorder =xlcontext
.mergecells = false
endwith
selection.merge
range("c
" & i & "
:c" & (i + 1) & ""
).select
range("c
" & (i + 1
)).activate
with
selection
.horizontalalignment =xlcenter
.verticalalignment =xlcenter
.wraptext = false
.orientation = 0
.addindent = false
.indentlevel = 0
.shrinktofit = false
.readingorder =xlcontext
.mergecells = false
endwith
selection.merge
range("d
" & i & "
:d" & (i + 1) & ""
).select
range("d
" & (i + 1
)).activate
with
selection
.horizontalalignment =xlcenter
.verticalalignment =xlcenter
.wraptext = false
.orientation = 0
.addindent = false
.indentlevel = 0
.shrinktofit = false
.readingorder =xlcontext
.mergecells = false
endwith
selection.merge
next
iend sub
subauto_open() 』開啟excel自動執行,可以再加個方法,在第一次執行完後即刪除所有的巨集
call
macro1
end sub
insert into
openrowset('microsoft.jet.oledb.4.0','excel 8.0;database=f:\\預算執行(文號彙總).xls',[sheet3$])
select * from #temp
為了方便,我單獨寫了個儲存過程,將資料先插入臨時表#temp(因為原來表中的格式很可能和模版是不一樣的),最後執行上面的sql語句。到此乙個完整的匯出excel功能就出來了。
合併具有複雜表頭的excel過程跟上面類似,也是先做乙個模版,寫好巨集(主要是為了控制格式)。合併的過程也放在儲存過程中,利用opendatasource/datarowset取出要合併的excel資料(注意要排除表頭,可以根據模版的表頭行數進行判斷)插入臨時表,再一起匯入模版中。
下面說一下,在此次開發過程中主要遇到的問題,首先要啟用opendatasource/datarowset
exec sp_configure
'show advanced options'
,1
reconfigure
exec sp_configure
'ad hoc distributed queries'
,1
reconfigure
其次在用opendatasource/datarowset操作時要求相應的excel檔案必須是關閉的,不然會報 如下類似的錯誤。
其次opendatasource/datarowset對excel的操作是不能跨伺服器,若想跨伺服器使用,需要借助共享檔案,sql伺服器必須能訪問excel所在伺服器的共享檔案,不然就要在excl所在伺服器安裝資料庫了。
問題補充:用microsoft.ace.oledb.12.0時讀取excel完全沒問題,但是插入時有點小不同,必須要這麼寫insert into
openrowset('microsoft.ace.oledb.12.0', 'excel 8.0;database=c:\ttest.xls;', 'select b from [sheet1$]')
select b from table1,具體為啥還沒搞明白,先記下
C 開發Excel報表一
最近做了很長時間的excel開發,雖說有些報表的要求很 但是成果與時間還是成反比,尤其是報表的顯示太依賴與資料的結構,一旦系統中的資料結構不符合要求時,總是會導致程式出現錯誤。雖然程式最終通過了測試,但是在發布之後的第一天還是出現了諸多問題,總結下來有三類問題,一是型別轉換時出現溢位的現象,二是執行...
C 開發Excel報表二
在這裡介紹一下excel開發報表用到的一些基本的方法,例如單元格的合併,行與列的插入等操作。以及在excel中遍歷出相鄰單元格的並合併的方法。單元格合併,單元格合併需要注意的是在合併之前需要清空帶合併單元格的資料,否則在合併時會彈出提示框,在合併之後在給單元格賦值。合併單元格 public void...
C 操作excel(報表)
新增乙個worksheet worksheet worksheet worksheet workbook.worksheets.add system.type.missing,system.type.missing,system.type.missing,system.type.missing ro...