本人在使用一般处理程序.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导出时用到的,如果大家有更好的方案,请多多提出……