【发布时间】:2018-01-10 07:09:46
【问题描述】:
下面的 sn-p 可以很好地将 sql 表下载到.csv 但是不起作用的是,当我尝试像这样更改动态地给出文件名时;
代替:
response.AddHeader("content-disposition", "attachment;filename=Logs.csv");
我用:
response.AddHeader("content-disposition", "attachment;filename="+sch.SchoolName+".csv");
它将文件保存为.txt 而不是.csv 为什么会这样?
此外,为了清晰起见,我有一个表格,它根据MacNum 列将记录彼此分开。我正在尝试从同一个表中生成两个不同的.csv 文件,但文件名不同,如果我取消注释下面的部分(注释一个),它会抛出一个"Cannot send headers" 异常。
public void ExportCSV_CloudLogs()
{
School sch = (from sc in db.Schools
where sc.MacNum == 1.ToString()
select sc).FirstOrDefault();
var sb = new StringBuilder();
var list = (from o in db.Logs where o.MacNum == 1
select o).ToList();
sb.AppendFormat("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10}", "No", "Name", "Time", "Mode", "Ex", "Type", "SId", "Work", "sDate", "MachineNum", Environment.NewLine);
foreach (var item in list)
{
sb.AppendFormat("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10}", item.No, item.Name, item.Time, item.Mode, item.Ex, item.Type, item.SId, item.Work, item.Date, item.MacNum, Environment.NewLine);
}
//Get Current Response
var response = System.Web.HttpContext.Current.Response;
response.BufferOutput = true;
response.Clear();
response.ClearHeaders();
response.ContentEncoding = Encoding.Unicode;
response.AddHeader("content-disposition", "attachment;filename="+sch.SchoolName+".csv");
response.ContentType = "text/plain";
response.Write(sb.ToString());
response.End();
//School sch2 = (from sc in db.Schools
// where sc.MacNum == 2.ToString()
// select sc).FirstOrDefault();
//var sb2 = new StringBuilder();
//var list2 = (from o in db.Logs
// where o.MacNum == 2
// select o).ToList();
//sb2.AppendFormat("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10}", "No", "Name", "Time", "Mode", "Ex", "Type", "SId", "Work", "sDate", "MacNum", Environment.NewLine);
//foreach (var item in list2)
//{
// sb2.AppendFormat("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10}", item.No, item.Name, item.Time, item.Mode, item.Exception, item.Type, item.SId, item.Work, item.Date, item.MacNum, Environment.NewLine);
//}
////Get Current Response
//var response2 = System.Web.HttpContext.Current.Response;
//response2.BufferOutput = true;
//response2.Clear();
//response2.ClearHeaders();
//response2.ContentEncoding = Encoding.Unicode;
//response2.AddHeader("content-disposition", "attachment;filename="+sch.SchoolName+".CSV ");
//response2.ContentType = "text/plain";
//response2.Write(sb2.ToString());
//response2.End();
}
更新:
下面是它正在拍摄的fileName 的照片,但是当它只用whs 保存时。
此外,如何在同一张表中为另一所学校再次运行相同的代码? (上面sn-p中的注释代码)
【问题讨论】:
-
在字符串“attachment;filename="+sch.SchoolName+".csv”中,不要连接文件名,而是将完整的字符串放入变量并传递到这里。
-
我试过了,
var fileName = sch.SchoolName; response.AddHeader("content-disposition", "attachment;filename="+fileName+".csv");但这又将它保存为.txt。另外,而不是将全名存储在 db >ABC - O Levels它只需要ABC -
我不确定,但学校名称是否包含空格或某些非法文件名字符?如果您的学校名称是“Logs”,会发生什么?
-
@Oliver "Logs" 是表名,学校名是
ABC - O Levelsin db。 -
只是为了测试响应头。如果变量
sch.SchoolName的值为Logs(没有空格、没有特殊字符等),那么response.AddHeader()中的字符串连接是否有效。如果这有效,那么问题不是您的代码,而是它包含的数据。
标签: c# asp.net-mvc csv