在使用Com对象或者PIA导出Excel时,对于大数据量的情况,如果一行行的创建,然后添加到Worksheet,速度会比较慢。
还好有别的方法,使用QueryTable查询数据填充Worksheet,速度将有很大的提升,适合数据较多情况的导出。
直接看代码吧,添加了一些注释:
/// <summary> /// 使用QueryTable从一个外部数据源创建Worksheet /// </summary> /// <param name="strSql"></param> private void ExortToExcelQueryTable(string strSql) { string ExportPath = Server.MapPath("~/"); string strFileName = DateTime.Now.ToString("yyyyMMddhhmmss") + ".xls"; //新建一Microsoft.Office.Interop.Excel Missing missing = Missing.Value; Microsoft.Office.Interop.Excel.ApplicationClass objExcel = null; Microsoft.Office.Interop.Excel.Workbooks objBooks = null; Microsoft.Office.Interop.Excel.Workbook objBook = null; Microsoft.Office.Interop.Excel.Worksheet objSheet = null; try { objExcel = new Microsoft.Office.Interop.Excel.ApplicationClass(); objExcel.Visible = false; objBooks = (Microsoft.Office.Interop.Excel.Workbooks)objExcel.Workbooks; objBook = (Microsoft.Office.Interop.Excel.Workbook)(objBooks.Add(missing)); objSheet = (Microsoft.Office.Interop.Excel.Worksheet)objBook.ActiveSheet; //数据连接,可以是OLEDB或者ODBC string conn = "OLEDB;Provider=SQLOLEDB.1;server=192.168.100.155;uid=sa; password=Asdf1234;database=WebToolsDB;"; //参数依次为:数据连接,填充起始单元格,查询SQL语句 Microsoft.Office.Interop.Excel.QueryTable tb = objSheet.QueryTables.Add(conn, objSheet.get_Range("A1", missing), strSql); //设置QueryTable的属性 tb.FieldNames = true; tb.RowNumbers = false; tb.FillAdjacentFormulas = false; tb.PreserveFormatting = true; tb.RefreshOnFileOpen = false; tb.BackgroundQuery = true; tb.RefreshStyle = Microsoft.Office.Interop.Excel.XlCellInsertionMode.xlInsertDeleteCells; tb.SavePassword = false; tb.SaveData = true; tb.AdjustColumnWidth = true; tb.RefreshPeriod = 0; tb.PreserveColumnInfo = true; tb.BackgroundQuery = false; //只适用QueryTable基于SQL查询的结果时 //true:异步查询 //false:所有查询结果存入Sheet后返回 tb.Refresh(tb.BackgroundQuery); try { //设置Sheet样式等属性 objSheet.PageSetup.LeftMargin = 20; objSheet.PageSetup.RightMargin = 20; objSheet.PageSetup.TopMargin = 35; objSheet.PageSetup.BottomMargin = 15; objSheet.PageSetup.HeaderMargin = 7; objSheet.PageSetup.FooterMargin = 10; objSheet.PageSetup.CenterHorizontally = true; objSheet.PageSetup.CenterVertically = false; objSheet.PageSetup.Orientation = Microsoft.Office.Interop.Excel.XlPageOrientation.xlPortrait; objSheet.PageSetup.PaperSize = Microsoft.Office.Interop.Excel.XlPaperSize.xlPaperA4; objSheet.PageSetup.Zoom = false; objSheet.PageSetup.FitToPagesWide = 1; objSheet.PageSetup.FitToPagesTall = false; } catch { } //保存excel文件在服务器 //关闭Microsoft.Office.Interop.Excel objBook.SaveAs(ExportPath + strFileName, missing, missing, missing, missing, missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, missing, missing, missing, missing, missing); objBook.Close(false, missing, missing); objBooks.Close(); objExcel.Quit(); } finally { //释放资源 if (!objSheet.Equals(null)) System.Runtime.InteropServices.Marshal.ReleaseComObject(objSheet); if (objBook != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(objBook); if (objBooks != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(objBooks); if (objExcel != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(objExcel); GC.Collect(); } //下载或打开Excel在浏览器端 Response.Clear(); Response.Buffer = true; Response.ContentType = "application/vnd.ms-Excel"; Response.ContentEncoding = System.Text.Encoding.UTF8; Response.AppendHeader("content-disposition", "attachment;filename=" + strFileName); this.EnableViewState = false; Response.WriteFile(ExportPath + strFileName); Response.End(); } protected void Button3_Click(object sender, EventArgs e) { ExortToExcelQueryTable("select * from t_apptask"); }
?
查看QueryTables.Add的官方说明:
http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.querytables.add(office.11).aspx
关键字: excel QueryTable 导出excel
发表评论
相关文章
国内AI资源汇总,AI聊天、AI绘画、AI写作、AI视频、AI设计、AI编程、AI音乐等,国内顺畅访问,无需科学上网。
扫码或点击进入:萤火AI大全
文章分类
最新评论