Tipo de conteúdo de resposta como CSV

328

Preciso enviar um arquivo CSV na resposta HTTP. Como posso definir a resposta de saída como formato CSV?

Isto não está a funcionar:

Response.ContentType = "application/CSV";
balaweblog
fonte

Respostas:

491

Usar text/csvé o tipo mais apropriado.

Você também deve considerar adicionar um Content-Dispositioncabeçalho à resposta. Geralmente, um texto / csv é carregado por um Internet Explorer diretamente em uma instância hospedada do Excel. Isso pode ou não ser um resultado desejável.

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

O exemplo acima fará com que apareça uma caixa de diálogo "Salvar como", que pode ser o que você pretende.

AnthonyWJones
fonte
2
Eu gosto de usar um objeto System.Net.Mime.ContentDisposition para criar essa string.
Ronnie Overby
151

O tipo MIME do CSV é text / csv, de acordo com a RFC 4180 .

sastanina
fonte
62

Use text/csvcomo o tipo de conteúdo.

ibz
fonte
48

Ao longo dos anos, aprimorei um conjunto perfeito de cabeçalhos para isso, que funcionam brilhantemente em todos os navegadores que conheço.

// 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");
perigoso
fonte
7
Se você usa application / vnd.ms-excel. No osx safari adiciona uma extensão de arquivo ".xls"
Luke Smith
28

Experimente um desses outros tipos MIME (a partir daqui: http://filext.com/file-extension/CSV )

  • valores separados por vírgula / texto
  • text / csv
  • application / csv
  • application / excel
  • application / vnd.ms-excel
  • application / vnd.msexcel

Além disso, o tipo MIME pode fazer distinção entre maiúsculas e minúsculas ...

diclophis
fonte
15

Basta usar assim

Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + filename + ".csv\"");
Response.Write(t.ToString());
Response.End();
GateKiller
fonte
Colocar o nome do arquivo entre aspas duplas corrigiu isso para mim quando o cliente é o Firefox.
Graham
1
Se você estiver usando isso em um controlador MVC, precisará finalizar o método do controlador return new EmptyResult()para obter o nome do arquivo. Caso contrário, o IE tentará salvar o arquivo como ActionName.htm.
usar o seguinte código
5

No ASP.net MVC, você pode usar ae FileContentResulto Filemétodo:

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

Descobri que o problema com o IE é que ele fareja os dados de retorno e decide por qual tipo de conteúdo ele acha que foi enviado. Há vários efeitos colaterais que isso causa, como abrir sempre uma caixa de diálogo saveAs para arquivos de texto porque você está usando a compactação de transferências de dados. A solução é (em código php) ......

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

A configuração do tipo e da disposição do conteúdo, conforme descrito acima, produz resultados extremamente variados com diferentes navegadores:

IE8: Caixa de diálogo SaveAs, conforme desejado, e Excel como o aplicativo padrão. 100% bom.

Firefox: o diálogo SaveAs aparece, mas o Firefox não faz ideia de que é uma planilha. Sugere abri-lo com o Visual Studio! 50% bom

Chrome: as dicas são totalmente ignoradas. Os dados CSV são mostrados no navegador. 0% bom.

É claro que em todos esses casos estou me referindo aos navegadores quando saem da caixa, sem personalização dos mapeamentos mime / application.


fonte
Se o Firefox deseja abrir com o Visual Studio, significa que você está exportando o HTML e não um CSV.
Martin
Este não parece ser o caso em 2014, funcionou bem em todos eles para mim.
MikeKulls 01/05/19
Por favor, defina "como descrito acima"
xhienne
2

Sugiro inserir um caractere '/' na frente de 'myfilename.cvs'

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

Espero que você obtenha melhores resultados.

Jaider
fonte
0

Para o C # MVC 4.5, você precisa fazer o seguinte:

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.
Suresh Kamrushi
fonte