本人在使用一般处理程序.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", "p_w_upload;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", "p_w_upload;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导出时用到的,如果大家有更好的方案,请多多提出……
转载于:https://blog.51cto.com/msuccessful/1650553