总结:ASP.NET 下SQL数据库导出/导入Excel

这两天研究了一下“ASP.NET 下SQL数据库导出/导入Excel”
总结如下:

1、Excel导出

有两种基本的思路:a、可以调用Office 的Com组建,将数据读出的时候,做循环把数据填充到Excel 的Cell里面。这种方法在C/S或者单机应用程序使用比较普遍,但是据测试其的效率十分低下,而且程序运行的机器必须装有Office否则便是无米之炊了,此外还有一个问题值得关注的,就是Office的版本,不同版本提供的接口都可能会有那么一点点地不同。故此,这种方法要做到稳定通用高效,可能行似乎不大,特别在B/S程序里面。

我们这里主要介绍b.在B/S下将GridView的Html导出生成Excel。优点:效率高、服务器无需Office组件。
具体实现的代码(这里还同时实现了导出其他格式,如Word):

//导出GridView
        private static void GridExport(GridView MyGridView, string strFile,string strExt)
        {
            string strAppType = "";
            switch (strExt)
            {
                case "xls":
                    strAppType = "application/ms-excel";
                    break;
                case "doc":
                    strAppType = "application/ms-word";
                    break;
                case "txt":
                    strAppType = "application/ms-txt";
                    break;
                case "html":
                case "htm":
                    strAppType = "application/ms-html";
                    break;
                default: return;
            }
            //定义文档类型、字符编码  
            HttpContext.Current.Response.Clear();
            HttpContext.Current.Response.Buffer = true;
            HttpContext.Current.Response.Charset = "GB2312";//下面这行很重要,attachment参数表示作为附件下载,您可以改成 online在线打开        
            HttpContext.Current.Response.AppendHeader("Content-Disposition", string.Format("attachment;filename={0}.{1}", strFile,strExt));     //filename=FileFlow.xls   指定输出文件的名称,注意其扩展名和指定文件类型相符,可以为:.doc   .xls   .txt.htm    
            HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;//设置输出流为简体中文  
            //Response.ContentType指定文件类型   可以为application/ms-excel     application/ms-word     application/ms-txt   application/ms-html     或其他浏览器可直接支持文档     

            HttpContext.Current.Response.ContentType = strAppType;//设置输出文件类型。    
            MyGridView.Page.EnableViewState = false;

            //二、定义一个输入流
            System.Globalization.CultureInfo myCItrad = new System.Globalization.CultureInfo("ZH-CN", true);
            System.IO.StringWriter oStringWriter = new System.IO.StringWriter(myCItrad);
            System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);

            //三、将目标数据绑定到输入流输出
            MyGridView.RenderControl(oHtmlTextWriter);
            HttpContext.Current.Response.Write(oStringWriter.ToString());
            HttpContext.Current.Response.End();
        }

实际用起来,在执行RenderControl程序会报错:MyGridView必须在runat=server的容器。为了解决这个问题,我们只好重载VerifyRenderingInServerForm的方法,代码如下:

public override void VerifyRenderingInServerForm(Control control)
        {
            if (control.ClientID.IndexOf("MyGridView") ==-1)
            {
                base.VerifyRenderingInServerForm(control);
            }
        }

改进了这一点还是不行,报错:"只能在执行 Render() 的过程中调用 RegisterForEventValidation"。解决这个问题也很简单在@Page那行加上“EnableEventValidation="false"”就搞定了!

2、导入Excel

string strSql = @"INSERT INTO myTable (col1,col2,col3) SELECT *
FROM OpenDataSource( 'MICROSOFT.JET.OLEDB.4.0',
'Data Source=G:\\test.xls;User ID=;Password=;Extended properties=Excel 5.0')...Sheet1$;";
Data Source是Excel文件的路径
Sheet1$是包含导入数据的Excel工作表
Sql Server下执行这句便可批量导入规定格式的数据了