很多人在处理Response下载文件名是使用这个方法
Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileInfo.Name, System.Text.Encoding.UTF8));
但这个只是针对没有空格和IE的情况下使用。
如果想在FireFox下输出没有编码的文件,并且IE下输出的文件名中空格不为+号,就要多一次判断了。
详细出处参考:http://www.jb51.net/article/34048.htm

if (Request.UserAgent.ToLower().IndexOf("msie") > -1) { downloadfilename = HttpUtility.UrlPathEncode(downloadfilename); } if (Request.UserAgent.ToLower().IndexOf("firefox") > -1) { Response.AddHeader("Content-Disposition", "attachment;filename=\"" + downloadfilename + "\""); } else { Response.AddHeader("Content-Disposition", "attachment;filename=" + downloadfilename); }
源代码:project.aspx.cs

#region 导出数据事件 protected void DataGrid_ItemCommand(object sender, DataGridCommandEventArgs e) { try { if (e.CommandName == "export") { //取得单条数据 项目ID string[] obj = e.CommandArgument.ToString().Split(','); int proj_id = Convert.ToInt32(obj[0]); string proj_name = obj[1].ToString();//用于最后保存文件命名使用 //daochu string downloadfilename = "项目成本统计_"; ProjectBusiness.costExport(proj_id, proj_name, Response.OutputStream); Response.ContentType = "application/x-msdownload"; Response.Charset = ""; //Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(downloadfilename + proj_name + ".xls", System.Text.Encoding.UTF8)); if (Request.UserAgent.ToLower().IndexOf("msie") > -1) { downloadfilename = HttpUtility.UrlPathEncode(downloadfilename); proj_name = HttpUtility.UrlPathEncode(proj_name); } if (Request.UserAgent.ToLower().IndexOf("firefox") > -1) { Response.AddHeader("Content-Disposition", "attachment;filename=\"" + downloadfilename +proj_name+ ".xls" + "\""); } else { Response.AddHeader("Content-Disposition", "attachment;filename=" + downloadfilename +proj_name+ ".xls"); } Response.End(); } } catch { Message.Show(this, "E025"); return; } } #endregion
ProjectBusiness.cs

