產生Excel進階報表

來源:互聯網
上載者:User

前不久行裡說要產生一個如下的Excel報表,試了很多種方法都不行,突然想到excel引用,宏,試寫了下,發現效果不錯.

各位可以參考此方法產生任意格式的Excel,可能很多人直接用程式來一行行的寫,想想這是多複雜的事情啊,想設定Excel格式就更加複雜了.而且程式迴圈效率也極慢,照我方法可以直接下載後就直接列印,格式全部已設定好.好了,廢話不多說,覺得好用多多推廣,轉載請注示一下來自http://www.cnbolgs.com/xiaobier,謝謝.以下是產生後的:

我這裡用的資料庫是SQL server.說一下思路:

先製作一個excel樣式,如,我這裡標題是固定的,部門和日期是動態,列名是固定的,中間那塊資料是動態,部門考勤員名字是動態,其他都是靜態.

把樣式先做好.以是我先做好的樣式:

8,9為什麼要留兩行,是為了第10行的統計函數設定,合計那行是已經設定好excel公式的,如C10是Sum(C8:C9)依此類推,如果往8,9中間插入行那excel

會自動擴充第10行的公式,如原是Sum(C8:C9)那插入一行就自動變成sum(C8:C10),這個大家應該都知道.而且往8,9中間插入行他的格式是根前一行

相同的,所以就這裡就設定好了動態資料區的格式了.其他幾個地方也是一樣.

第三行的日期我是讓他引用sheet2中的A2,部門是B2,考勤員是C2

是Sheet2,其中sheetdate,department,oper是列名,用來向sheet2這三個欄位插入記錄的

中的主要資料區我是放在sheet3中,以下是sheet3樣式,同樣是列名,以中是對應的.

sheet2隻有一條記錄,所以直接在sheet1對應處引用即可,如何讓sheet1中引用sheet3中的資料,因為sheet3中的記錄是動態,

也不知道有多少行,所以要利用宏了.寫宏其實也很簡單,我這裡也沒寫多少行代碼.

 

Code

Sub Macro1()
'
' Macro1 Macro
' 宏由 XiaoBier 錄製,時間: 2008-9-24
'
' 快速鍵: Ctrl+q
'

Dim i As Integer
Dim count As Integer
Dim rownum As Integer
count = Sheet3.UsedRange.Rows.count - 1 '這裡是擷取sheet3中的記錄行數,減掉列名首行

Sheets("Sheet1").Select  '選中sheet1

'在sheet1中的8和9行之間插入行數
For i = 3 To count Step 1
    Sheet1.Range("A9").Select
        Selection.EntireRow.Insert
Next i

rownum = 1

'將sheet1中資料行引用sheet3中的資料
For i = 8 To count + 7 Step 1

    Range("A" & i) = rownum
    
    Range("B" & i).FormulaR1C1 = "=IF(Sheet3!R[-6]C[-1]>0,Sheet3!R[-6]C[-1],"""")"
    
    Range("C" & i).FormulaR1C1 = "=IF(Sheet3!R[-6]C[-1]>0,Value(Sheet3!R[-6]C[-1]),"""")"
    
    Range("D" & i).FormulaR1C1 = "=IF(Sheet3!R[-6]C[-1]>0,Value(Sheet3!R[-6]C[-1]),"""")"
    
    Range("E" & i).FormulaR1C1 = "=IF(Sheet3!R[-6]C[-1]>0,Value(Sheet3!R[-6]C[-1]),"""")"
    
    Range("F" & i).FormulaR1C1 = "=IF(Sheet3!R[-6]C[-1]>0,Value(Sheet3!R[-6]C[-1]),"""")"
    
    Range("G" & i).FormulaR1C1 = "=IF(Sheet3!R[-6]C[-1]>0,Value(Sheet3!R[-6]C[-1]),"""")"
    
    Range("H" & i).FormulaR1C1 = "=IF(Sheet3!R[-6]C[-1]>0,Value(Sheet3!R[-6]C[-1]),"""")"
    
    Range("I" & i).FormulaR1C1 = "=IF(Sheet3!R[-6]C[-1]>0,Value(Sheet3!R[-6]C[-1]),"""")"
    
    Range("J" & i).FormulaR1C1 = "=IF(Sheet3!R[-6]C[-1]>0,Value(Sheet3!R[-6]C[-1]),"""")"
    
    Range("K" & i).FormulaR1C1 = "=IF(Sheet3!R[-6]C[-1]>0,Value(Sheet3!R[-6]C[-1]),"""")"
    
    Range("L" & i).FormulaR1C1 = "=IF(Sheet3!R[-6]C[-1]>0,Value(Sheet3!R[-6]C[-1]),"""")"
    
    Range("M" & i).FormulaR1C1 = "=IF(Sheet3!R[-6]C[-1]>0,Value(Sheet3!R[-6]C[-1]),"""")"
    
    Range("N" & i).FormulaR1C1 = "=IF(Sheet3!R[-6]C[-1]>0,Value(Sheet3!R[-6]C[-1]),"""")"
    
    Range("O" & i) = Null
    rownum = rownum + 1
Next i

End Sub

'這個子程式讓一開啟excel就自動調用宏
Sub auto_open()
Call Macro1
End Sub

是不是很簡單,如果你不會寫宏就錄製吧,要什麼操作就錄製.然後把錄製的代碼copy下來就可以了.

樣式檔案建好.要產生excel的時候調用System.IO.File.Copy複製成目標名.沒有其他動作.

接著是利用SQl openrowset往目標檔案名的sheet3,和sheet2插入記錄.

 

Code
set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 8.0;HDR=YES ;DATABASE='+@path+@fname+''',[sheet3$])' 
             exec('insert into '+@sql+'(name,late,patient,privacy,cyesis,suckle,children,relatives,delay,rest,law,adjust,year) select * from #sheetrst3')

--注意上面的列名好和sheet3中是對應的
 set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 8.0;HDR=YES;DATABASE=' +@path+@fname+''',[sheet2$])' 
exec('insert into '+@sql+'(sheetdate,department,oper) select '''+@date+''','''+@deptname+''','''+@operator+'''')

 

大功告成...

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.