C# 将数据库里的数据整理出来导出Excel
标题中有"标准格式的Excel"是指,网上很多导出Excel的方法,但是打开该导出的Excel会弹出"您尝试打开的**.xls文件格式与文件扩展名指定的格式不一致",是因为该方法导出的文件只是扩展名是xls而已,并不是真正意义上的Excel。
可用迅雷下载是指迅雷可真正下载到导出的Excel文件,解决了网上很多人用迅雷下载完成只是个页面文件的疑问。文件名乱码等解决方案都包含在其中。
本案例利用第三方组件myxls来实现导出真正意义上的Excel,myxls的介绍很多,大家可以自己搜。在项目中尧使用myxls,只要导入一个dll文件,本文附件中有提供。
注:整个解决方案包含2个aspx文件和1个js文件,至于为什么要使用2个aspx页面,是因为要让迅雷下载到真正Excel文件,而不是下载aspx页面。项目需要引用到附件中的dll文件,请记得添加引用。
A.aspx页面(显示内容,包含导出按钮)文件:
js文件:
B.aspx页面并不需要写任何内容,浏览器或迅雷检测到Excel文件后,该页面会自动关闭。
[b][这里很关键][/b]B.aspx.cs文件:
标题中有"标准格式的Excel"是指,网上很多导出Excel的方法,但是打开该导出的Excel会弹出"您尝试打开的**.xls文件格式与文件扩展名指定的格式不一致",是因为该方法导出的文件只是扩展名是xls而已,并不是真正意义上的Excel。
可用迅雷下载是指迅雷可真正下载到导出的Excel文件,解决了网上很多人用迅雷下载完成只是个页面文件的疑问。文件名乱码等解决方案都包含在其中。
本案例利用第三方组件myxls来实现导出真正意义上的Excel,myxls的介绍很多,大家可以自己搜。在项目中尧使用myxls,只要导入一个dll文件,本文附件中有提供。
注:整个解决方案包含2个aspx文件和1个js文件,至于为什么要使用2个aspx页面,是因为要让迅雷下载到真正Excel文件,而不是下载aspx页面。项目需要引用到附件中的dll文件,请记得添加引用。
A.aspx页面(显示内容,包含导出按钮)文件:
<asp:Button ID="Button1" runat="server" Text="导出报名表" ClientIDMode="Static" />
//这里仅列出导出按钮 ClientIDMode表示id不变可方便js中获取该元素
js文件:
//这是按钮点击事件 即点击"导出报名表"按钮后的处理
$("#Button1").click(function () {
var title = escape(ActivityTitle);
window.open('ExportExcel.aspx?id=' + ActivityID + '&title=' + title);
});
//这里title是指文件名,使用escape是因为"文件名包含中文" ,必须使用这样的方式传中文参
B.aspx页面并不需要写任何内容,浏览器或迅雷检测到Excel文件后,该页面会自动关闭。
[b][这里很关键][/b]B.aspx.cs文件:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using org.in2bits.MyXls;
using System.Data.SqlClient;
using System.Text;
using Microsoft.JScript;
namespace XXXXX
{
public partial class B: System.Web.UI.Page
{
DataTable table = new DataTable(); //定义一个DataTable用来存放从数据库得到的数据
protected void Page_Load(object sender, EventArgs e)
{
GetData(); //获取数据
SendExcel(); //导出Excel
}
private void SendExcel()
{
org.in2bits.MyXls.XlsDocument doc = new org.in2bits.MyXls.XlsDocument();
string Title = Microsoft.JScript.GlobalObject.unescape(Request.QueryString["title"]); //解码传递过来的中文参
string FileName = Title + "-报名表";
string eFileName = HttpUtility.UrlEncode(FileName, Encoding.UTF8); //这里解决中文乱码
doc.FileName = eFileName + ".xls";//excel文件名称
//设置Excel格式,如果没有要求可忽略
XF TitleXF = doc.NewXF(); //设置表头的实例
TitleXF.UseBorder = true;
TitleXF.TopLineStyle = 1;
TitleXF.TopLineColor = Colors.Black;
TitleXF.BottomLineStyle = 1;
TitleXF.BottomLineColor = Colors.Black;
TitleXF.LeftLineStyle = 1;
TitleXF.LeftLineColor = Colors.Black;
TitleXF.RightLineStyle = 1;
TitleXF.RightLineColor = Colors.Black;
//TitleXF.HorizontalAlignment = HorizontalAlignments.Centered; // 设定文字居中
TitleXF.VerticalAlignment = VerticalAlignments.Centered; // 垂直居中
TitleXF.Font.Bold = true; // 是否加粗
XF dataXF = doc.NewXF(); //设置单元格的实例
dataXF.UseBorder = true;
dataXF.TopLineStyle = 1;
dataXF.TopLineColor = Colors.Black;
dataXF.BottomLineStyle = 1;
dataXF.BottomLineColor = Colors.Black;
dataXF.LeftLineStyle = 1;
dataXF.LeftLineColor = Colors.Black;
dataXF.RightLineStyle = 1;
dataXF.RightLineColor = Colors.Black;
//Excel格式设置结束
org.in2bits.MyXls.Worksheet sheet = doc.Workbook.Worksheets.AddNamed("sheet1");//Excel工作表名称
org.in2bits.MyXls.Cells cells = sheet.Cells;
string[] Header = { "昵称", "姓名", "联系电话", "备注", "报名时间"}; //定义Excel表头
for (int i = 0; i < Header.Length; i++)
{
cells.Add(1, (i + 1), Header[i], TitleXF);//导出表头 其中TitleXF为上面设置的格式,如果不需要不用加这个参数,可写成cells.Add(1, (i + 1), Header[i]);
}
for (int i = 0; i < table.Rows.Count; i++)
{
for (int j = 0; j < Header.Length; j++)
{
cells.Add((i + 2), (j + 1), table.Rows[i][j].ToString(), dataXF); //导出数据 其中dataXF为上面设置的格式,如果不需要不用加这个参数,可写成ells.Add((i + 2), (j + 1), table.Rows[i][j].ToString());
}
}
//这一段也是格式设置,可忽略
ColumnInfo col0 = new ColumnInfo(doc, sheet); // 列对象
col0.ColumnIndexStart = 0; // 起始列为第1列,索引从0开始
col0.ColumnIndexEnd = 4; // 终止列为第1列,索引从0开始
col0.Width = 20 * 256; // 列的宽度计量单位为 1/256 字符宽
sheet.AddColumnInfo(col0); // 把格式附加到sheet页上
//格式设置结束
string path = Server.MapPath("TempFile/"); //设置存储路径
doc.Save(path, true); //为了解决让迅雷下载到Excel而保存在服务器的临时文件
doc.Send(); //发送Excel给客户端
System.IO.File.Delete(path + doc.FileName); //删除之前保存的临时文件
}
private void GetData()
{
string ActivityID = Request.QueryString["id"]; //该值是执行SQL语句需要用到的参数
SqlConnection sqlcon;
string strCon = "Data Source=(local);Database=数据库名;user=用户名;password=密码";
string sqlstr = "select * from 表名 where 列名=ActivityID order by time desc"; //SQL语句,请自行改动
sqlcon = new SqlConnection(strCon);
//需要导出到Excel的每列值的数据类型,需要几列请定义几列,列名请与SQL语句查询结果的列名相对应
table.Columns.Add("列名1", Type.GetType("System.String"));
table.Columns.Add("列名2", Type.GetType("System.String"));
table.Columns.Add("列名3", Type.GetType("System.String"));
table.Columns.Add("列名4", Type.GetType("System.String"));
table.Columns.Add("列名5", Type.GetType("System.String"));
//新建SqlCommand对象
SqlCommand cmd = new SqlCommand(sqlstr, sqlcon);
//打开数据库连接
sqlcon.Open();
//返回dr对象
SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
//循环读取SQL查询结果并赋给DataTable
while (dr.Read())
{
string[] strs; //定义一数组
DataRow row = table.NewRow();
row[0] = dr["列名1"].ToString();
//假设列2会出现空值,需要以下处理,不然使用ToString会出错或单元格内容为
if (dr["列名2"] != "")
row[1] = dr["列名2"].ToString();
row[2] = dr["列名3"].ToString();
row[3] = dr["列名4"].ToString();
row[4] = dr["列名5"].ToString();
table.Rows.Add(row);
}
sqlcon.Close();
}
}
}