我需要在HTTP响应中发送CSV文件。如何将输出响应设置为CSV格式?

这不起作用:

Response.ContentType = "application/CSV";


#1 楼

使用text/csv是最合适的类型。

您还应该考虑在响应中添加Content-Disposition标头。通常,Internet Explorer将text / csv直接加载到Excel的托管实例中。这可能是令人满意的结果,也可能不是期望的结果。

以上内容将导致出现“另存为”文件对话框,这可能是您想要的。 >

评论


我喜欢使用System.Net.Mime.ContentDisposition对象构建该字符串。

–罗尼·奥弗比(Ronnie Overby)
2012年1月11日的15:00

#2 楼

CSV的MIME类型是符合RFC 4180的text / csv。

#3 楼

使用text/csv作为内容类型。

#4 楼

多年来,我一直在为此完善一套标头,这些标头在我所知道的所有浏览器中都能出色地发挥作用。

// these headers avoid IE problems when using https:
// see http://support.microsoft.com/kb/812935
header("Cache-Control: must-revalidate");
header("Pragma: must-revalidate");

header("Content-type: application/vnd.ms-excel");
header("Content-disposition: attachment; filename=$filename.csv");


评论


如果您使用application / vnd.ms-excel。在osx Safari上添加“ .xls”文件扩展名

–路克·史密斯
2012年1月16日上午10:40

#5 楼

尝试其他一种mime类型(从此处:http://filext.com/file-extension/CSV)


text /逗号分隔值
text / csv
应用程序/ csv
应用程序/ excel
应用程序/vnd.ms-excel
应用程序/vnd.msexcel

类型可能区分大小写...

#6 楼

像这样使用

Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + filename + ".csv\"");
Response.Write(t.ToString());
Response.End();


评论


当客户端是Firefox时,用双引号引起来的文件名对我来说是固定的。

–格雷厄姆
2011-3-22在8:55

如果在MVC控制器中使用此方法,则需要在控制器方法中以return newEmptyResult()结尾,以使文件名保持不变。否则,IE将尝试将文件另存为ActionName.htm。

– 3Dave
2013年9月16日上午9:46

#7 楼

在ASP.net MVC中,可以使用FileContentResultFile方法:

public FileContentResult DownloadManifest() {
    byte[] csvData = getCsvData();
    return File(csvData, "text/csv", "filename.csv");
}


#8 楼

我发现IE的问题在于它会嗅探返回数据并决定是否认为已发送了哪种内容类型。这会导致许多副作用,例如,由于使用的是数据传输压缩,因此始终打开文本文件的saveAs对话框。解决方法是(使用php代码)......

header('X-Content-Type-Options: nosniff');


#9 楼

如上所述设置内容类型和内容处置,会在不同的浏览器中产生不同的结果:

IE8:“另存为”对话框,默认为Excel。 100%良好。

Firefox:确实会显示“另存为”对话框,但是Firefox并不知道它是电子表格。建议使用Visual Studio打开它! 50%良好

Chrome:提示完全被忽略。 CSV数据显示在浏览器中。 0%很好。

当然,在所有这些情况下,我指的是浏览器,因为它们是开箱即用的,没有对mime /应用程序映射进行自定义。

评论


如果Firefox希望您使用Visual Studio打开,则意味着您正在导出HTML,而不是CSV。

–马丁
09年9月8日在18:43

2014年的情况似乎并非如此,对我来说,所有方法都工作正常。

– MikeKulls
2014年5月1日在1:30

请定义“如上所述”

– xhienne
17年11月16日在11:47

#10 楼

我建议在'myfilename.cvs'前面插入一个'/'字符。

Response.AddHeader("Content-Disposition", "attachment;filename=/myfilename.csv");


希望您能获得更好的结果。

#11 楼

对于C#MVC 4.5,您需要执行以下操作:

Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + fileName + ".csv\"");
Response.Write(dataNeedToPrint);
Response.End();
return new EmptyResult();  //this line is important else it will not work.