Как обслуживать представление как CSV в веб-формах ASP.NET - PullRequest
2 голосов
/ 29 марта 2010

У меня есть представление MS SQL, которое я хочу сделать доступным для загрузки в формате CSV в своем приложении ASPNET Web Forms. Я использую Entity Framework для других представлений и таблиц в проекте. Какой лучший способ включить эту загрузку?

Я мог бы добавить LinkButton, чей обработчик кликов перебирает представление, записывает свою CSV-форму на диск и затем обслуживает этот файл. Однако я бы предпочел не записывать на диск, если этого можно избежать, а это включает в себя итерационный код, которого можно избежать с помощью другого решения.

Ответы [ 4 ]

2 голосов
/ 29 марта 2010

Вы можете перебирать набор данных, но вместо создания файла CSV на своем сервере просто верните его через HTTP-ответ. Следующая функция должна сделать трюк.

Public Shared Sub ExportTextFile(ByVal response As System.Web.HttpResponse, ByVal text As String, ByVal fileName As String)

    response.Clear()
    response.AddHeader("content-disposition", String.Format("attachment;filename={0}", fileName))
    response.Charset = ""
    response.Cache.SetCacheability(HttpCacheability.NoCache)
    response.ContentType = "application/vnd.text"

    Dim stringWrite As New System.IO.StringWriter
    Dim htmlWrite = New HtmlTextWriter(stringWrite)
    response.Write(text.ToString)
    response.End()

End Sub
1 голос
/ 29 марта 2010

См. эту статью , в частности, метод WriteToCsv(); Это отправит данные CSV в браузер как PersonList.csv.

Обновление: Возможный Asp.Чистый сценарий:

protected void Page_Load(object sender, EventArgs e)
{
  var data = GetMyData(...);
  CSVExporter.WriteToCSV(data);
}
0 голосов
/ 30 марта 2010

Я нашел этот вопрос, который касается HttpHandler части дилеммы.

В ASP.NET, как заставить браузер загружать содержимое строки в файл? (C #)

0 голосов
/ 29 марта 2010

Вот мой код для создания CSV-файла из любого IDataReader. Вызовите его, используя результаты ExecuteReader () и HttpResponse.OutputStream. Он запишет имена столбцов в первой строке, а затем один или несколько наборов строк данных. Выведите его в браузер, как предложено Мэттом, хотя я бы предложил тип содержимого 'text / csv'.

public static void createCsvFile(IDataReader reader, StreamWriter writer) {
  for (int columnCounter = 0; columnCounter < reader.FieldCount; columnCounter++) {
    if (columnCounter > 0) {
      writer.Write(Separator);
    }
    writer.Write(Delimiter + reader.GetName(columnCounter) + Delimiter);
  }
  writer.WriteLine(string.Empty);

  do {
    while (reader.Read()) {
      for (int columnCounter = 0; columnCounter < reader.FieldCount; columnCounter++) {
        if (columnCounter > 0) {
         writer.Write(Separator);
       }
       writer.Write("\""+ reader.GetValue(columnCounter).ToString().Replace('"', '\'') + "\"");
      }
      writer.WriteLine(string.Empty);
    } 
    writer.Flush();
  }
  while (reader.NextResult());
...