#region 项目成本统计 public static void costExport(int id, string projectName, Stream outputStream) { try { using (FileStream fs = new FileStream(HttpContext.Current.Server.MapPath(EXPENSE_OUTPUT_TEMPLATE_FILE), FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { POIFSFileSystem poifs = new POIFSFileSystem(fs); //创建excel HSSFWorkbook workbook = new HSSFWorkbook(poifs); //创建sheet1 ISheet sheet1 = workbook.GetSheetAt(0); //创建sheet2 ISheet sheet2 = workbook.GetSheetAt(1); //创建sheet3 ISheet sheet3 = workbook.GetSheetAt(2); costProject(id, projectName, workbook, sheet1); costWorkRecord(id, projectName, workbook, sheet2); costExpense(id, projectName, workbook, sheet3); workbook.Write(outputStream); } } catch { } } #endregion #region 导出项目成本(日报明细表) private static void costWorkRecord(int id, string projectName, HSSFWorkbook workbook, ISheet sheet) { try { PoiUtils poi = new PoiUtils(workbook, sheet); //填充单元格 DataTable recordTable = getRecordSql(id); //设置单元格样式 普通样式 ICellStyle cellstyle; cellstyle = poi.GetCellStyle(3, 1); //字体变红 IFont font = workbook.CreateFont(); ICellStyle cellred; cellred = poi.CloneCellStyle(cellstyle); font.Color = HSSFColor.RED.index; cellred.SetFont(font); //换行样式 ICellStyle newlinecell; newlinecell = poi.GetCellStyle(3, 13); //设置第一行标题 poi.SetCellText(1, 1, projectName + "_日报明细统计"); //填充单元格 第一列ID不要 for (int i = 0; i < recordTable.Rows.Count; i++) { for (int j = 1; j < recordTable.Columns.Count; j++) { poi.SetCellText(i + 3, j, recordTable.Rows[i][j]); } poi.SetCellStyle_Row(i + 3, 12, 10, cellstyle, cellred);//设置1-12列样式,第10,11列条件判断后设置样式 poi.SetCellStyle_Rows(i + 3, 13, 14, newlinecell);//设置13,14列换行样式; } } catch { } } private static DataTable getRecordSql(int proj_id) { try { using (DbHelper db = new DbHelper()) { string sql = @"select TB_Work_Record.User_id,TB_User.Username, TB_User.Realname, CONVERT(varchar(100), Record_date,111)Record_date, '' as date_type, CONVERT(varchar(100), First_time,111) + '~' + CONVERT(varchar(100), Last_time,111)Record, '' as normal, '' as work_normal, '' as work_weekend, '' as work_holiday, '' as unconfirm, '' as rebut, '' as total, '' as content, '' as Remark from TB_Attendance right join TB_Work_Record on TB_Attendance.User_id=TB_Work_Record.User_id and CONVERT(varchar(100), Record_date,23)=CONVERT(varchar(100), First_time,23) left join TB_User ON TB_Work_Record.User_id = TB_User.ID where Project_id=@proj_id and Record_status != @status group by TB_Work_Record.User_id,TB_User.Username,TB_User.Realname,Record_date,First_time,Last_time"; DbParameter[] parameters = new DbParameter[] { db.CreateParameter("@proj_id", proj_id), db.CreateParameter("@status", (int)enmStatus.删除) }; DataTable tbrecord = db.GetDataSet(sql, parameters).Tables[0]; for (int i = 0; i < tbrecord.Rows.Count; i++) { //累加求和备注和工作内容; int userid = Convert.ToInt32(tbrecord.Rows[i]["User_id"]); DateTime recordtime = Convert.ToDateTime(tbrecord.Rows[i]["Record_date"]); htcond.Clear(); htcond.Add("userid", userid); htcond.Add("record_date_total", recordtime); htcond.Add("project_id", proj_id); ArrayList list = workRecordCommon.sumRecord(htcond); tbrecord.Rows[i]["normal"] = list[0]; tbrecord.Rows[i]["work_normal"] = list[1]; tbrecord.Rows[i]["work_weekend"] = list[2]; tbrecord.Rows[i]["work_holiday"] = list[3]; tbrecord.Rows[i]["unconfirm"] = list[8]; tbrecord.Rows[i]["rebut"] = list[10]; tbrecord.Rows[i]["total"] = list[9]; tbrecord.Rows[i]["Remark"] = list[6]; tbrecord.Rows[i]["content"] = list[7]; //判断日期种类 tbrecord.Rows[i]["date_type"] = workRecordCommon.dateType_Judgement(recordtime); } return tbrecord; } } catch { return null; } } #endregion #region 导出项目成本(工作记录表) protected static void costProject(int id, string projectName, HSSFWorkbook workbook, ISheet sheet) { try { PoiUtils poi = new PoiUtils(workbook, sheet); htcond.Clear(); htcond.Add("project_id", id); TB_Work_record[] work_record = Work_recordBusiness.FindAllById(htcond); var record = from item in work_record orderby item.User_id, item.Record_date select item; int i = 3;//用户或者日期不同时循环 int userid = -1;//初始用户ID string recorddata = "";//初始记录日期; string username = "";//初始用户名 string realname = ""; //累计工作时间 decimal normal = 0; decimal work_normal = 0; decimal work_weekend = 0; decimal work_holiday = 0; decimal unconfirmed_time = 0; decimal rebut = 0; //累计每个用户所有月份工作时间 decimal sumnormal = 0; decimal sumwork_normal = 0; decimal sumwork_weekend = 0; decimal sumwork_holiday = 0; decimal sumunconfirmed_time = 0; decimal sumrebut = 0; //最后一次统计使所有小计累计之和 decimal tempnormal = 0; decimal tempwork_normal = 0; decimal tempwork_weekend = 0; decimal tempwork_holiday = 0; decimal tempunconfirmed_time = 0; decimal temprebut = 0; //设置单元格样式 ICellStyle cellstyle; cellstyle = poi.GetCellStyle(3, 1); IFont font = workbook.CreateFont(); ICellStyle cellred; cellred = poi.CloneCellStyle(cellstyle); font.Color = HSSFColor.RED.index; cellred.SetFont(font); //设置第一行标题 poi.SetCellText(1, 1, projectName + "_项目成本统计"); #region 填充 foreach (var item in record) { //用户不同或用户相同月份不同就添加一行 if (recorddata != "" && (userid != item.User_id || recorddata != item.Record_date.ToString("yyyy-MM"))) { poi.SetCellText(i, 1, username); poi.SetCellText(i, 2, realname); poi.SetCellText(i, 3, recorddata); poi.SetCellText(i, 4, normal); poi.SetCellText(i, 5, work_normal); poi.SetCellText(i, 6, work_weekend); poi.SetCellText(i, 7, work_holiday); poi.SetCellText(i, 8, unconfirmed_time); poi.SetCellText(i, 9, rebut); poi.SetCellText(i, 10, normal + work_normal + work_weekend + work_holiday); poi.SetCellStyle_Row(i, 10, 8, cellstyle, cellred);//设置1到10列的样式 //小计一个用户所有月份 sumnormal += normal; sumwork_normal += work_normal; sumwork_weekend += work_weekend; sumwork_holiday += work_holiday; sumunconfirmed_time += unconfirmed_time; sumrebut += rebut; //清空用于下一行累加 normal = 0; work_normal = 0; work_weekend = 0; work_holiday = 0; unconfirmed_time = 0; rebut = 0; i++; //用户不同时 添加小计 if (userid != item.User_id) { //把小计赋值临时变量 最后总计 tempnormal += sumnormal; tempwork_normal += sumwork_weekend; tempwork_weekend += sumwork_normal; tempwork_holiday += sumwork_holiday; tempunconfirmed_time += sumunconfirmed_time; temprebut += sumrebut; //添加 poi.MergedRegion(i, 1, i, 3); poi.SetCellText(i, 1, "小计:"); poi.SetCellText(i, 4, sumnormal); poi.SetCellText(i, 5, sumwork_normal); poi.SetCellText(i, 6, sumwork_weekend); poi.SetCellText(i, 7, sumwork_holiday); poi.SetCellText(i, 8, sumunconfirmed_time); poi.SetCellText(i, 9, sumrebut); poi.SetCellText(i, 10, sumnormal + sumwork_normal + sumwork_weekend + sumwork_holiday); poi.SetCellStyle_Row(i, 10, 8, cellstyle, cellred);//设置1到10列的样式 //清空用于下一次重新小计 sumnormal = 0; sumwork_weekend = 0; sumwork_normal = 0; sumwork_holiday = 0; sumunconfirmed_time = 0; sumrebut = 0; i++; } } #region 累加时间 if (item.Record_status != (int)enmStatus.删除 && item.Record_type == (int)enmRecord_type.正常工作) { normal += item.Work_time; } if (item.Record_status != (int)enmStatus.删除 && item.Record_type == (int)enmRecord_type.平时加班) { work_normal += item.Work_time; } if (item.Record_status != (int)enmStatus.删除 && item.Record_type == (int)enmRecord_type.双休日加班) { work_weekend += item.Work_time; } if (item.Record_status != (int)enmStatus.删除 && item.Record_type == (int)enmRecord_type.节假日加班) { work_holiday += item.Work_time; } if (item.Record_status == (int)enmStatus.未确认) { unconfirmed_time += item.Work_time; } if (item.Record_status == (int)enmStatus.驳回) { rebut += item.Work_time; } #endregion //记录本次数据,用于和下条记录做比较 username = item.user.Username; userid = item.User_id; realname = item.user.Realname; recorddata = item.Record_date.ToString("yyyy-MM"); } #endregion #region 最后一次 //最后一次小计 因为最后一次直接跳出循环了 要新添记录 poi.SetCellText(i, 1, username); poi.SetCellText(i, 2, realname); poi.SetCellText(i, 3, recorddata); poi.SetCellText(i, 4, normal); poi.SetCellText(i, 5, work_normal); poi.SetCellText(i, 6, work_weekend); poi.SetCellText(i, 7, work_holiday); poi.SetCellText(i, 8, unconfirmed_time); poi.SetCellText(i, 9, rebut); poi.SetCellText(i, 10, normal + work_normal + work_weekend + work_holiday); poi.SetCellStyle_Row(i, 10, 8, cellstyle, cellred);//设置1到10列的样式 i++; //添加小计 poi.MergedRegion(i, 1, i, 3); poi.SetCellText(i, 1, "小计:"); poi.SetCellText(i, 4, sumnormal + normal); poi.SetCellText(i, 5, sumwork_normal + work_normal); poi.SetCellText(i, 6, sumwork_weekend + work_weekend); poi.SetCellText(i, 7, sumwork_holiday + work_holiday); poi.SetCellText(i, 8, sumunconfirmed_time + unconfirmed_time); poi.SetCellText(i, 9, sumrebut + rebut); poi.SetCellText(i, 10, sumnormal + sumwork_normal + sumwork_weekend + sumwork_holiday + normal + work_normal + work_weekend + work_holiday); poi.SetCellStyle_Row(i, 10, 8, cellstyle, cellred);//设置1到10列的样式 i++; //最后一次合计 poi.MergedRegion(i, 1, i, 3); poi.SetCellText(i, 1, "总计:"); poi.SetCellText(i, 4, tempnormal + sumnormal + normal); poi.SetCellText(i, 5, tempwork_normal + sumwork_normal + work_normal); poi.SetCellText(i, 6, tempwork_weekend + sumwork_weekend + work_weekend); poi.SetCellText(i, 7, tempwork_holiday + sumwork_holiday + work_holiday); poi.SetCellText(i, 8, tempunconfirmed_time + sumunconfirmed_time + unconfirmed_time); poi.SetCellText(i, 9, temprebut + sumrebut + rebut); poi.SetCellText(i, 10, tempnormal + tempwork_normal + tempwork_weekend + tempwork_holiday + sumnormal + sumwork_normal + sumwork_weekend + sumwork_holiday + normal + work_normal + work_weekend + work_holiday); poi.SetCellStyle_Row(i, 10, 8, cellstyle, cellred);//设置1到10列的样式 #endregion } catch { } } #endregion #region 导出项目成本(报销明细表) private static void costExpense(int id, string projectName, HSSFWorkbook workbook, ISheet sheet) { try { PoiUtils poi = new PoiUtils(workbook, sheet); //填充单元格 htcond.Clear(); htcond.Add("project_id", id); htcond.Add("status_export", ""); TB_expense_detail[] expenseTable = Expense_detailBusiness.FindAll(htcond); var expense = from item in expenseTable orderby item.User_id select item; //设置单元格样式 普通样式 ICellStyle cellstyle; cellstyle = poi.GetCellStyle(3, 1); //换行样式 ICellStyle newlinecell; newlinecell = poi.GetCellStyle(3, 5); //设置第一行标题 poi.SetCellText(1, 1, projectName + "_报销明细统计"); //填充单元格 int i = 3; foreach (var item in expense) { poi.SetCellText(i, 1, item.user.Username); poi.SetCellText(i, 2, item.user.Realname); poi.SetCellText(i, 3, item.Detail_date.ToString("yyyy-MM-dd")); poi.SetCellText(i, 4, item.Money); poi.SetCellText(i, 5, item.Remark.Trim()); poi.SetCellStyle_Rows(i, 1, 4, cellstyle); poi.SetCellStyle(i, 5, newlinecell); i++; } } catch { } } #endregion