您的位置:首页 > 编程语言 > ASP

ASP.NET 使用一般处理程序.ashx进行 Excel下载

2015-05-12 11:44 771 查看
本人在使用一般处理程序.ashx进行Excel下载(导出)开发时,遇到的问题总结:
1、.ashx文件对Excel下载的处理,方法有两种:
①、不采用HSSFWorkbook对象进行操作(从后台查询数据,并以DataSet的形式返回)
OrderManagerBl orderMgr = new OrderManagerBl();  //实例化逻辑访问层的对象

DataSet ds = orderMgr.QueryOrderInfo(queryObj); //调用获取DataSet的方法,参数是查询条件对象
//设置导出的Excel文件名,前面加年月日时分秒
string FileName = DateTime.Now.ToString("yyyyMMddHHmmss") + "订单信息.xls";
HttpResponse resp;  //设置返回对象
resp = context.Response;
resp.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
resp.AppendHeader("Content-Disposition", "attachment;filename=" + FileName);
//colHeaders 是Excel表格的表头
//ls_item 是Excel表格的行
string colHeaders = "", ls_item = "";
int i = 0;
//将DataSet中的值,赋值给DataTable,或者也可以从后台直接查询一个DataTable出来
DataTable dt = ds.Tables[0];
DataRow[] myRow = dt.Select("");
//取得数据表各列标题各标题之间以\t分割最后一个列标题后加回车符
for (i = 0; i < dt.Columns.Count; i++)
{
if (i == dt.Columns.Count - 1)
{
colHeaders += dt.Columns[i].Caption.ToString() + "\n";
continue;
}
colHeaders += dt.Columns[i].Caption.ToString() + "\t";
}
//向HTTP输出流中写入取得的数据信息
resp.Write(colHeaders);
//逐行处理数据
foreach (DataRow row in myRow)
{
//在当前行中逐列获得数据数据之间以\t分割结束时加回车符\n
for (i = 0; i < dt.Columns.Count; i++)
{
if (i == dt.Columns.Count - 1)
{
ls_item += row[i].ToString() + "\n";
continue;
}
ls_item += row[i].ToString() + "\t";
}
//当前行数据写入HTTP输出流并且置空ls_item以便下行数据
resp.Write(ls_item);
ls_item = "";
}
context.Response.ContentType = "application/vnd.ms-excel";
//写缓冲区中的数据到HTTP头文件中
resp.End();
context.Response.Write(context.Response.OutputStream);
②、采用HSSFWorkbook对象进行导出
注:在采用此方式进行导出时,需要在项目中添加引用NPOI.dll,该dll,我已在附件中给出,如有需要请下载

context.Response.ContentType = "application/x=excel";
//设置导出的文件名字,这里我就不再使用"年月日时分秒"命名了
string filename = HttpUtility.UrlEncode("用户数据列表.xls");
context.Response.AddHeader("Content-Disposition", "attachment;filename=" + filename);
//创建HSSFWorkbook工作簿对象
HSSFWorkbook workbook = new HSSFWorkbook();
//创建HSSFSheet对象
HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet();
int rownum = 0;
HSSFRow row = (HSSFRow)sheet.CreateRow(rownum);
//取得数据表各列标题各标题之间以\t分割最后一个列标题后加回车符
for (int i = 0; i < ds.Tables[0].Columns.Count; i++)
{
row.CreateCell(i, HSSFCell.ENCODING_COMPRESSED_UNICODE).SetCellValue(ds.Tables[0].Columns[i].Caption.ToString());
}
rownum++;
foreach (DataRow dr in ds.Tables[0].Rows)
{
row = (HSSFRow)sheet.CreateRow(rownum);
row.CreateCell(0, HSSFCell.ENCODING_COMPRESSED_UNICODE).SetCellValue(dr["COINSIGNID"].ToString());
row.CreateCell(1, HSSFCell.ENCODING_COMPRESSED_UNICODE).SetCellValue(dr["CUST_VOUCHER_ID"].ToString());
//。。。循环进行给每行的单元格进行赋值,这里我只写了两个列进行提示
rownum++;
}
workbook.Write(context.Response.OutputStream);
以上两种方法,是我在做Excel导出时用到的,如果大家有更好的方案,请多多提出……

附件:http://down.51cto.com/data/2365671
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ASP.NET ashx 处理程序