总结: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的方法,代码如下:
{
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下执行这句便可批量导入规定格式的数据了