Excel文件模版
發布時間:2010/12/7 11:03:35 訪問次數:1122
- 51電子網公益庫存:
- AX2258
- STI5518BQC
- IC18F2550-I/S
- 90-13026
- 6000FC9003A
- 5082-7300
- 40307/1R2A
- 309A2
- 2022Q
- W24257AJ-12
有了這個模板,我們就可以開始寫代碼導出數據了,名為“demo.xls”,包含三個列:“id”、“姓名”和“生日”。
導出數據(標準的excel文件):
以下是代碼片段:
// 根據模板文件創建副本 string filepath = server.mappath("~/" + guid.newguid().tostring() + ".xls"); file.copy(server.mappath("~/demo.xls"), filepath); // 使用oledb驅動程序連接到副本 oledbconnection conn = new oledbconnection("provider=microsoft.jet.oledb.4.0;data source=" + filepath + ";extended properties=excel 8.0;"); using (conn) { conn.open(); // 增加記錄 oledbcommand cmd = new oledbcommand("insert into [sheet1$]([id], [姓名], [生日]) values(@id, @name, @birthday)", conn); cmd.parameters.addwithvalue("@id", "1"); cmd.parameters.addwithvalue("@name", "hsu yencheng"); cmd.parameters.addwithvalue("@birthday", "1981-10-13"); cmd.executenonquery(); } // 輸出副本的二進制字節流 response.contenttype = "application/ms-excel"; response.appendheader("content-disposition", "attachment;filename=info.xls"); response.binarywrite(file.readallbytes(filepath)); // 刪除副本 file.delete(filepath); |
導出數據:
以下是代碼片段:
string filepath = server.mappath("~/info.xls"); oledbdataadapter da = new oledbdataadapter("select * from [sheet1$]", "provider=microsoft.jet.oledb.4.0;data source=" + filepath + ";extended properties=excel 8.0"); datatable dt = new datatable(); da.fill(dt); |
如果您要導入或導出的是excel 2007文件(*.xlsx),那么您需要將連接字符串改為:
以下是代碼片段:
provider=microsoft.ace.oledb.12.0;data source=info.xlsx;extended properties="excel 12.0 xml;hdr=yes"; |
上面的方法是可行,但有個問題:執行效率很低,超過255行的數據導出時,特別的慢(在網上查得是ms的限制).解決方法是: 將insert部分不使用參數模式,而直接使用串拼接成insert的sql語句,執行起來速度很快,導出時也很快,超過255時也很快,我僅測試過用 sql串語句生成并導出2000條,文件大小有3m,速度是不慢的,完成可以接受.而使用原方法,在256條時就感覺到慢了.
另外:oledb模式下可以先用create table生成sheet1$這種excel工作表,然后再insert數據,證實是可行的.這樣模板文件就只要一個空白的excel文檔了.靈活性高很多.
- 51電子網公益庫存:
- AX2258
- STI5518BQC
- IC18F2550-I/S
- 90-13026
- 6000FC9003A
- 5082-7300
- 40307/1R2A
- 309A2
- 2022Q
- W24257AJ-12
有了這個模板,我們就可以開始寫代碼導出數據了,名為“demo.xls”,包含三個列:“id”、“姓名”和“生日”。
導出數據(標準的excel文件):
以下是代碼片段:
// 根據模板文件創建副本 string filepath = server.mappath("~/" + guid.newguid().tostring() + ".xls"); file.copy(server.mappath("~/demo.xls"), filepath); // 使用oledb驅動程序連接到副本 oledbconnection conn = new oledbconnection("provider=microsoft.jet.oledb.4.0;data source=" + filepath + ";extended properties=excel 8.0;"); using (conn) { conn.open(); // 增加記錄 oledbcommand cmd = new oledbcommand("insert into [sheet1$]([id], [姓名], [生日]) values(@id, @name, @birthday)", conn); cmd.parameters.addwithvalue("@id", "1"); cmd.parameters.addwithvalue("@name", "hsu yencheng"); cmd.parameters.addwithvalue("@birthday", "1981-10-13"); cmd.executenonquery(); } // 輸出副本的二進制字節流 response.contenttype = "application/ms-excel"; response.appendheader("content-disposition", "attachment;filename=info.xls"); response.binarywrite(file.readallbytes(filepath)); // 刪除副本 file.delete(filepath); |
導出數據:
以下是代碼片段:
string filepath = server.mappath("~/info.xls"); oledbdataadapter da = new oledbdataadapter("select * from [sheet1$]", "provider=microsoft.jet.oledb.4.0;data source=" + filepath + ";extended properties=excel 8.0"); datatable dt = new datatable(); da.fill(dt); |
如果您要導入或導出的是excel 2007文件(*.xlsx),那么您需要將連接字符串改為:
以下是代碼片段:
provider=microsoft.ace.oledb.12.0;data source=info.xlsx;extended properties="excel 12.0 xml;hdr=yes"; |
上面的方法是可行,但有個問題:執行效率很低,超過255行的數據導出時,特別的慢(在網上查得是ms的限制).解決方法是: 將insert部分不使用參數模式,而直接使用串拼接成insert的sql語句,執行起來速度很快,導出時也很快,超過255時也很快,我僅測試過用 sql串語句生成并導出2000條,文件大小有3m,速度是不慢的,完成可以接受.而使用原方法,在256條時就感覺到慢了.
另外:oledb模式下可以先用create table生成sheet1$這種excel工作表,然后再insert數據,證實是可行的.這樣模板文件就只要一個空白的excel文檔了.靈活性高很多.