Скачиваем файл excel в asp.net mvc
То, что я пытаюсь реализовать, - это дать пользователям возможность экспортировать данные сетки в файл Excel и загрузить их с помощью диалогового окна сохранения файла.
Вот как я кодировал это прямо сейчас -
В JavaScript -
$.post("/irn/Identifier/Download", { "columnValues": columnValues });
В Идентификаторе контроллеров Скачать действие -
public FileResult Download(string columnValues)
{
DTData headlineRows = (DTData)Newtonsoft.Json.JsonConvert.DeserializeObject(columnValues, typeof(DTData));
var e = new Services.DownloadToExcel();
return File(e.WriteData(headlineRows), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "testfile.xlsx");
}
В классе DownloadToExcel внутри функции WriteData у меня есть -
//Here, I'm using the EPPlus library to write the column data to an excel file and then i'm returning the data as a byte array -
//Some code that writes the data
return packages.GetAsByteArray();
Когда я запускаю этот код, я ожидаю увидеть диалог сохранения файла в браузере, но ничего не происходит. Нет ошибок на стороне C# или JavaScript. Может кто-нибудь сказать мне, что я могу делать неправильно?
4 ответа
Я решил это, но забыл обновить здесь -
Это сработало -
Внутри моего класса -
private const string MimeType = "application / vnd.openxmlformats-officedocument.spreadsheetml.sheet";
закрытый пакет ExcelPackage = новый ExcelPackage();
приватный FileContentResult excelFile;
Записать данные с помощью EPPlus
...
...
...
excelFile = File (package.GetAsByteArray (), MimeType, FileName);
вернуть excelFile;
Вы должны использовать IFrame, чтобы помочь загрузить файл.
function postToIframe( url,data) {
var target = "downloadIFrame";
$('<iframe name="' + target + '" style="display:none"/>').appendTo('body');
$('body').append('<form action="' + url + '" method="post" target="' + target + '" id="postToIframe"></form>');
$.each(data, function (n, v) {
$('#postToIframe').append('<textarea name="' + n + '">' + v + '</textarea>');
});
$('#postToIframe').submit().remove();
}
Немного поздно, но у меня была похожая проблема. Чтобы решить эту проблему, я использовал JSON.stringify(columnValues) на клиенте, чтобы преобразовать мои данные в строку json перед отправкой их в контроллер.
Тогда вместо использования
$.post("/irn/Identifier/Download", { "columnValues": columnValues });
пытаться
var columnValuesString = JSON.stringify(columnvalues);
window.location = '/irn/Identifier/Download?columnvalues=" + columnValuesString';
Изменение $.post() на window.location заставляет его работать.
Затем вы можете десериализовать строку json в контроллере, и ваш диалог открытия / сохранения должен появиться после нажатия на вашу ссылку.
Я надеюсь, что это помогает кому-то еще. Дайте мне знать, и я могу опубликовать свой код, если это необходимо.
Благодарю.
Если вы тестируете сайт в Internet Explorer, попробуйте следующее:
Откройте Свойства обозревателя -> Дополнительно. Нажмите Сброс. Вы также можете выбрать Восстановление дополнительных настроек.
Откройте Свойства обозревателя -> Безопасность. Если зоны вообще были изменены, нажмите "Сбросить все зоны до уровня по умолчанию".
Изменения этих параметров могут повлиять на то, принимает ли Internet Explorer возможность загрузки файлов.
Более подробная информация здесь: http://answers.microsoft.com/en-us/ie/forum/ie8-windows_other/ie-8-will-not-let-me-download-any-files-music-pdf/bc59ba24-866b-4dbf-93f2-85ebb9912c2c