C 開發EXCEL報表

2022-07-14 09:21:07 字數 3787 閱讀 7867

最近專案中需要做匯出excel以及具有複雜表頭excel的彙總,其實都不算麻煩,基本上都做過匯出excel,具有複雜表頭excel的彙總以前也用active控制項實現了,但是效率都不是太理想。最後在乙個群友的提醒下,嘗試著用opendatasource/datarowset解決,結果發現效率還不錯。

首先說一下匯出excel,比如說我要匯出乙個如下圖的excel

首先要做乙個只有表頭的excel的模版

因為要做的效果裡面是是兩行為乙個完整資料,前4列是合併的。不知道有多少行資料,所以要利用巨集了。下面是我寫的自動合併行的巨集**

sub

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

excel模版的準備工作到此就結束了,下面就是匯入資料了,匯入資料用的是openrowset,

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...