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

«Необработанное исключение в строке 2371, столбец 4 в http : // локальный : 53748 / JS / ЛИЭС / JQuery -мобиля / 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();
            }
        }
1
GJGerson 10 Фев 2020 в 23:05

3 ответа

Лучший ответ

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

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

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

Примечание: csvExport является публично объявленной переменной 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
Omar 18 Фев 2020 в 09:33

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

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

1
Jonathan Wood 15 Фев 2020 в 01:56

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

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

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();
    }
}
1
Mikael 10 Фев 2020 в 20:39