怎样导出Excel表格

fxsy6669 2010-04-06 03:00:48
VS2008连接Sqlserver2008数据库,在数据库读取数据然后导出excel数据表,以前没做过,应该怎么做呢,希望能把前台页面部分和后台方法的调用与实现都提供出来,最好写的详细点,先谢谢了
...全文
71 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Veronika 2010-04-06
  • 打赏
  • 举报
回复



本文所演示的导入和导出方法并未使用Excel COM组件,而是使用原始的ASP.NET OleDb驱动程序,这使得ASP.NET应用程序即使部署在未安装Excel的服务器上也同样能支持导入和导出校准的Excel格式文件。

一、导出

网上有不少关于ASP.NET应用程序导出Excel文件的方法,大多都是设置Response对象的Content-Type为“application/ms-excel”后,以字符串形式输出数据供用户下载(可参考:http://blog.csdn.net/jilm168/archive/2007/11/06/1869118.aspx)。

虽说这种方式确实能实现导出Excel文件的目的,但其导出的Excel文件是不标准的。如果你用记事本打开使用此方式导出的文件会发现该文件是一个纯文本文件,这个倒是次要的,因为强大的Excel绝对有能力识别并显示这种“伪”Excel文件,但如果我们的应用程序要支持导入的话,那么这一文件就无法被程序正确识别了。

为了导出标准的Excel文件,我们可以首先准备好一个标准Excel文件做为导出模板,导出数据时先创建此模板的一个副本,使用OleDb驱动程序向副本中写入数据后,将此副本的二进制字节流输出至客户端供用户下载,最后再删除此副本。

如何制做一个Excel文件模板呢?你可以在安装有Excel的机器上新建一个“Microsoft Excel 工作表”,在工作表的第一行设置好需要的字段,然后选中整个表,点右键选择“设置单元格格式”,在“数字”标签的“分类”列表选择“文本”,点击“确定” 并保存文件。将单元格格式设置为“文本”主要是为了防止日后导入数据时某些数据格式无法被识别。

有了这个模板,我们就可以开始写代码导出数据了。本示例所使用模板文件位于站点根目录,名为“demo.xls”,共包含三个列:“ID”、“姓名”和“生日”。

excel_template

// 根据模板文件创建副本
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);
// 接下来你就可以对 dt 为所欲为了……
上面的代码中,我们导入了位于站点根目录的“info.xls”,导入时我们依旧使用OleDb驱动程序来访问Excel文件。再次提醒读者,此种方式只支持导入标准的Excel文件,这也是上面导出部分使用预先准备好的Excel模板文件的原因。

另外,以上演示仅针对Excel 2000-2003格式的文件,如果您要导入或导出的是Excel 2007文件(*.xlsx),那么您需要将连接字符串改为(可参考:http://www.connectionstrings.com/):
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=info.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES";
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条时就感觉到慢了.
cpp2017 2010-04-06
  • 打赏
  • 举报
回复
这里有三种方法.
http://blog.csdn.net/cpp2017/archive/2008/04/02/2244368.aspx

http://blog.csdn.net/cpp2017/archive/2008/04/02/2245276.aspx
http://blog.csdn.net/cpp2017/archive/2008/04/02/2245396.aspx
vip__888 2010-04-06
  • 打赏
  • 举报
回复
告诉你方法,代码自己去找。

首先 将你要导出的数据保存在List<>或者DataSet中,然后
一个循环一边读取,一边写入excel 最后输出 xls文件 即可。

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