C# 从单个表中下载多个.csv。ASP.NETMVC
下面的代码片段可以很好地将sql表下载到C# 从单个表中下载多个.csv。ASP.NETMVC,c#,asp.net-mvc,csv,C#,Asp.net Mvc,Csv,下面的代码片段可以很好地将sql表下载到.csv,但是不起作用的是,当我尝试像这样动态地指定文件名时 而不是: response.AddHeader("content-disposition", "attachment;filename=Logs.csv"); 我使用: response.AddHeader("content-disposition", "attachment;filename="+sch.SchoolName+".csv"); 它将文件保存为.txt而不是.csv为什么会这
.csv
,但是不起作用的是,当我尝试像这样动态地指定文件名时
而不是:
response.AddHeader("content-disposition", "attachment;filename=Logs.csv");
我使用:
response.AddHeader("content-disposition", "attachment;filename="+sch.SchoolName+".csv");
它将文件保存为.txt
而不是.csv
为什么会这样
此外,作为crystal,我有一个表,它根据列MacNum
将记录彼此分开。我试图从同一个表中生成两个不同的.csv
文件,但文件名不同,如果我取消注释下面的部分(注释了一个),它会引发“无法发送头”
异常
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();
}
更新:
下面是它正在拍摄的文件名
的图片,但它仅使用whs
保存它
此外,如何为同一表中的另一所学校再次运行相同的代码?(上面代码片段中的注释代码)尝试这样使用
response.AddHeader("content-disposition", string.Format("attachment;filename={0}.csv", sch.SchoolName));
或者试试下面的方法
var attachmentValue = string.Format("attachment; filename={0}.csv", sch.SchoolName);
response.AddHeader("content-disposition", attachmentValue);
response.ContentType = "text/csv";
试着这样使用
response.AddHeader("content-disposition", string.Format("attachment;filename={0}.csv", sch.SchoolName));
或者试试下面的方法
var attachmentValue = string.Format("attachment; filename={0}.csv", sch.SchoolName);
response.AddHeader("content-disposition", attachmentValue);
response.ContentType = "text/csv";
下面是此错误的解决方案 var fileDetail=“附件;文件名=“+sch.SchoolName+”.csv”
AddHeader(“内容处置”,fileDetail) 下面是此错误的解决方案 var fileDetail=“附件;文件名=“+sch.SchoolName+”.csv”
AddHeader(“内容处置”,fileDetail) 回答第一个问题:为什么文件名不起作用 阅读后,您似乎必须将文件名设置为双引号: 内容处置:附件;filename=“filename.jpg” 文件名 后跟一个字符串,该字符串包含传输文件的原始名称。文件名始终是可选的,应用程序不能盲目使用:应该删除路径信息,并转换为服务器文件系统规则。此参数主要提供指示性信息。当与Content Disposition:attachment结合使用时,它将用作最终显示给用户的“另存为”对话框的默认文件名 因此,您应该在字符串中添加双引号:
response.AddHeader("content-disposition", "attachment;filename=\"" + sch.SchoolName + ".csv\"");
回答第二个问题为什么无法发送第二个文件 如果取消对第二个代码块的注释,它将失败,因为对于一个请求,您只能返回一个响应(也称为一个文件)。当您在活动代码中调用
response.End()
,然后在同一响应上调用其他方法时(即使您通过另一个变量名请求它)由于流已关闭,因此出现错误
如果您认为您现在可以很聪明,只需不调用response.End()
,它也不会起作用,因为在这种情况下,您只会收到一个文件,其中包含您想要获取的两个文件的数据
所以有一个简单的规则:一个请求导致一个响应,其中包含一个文件。为了实现您的目标,现在有两种可能的解决方案:
回答第一个问题,为什么文件名不起作用 阅读后,您似乎必须将文件名设置为双引号: 内容处置:附件;filename=“filename.jpg” 文件名 后跟一个字符串,其中包含传输的文件的原始名称。文件名始终是可选的,应用程序不得盲目使用:应去除路径信息,并应完成到服务器文件系统规则的转换。此参数主要提供指示性信息。与Co结合使用时ntent Disposition:附件,它用作最终呈现给用户的“另存为”对话框的默认文件名 因此,您应该在字符串中添加双引号:
response.AddHeader("content-disposition", "attachment;filename=\"" + sch.SchoolName + ".csv\"");
回答第二个问题为什么无法发送第二个文件 如果取消注释第二个代码块,它将失败,因为对于一个请求,您只能返回一个响应(也称为一个文件)。当您在活动代码中调用
response.End()
,然后在同一响应上调用其他方法(即使您通过另一个变量名请求响应)时,由于流已经关闭,因此会出现错误
如果您认为您现在可以很聪明,只需不调用response.End()
,它也不会起作用,因为在这种情况下,您只会收到一个文件,其中包含您想要获取的两个文件的数据
所以有一个简单的规则:一个请求导致一个响应,其中包含一个文件。为了实现您的目标,现在有两种可能的解决方案:
在字符串“attachment;filename=“+sch.SchoolName+”.csv”中,不要连接文件名,而是将完整的字符串放入变量并传递到此处;AddHeader(“内容处置”、“附件;文件名=“+filename+”.csv”)但这会再次将其保存为
.txt
。另外,它不使用db>ABC-O Levels中存储的全名,而只使用