將一個DataGrid匯到一個Excel內很簡單,但要如何將多個DataGrid滙到同一個Excel內,並分別放在不同的Worksheet工作表內.
Asp.net匯出一個DataGrid到Excel的方式很簡單,只要執行以下幾行就可以達成,








StringWriter sw=new StringWriter();



Response.Write( sw.ToString());

但如果有多個DataGrid,希望能匯到同一個Excel檔,但要分別放到不同的Worksheet工作表內,這樣的方式就無法達成,需要做點加工才可以,就最近的實驗結果,有兩個方法可以達成,一個是可以透過DataSet將它匯出,另一種就是直接用DataGrid.RenderControl去做,這次先以DataGrid.RenderControl的方式來說.
這次所用到的是MIME的方式,匯出來的Excel格式如下:
X-Document-Type: Workbook
Content-Type: multipart/related; boundary="-=BOUNDARY_EXCEL"
---=BOUNDARY_EXCEL
Content-Type: text/html; charset="big5"
<html xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel">
<head>
<xml>
<o:DocumentProperties>
<o:Author>Jeff_Yeh</o:Author>
<o:LastAuthor>Jeff_Yeh</o:LastAuthor>
<o:Created>2009/9/2 下午 09:00:48</o:Created>
<o:LastSaved>2009/9/2 下午 09:00:48</o:LastSaved>
<o:Company>Jeff隨手記</o:Company>
<o:Version>11.5606</o:Version>
</o:DocumentProperties>
</xml>
<xml>
<x:ExcelWorkbook>
<x:ExcelWorksheets>
<x:ExcelWorksheet>
<x:Name>TestA</x:Name>
<x:WorksheetSource HRef="cid:9d6e5d0b-f362-497b-9ef6-a0e36ae8c4c5"/>
</x:ExcelWorksheet>
<x:ExcelWorksheet>
<x:Name>TestB</x:Name>
<x:WorksheetSource HRef="cid:94c5e9ba-4bec-4bb6-9fe6-8e0c160b6c1b"/>
</x:ExcelWorksheet>
</x:ExcelWorksheets>
</x:ExcelWorkbook>
</xml>
</head>
</html>
---=BOUNDARY_EXCEL
Content-ID: 9d6e5d0b-f362-497b-9ef6-a0e36ae8c4c5
Content-Type: text/html; charset="big5"
<html xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel">
<head>
<xml>
<x:WorksheetOptions>
<x:ProtectContents>False</x:ProtectContents>
<x:ProtectObjects>False</x:ProtectObjects>
<x:ProtectScenarios>False</x:ProtectScenarios>
</x:WorksheetOptions>
</xml>
</head>
<body>
<table cellspacing="0" rules="all" border="1" id="DataGrid1" style="border-collapse:collapse;">
<tr>
<td>aa</td><td>bb</td>
</tr><tr>
<td>0</td><td>2009/9/2 下午 09:00:48</td>
</tr><tr>
<td>1</td><td>2009/9/2 下午 09:00:48</td>
</tr><tr>
<td>2</td><td>2009/9/2 下午 09:00:48</td>
</tr><tr>
<td>3</td><td>2009/9/2 下午 09:00:48</td>
</tr><tr>
<td>4</td><td>2009/9/2 下午 09:00:48</td>
</tr><tr>
<td>5</td><td>2009/9/2 下午 09:00:48</td>
</tr><tr>
<td>6</td><td>2009/9/2 下午 09:00:48</td>
</tr><tr>
<td>7</td><td>2009/9/2 下午 09:00:48</td>
</tr><tr>
<td>8</td><td>2009/9/2 下午 09:00:48</td>
</tr><tr>
<td>9</td><td>2009/9/2 下午 09:00:48</td>
</tr>
</table></body>
</html>
---=BOUNDARY_EXCEL
Content-ID: 94c5e9ba-4bec-4bb6-9fe6-8e0c160b6c1b
Content-Type: text/html; charset="big5"
<html xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel">
<head>
<xml>
<x:WorksheetOptions>
<x:ProtectContents>False</x:ProtectContents>
<x:ProtectObjects>False</x:ProtectObjects>
<x:ProtectScenarios>False</x:ProtectScenarios>
</x:WorksheetOptions>
</xml>
</head>
<body>
<table cellspacing="0" rules="all" border="1" id="DataGrid2" style="border-collapse:collapse;">
<tr>
<td>cc</td><td>dd</td>
</tr><tr>
<td>0</td><td>2009/9/2 下午 09:00:48</td>
</tr><tr>
<td>1</td><td>2009/9/2 下午 09:00:48</td>
</tr><tr>
<td>2</td><td>2009/9/2 下午 09:00:48</td>
</tr><tr>
<td>3</td><td>2009/9/2 下午 09:00:48</td>
</tr><tr>
<td>4</td><td>2009/9/2 下午 09:00:48</td>
</tr><tr>
<td>5</td><td>2009/9/2 下午 09:00:48</td>
</tr><tr>
<td>6</td><td>2009/9/2 下午 09:00:48</td>
</tr><tr>
<td>7</td><td>2009/9/2 下午 09:00:48</td>
</tr><tr>
<td>8</td><td>2009/9/2 下午 09:00:48</td>
</tr><tr>
<td>9</td><td>2009/9/2 下午 09:00:48</td>
</tr>
</table></body>
</html>
---=BOUNDARY_EXCEL--
只要把上列複制另存為xls檔,就可以開的起來,在裡面就可以看到兩個worksheet,但這樣密密麻麻的東西,還真是看到眼花,而冃Content-ID還必需對應到Worksheep的 HRef的cid,不然Excel就會無法開啟,所以花了一點時間寫了一個Class來呼叫,就不用管那麼多東西.

002

003

004

005

006 StringBuilder sbBody=new StringBuilder();
007

008

009

010

011

012

013

014

015

016

017

018

019

020

021

022

023

024

025

026

027

028

029

030

031

032

033

034

035

036

037

038

039 private string ExportExcel()
040

041

042

043

044

045

046

047

048

049

050

051 sb.Append("---=BOUNDARY_EXCEL--");
052

053

054

055

056 public void AddGrid(DataGrid grid,string sheetName)
057

058

059

060

061

062

063

064

065

066

067

068

069

070 sbSheet.AppendFormat("---=BOUNDARY_EXCEL\r\n"+
071

072

073

074

075

076

077

078

079

080

081

082

083

084

085

086

087

088

089

090

091

092

093 public void Export(Page page,string FileName)
094

095

096

097

098

099

100

101

102

103

104

105 public void Clear()
106

107

108

109

110

看起來程式碼也不多,但就可以少寫很多Code,比如來說,我要將DataGrid1跟DataGrid2分別滙到不同的worksheet裡去,我只要寫以下的Code就好.
*第63行看我Replace了幾個符號 : \ / ? * [ ] , 因為這幾個符號是保留字,如果使用到,worksheet工作表的名稱就會變為 復原_Sheet1,這是Excel本身的限制.我沒判斷長度及空字串~~

2

3

4

第一行就是使用上面Sample Class,ExceUtil,傳入兩個參數,第一個是作業,第二個是公司行號,這樣在看Excel摘要資訊時,就可以看到.
第二,三行就是把DataGrid傳給ExcelUtil去處理,第一個參數是DataGrid,第二個參數是Worksheet工作表的名稱.
第四行就是匯出Excel檔,第一個參數是Page,第二個參數是匯出的檔案名稱.
所以每加一個DataGrid,就呼叫一次AddGrid就好,其它的都不用管.
參考資訊 :
如何將不同的GridView匯出到不同的EXCEL sheet中
原始碼下載 :