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";

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.


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


62

Use text/csvcomo o tipo de conteúdo.


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");

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 ...


15

Basta usar assim

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

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");
}

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');

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.


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.


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.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.