Загруженный файл Excel с макросами поврежден через ajax MVC - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь загрузить файл Excel из вызова MVC Ajax, но каждый раз, когда он загружается, я не могу открыть файл, потому что он говорит, что он поврежден.

Вот мой Ajax-вызов:

function Download() {
$.ajax({
    url: '/Home/ExcelDownload',
    type: "POST",
    success: function (result) {            

        if (result !== null || result !== "") {
            $('<iframe src=' + result + ' frameborder="0" scrolling="no" id="myFrame"></iframe>')
                .appendTo('body');
        }
        //var iframe = document.getElementById('invisible');
        //iframe.src = result;
    },
    error: function (data) {

    }
});}

Из моего контроллера я вызываю метод действия так:

string host = Request.Url.Authority;
        return Json("http://" + host + "/ExcelTemplates/EInvoiceTemplateNew.xlsm");

У меня также включены макросы в Excel.

Файл загружается правильно, но когда я пытаюсь открыть его, он выдает предупреждение о том, что он из надежного источника, и при нажатии «Да» я получаю другое диалоговое окно, в котором говорится: «Книга не может быть открыта или отремонтирована Microsoft Excel, потому что она поврежден ".

Любая помощь или предложения или обходные пути, чтобы мой код работал.

Заранее спасибо !!! ..

1 Ответ

0 голосов
/ 23 мая 2019

Я не могу сделать проект и попробовать библиотеку Excel прямо сейчас, так как я на работе, поэтому я просто делаю это очень быстро.

Для начала, я думаю, вы можете получитьот использования ajax полностью.Что всегда хорошо, потому что кода меньше для поддержки, вы можете использовать обычный тег привязки:

<a href="@Url.Action("GetExcelDocument", "MyController", new {id = Model.ExcelFileId})">Download</a>

Это не будет перенаправлять страницу, потому что браузер должен интерпретировать тип content-disposition / Mime, ипросто скачайте файл.

Затем вы можете попытаться вернуть файл следующим образом, где вы сначала читаете файл (в данном случае в stream, но вы можете сделать это как byte[], а такжеFile имеет перегрузку для него), а затем верните его через контроллер, используя File и FileResult.

Например:

public FileResult GetExcelDocument(int id)
{
    string filePath = GetPathToDocumentWithId(id); //However you get the excel file path
    return File(System.IO.File.OpenRead(filePath), 
                System.Web.MimeMapping.GetMimeMapping(filePath),
                "filename.xlsm");

}

This веб-сайт сообщает, что тип содержимого / MIME для .xlsm - это "application / vnd.ms-excel.sheet.macroEnabled.12", но я думаю, что GetMimeMapping должно работать.

При желании, если вы хотитеДля загрузки файла в новой вкладке вы можете установить target тега привязки на «_blank», и он должен открыть новую вкладку и загрузить туда файл.

Дайте мне знать, каков результат.

Если вы используете JQuery и ajax, я нашел следующий примервдоль вашей предыдущей попытки:

С Здесь

var $idown;  // Keep it outside of the function, so it's initialized once.
downloadURL : function(url) {
  if ($idown) {
    $idown.attr('src',url);
  } else {
    $idown = $('<iframe>', { id:'idown', src:url }).hide().appendTo('body');
  }
},
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...