ASP. Net Экспорт списка в CSV - PullRequest
1 голос
/ 10 февраля 2020

У меня очень старое приложение asp. net, которое использует C#. Net и JQuery Mobile, и мне нужно добавить 1 функцию: Экспорт списка данных в CSV файл. До сих пор у меня разобрались с интерфейсом. У меня есть кнопка jquery, которая передает параметр в строке запроса запроса, чтобы указать при загрузке страницы, что нам нужно экспортировать данные в Excel. У меня также есть следующее C# в событии загрузки страницы. К сожалению, когда я запускаю этот код в Visual Studio с Chrome (или любым браузером), я не получаю приглашение сохранить файл csv. Когда я запускаю его с IE, я получаю следующую ошибку:

"Необработанное исключение в строке 2371, столбец 4 в http://localhost: 53748 / js / libs / jquery -mobile / jquery .mobile-1.0a4.1. js

0x800a138f - Javascript ошибка времени выполнения: невозможно получить свойство '_trigger' с неопределенной или нулевой ссылкой. "

Я не уверен, правильно ли я справляюсь со всем объектом ответа.

        if (Request.QueryString["isExportToExcelRequired"] == "true")
        {
            StringWriter sw = new StringWriter();
            sw.WriteLine("\"ItemID\",\"Description\",\"Price\"");

            if (MasterList.Count > 0)
            {
                for (int i = 0; i < MasterList.Count; i++)
                {
                    sw.WriteLine(string.Format("\"{0}\",\"{1}\",\"{2}\"",
                                               MasterList[i].item.ItemID,
                                               MasterList[i].item.ItemDesc,
                                               MasterList[i].P0
                                               ));
                }

                string fileName = string.Format("{0}_{1}", SubClassID, DateTime.UtcNow.ToString("dd-MM-yyyy"));

                // Write response. 
                Response.ClearContent();
                Response.AddHeader("content-disposition", "attachment;filename=" + fileName + ".csv");
                Response.ContentType = "text/csv";
                Response.Write(sw.ToString());
                Response.End();
            }
        }

Ответы [ 3 ]

1 голос
/ 11 февраля 2020

Проблема с записью значений, как у вас, что происходит, если одно из значений содержит запятую? Я использую для этого пакет NuGet SoftCircuits.CsvParser . Я обнаружил, что в среднем он примерно в четыре раза быстрее, чем CsvHelper.

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

1 голос
/ 13 февраля 2020

Я смог добиться этого, обработав экспорт csv на странице aspx с помощью функции Javascript. Вот как выглядит решение:

Элемент управления Button, который вызывает функцию «download_csv» в событии onclick:

<button onclick="download_csv('<%= HttpUtility.JavaScriptStringEncode(csvExport)%>')">Download CSV</button> 

Примечание: csvExport является публично объявленной C# переменной из код позади этого заполняется данными, разделенными запятыми, при загрузке страницы - используя C# для обработки форматирования данных и т. д. c.

И эта Javascript функция для создания экземпляра скрытого элемента и связывания тип href, цель и имя файла, а затем запустите событие click, тем самым запустив экспорт / загрузку.

function download_csv(priceExport) {
  console.log(priceExport);
  var hiddenElement = document.createElement('a');
  hiddenElement.href = 'data:text/csv;charset=utf-8,' + encodeURI(priceExport);
  hiddenElement.target = '_blank';
  hiddenElement.download = 'pricing.csv';
  hiddenElement.click();
} 

Протестировано с Chrome и работает как чемпион. Не работает с IE, но сейчас я не слишком обеспокоен этим.

1 голос
/ 10 февраля 2020

Я бы использовал csvHelper. Это удобная библиотека. Он существует с 2009 года, поэтому я полагаю, что ваше приложение не слишком старое, чтобы извлечь выгоду из этой библиотеки. Ниже приведен базовый c пример перехода от List к CSV.

Ошибка, которую вы получаете, состоит в том, что то, что не должно быть NULL, действительно NULL. Запустите его в visual studio и позвольте ему выбросить исключение. Go через отладчик и найдите значение NULL, затем go через логи c и выясните, почему ему не присвоено значение.

void Export()
{
    using (var stream = new MemoryStream())
    using (var reader = new StreamReader(stream))
    using (var writer = new StreamWriter(stream))
    using (var csv = new CsvWriter(writer))
    {

        foreach (var item in MasterList)
        {
            foreach (var field in item)
            {
                csv.WriteField(field);
            }
            csv.NextRecord();
        }
        writer.Flush();
        stream.Position = 0;

        reader.ReadToEnd().Dump();
    }
}
...