C # Генерируемый файл Excel: недопустимый формат файла или расширение файла - PullRequest
0 голосов
/ 22 мая 2018

Я вызываю действие «Экспорт», в котором я передаю список моделей представления и определяю формат

public ActionResult DownloadTokenlist(string startDate = null, string endDate = null)
            {        
                using (HRCTSStatisticDb db = new HRCTSStatisticDb(Setting.ClientId))
                {    
                    List<TokenExportViewModel> tokenExportViewModels = new List<TokenExportViewModel>();

                    Response.AddHeader("content-disposition", $"attachment;filename=Tokenlist_{DateTime.Now.ToString("dd.MM.yyyy")}.xlsx");
                    log.InfoFormat($"The {new HomeController().UserRole(Context.LoggedInUser)}: {Context.LoggedInUser} has used the exceldownload");

                    return File(new ExcelExport().Export(tokenExportViewModels), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
                }
            }

Действие, которое я вызываю (ExcelEngine от Syncfusion):

public MemoryStream Export(List<TokenExportViewModel> list)
    {
        MemoryStream stream = new MemoryStream();
        using (ExcelEngine excelEngine = new ExcelEngine())
        {
            IApplication application = excelEngine.Excel;
            application.DefaultVersion = ExcelVersion.Excel2010;
            IWorkbook workbook = application.Workbooks.Create(1);
            IWorksheet worksheet = workbook.Worksheets.Create("Tokenlist");

            IStyle defaultStyle = workbook.Styles.Add("default");
            defaultStyle.Font.Size = 12;

            worksheet.SetDefaultColumnStyle(1, 20, defaultStyle);
            worksheet.SetDefaultRowStyle(1, 300, defaultStyle);

            worksheet.UsedRange.AutofitColumns();
            worksheet.Range["A1"].Text = $"Tokenlist - {DateTime.Today.ToString("dd.MM.yyyy")}";
            worksheet.Range["A1"].CellStyle = h1Style;
            workbook.SaveAs(stream);
            workbook.Close();
        }
        return stream;
    }

Я только опубликовал код, который влияет на файл и (возможно) может создать ошибку.Нет ошибки, пока я не открою файл, появится это исключение:

Excel не может открыть файл 'Tokenlist_22.05.2018.xlsx', так как формат файла или расширение файла недопустимы.Убедитесь, что файл не был поврежден и что расширение файла соответствует формату файла.

Я пытался изменить формат файла на .xls и .vbs, но ни один из них не работает.С помощью .xls я могу открыть документ, но тогда в нем нет данных.

.close () не сильно меняется, он просто закрывает ранее открытый поток вывода.

Ответы [ 2 ]

0 голосов
/ 22 июня 2018

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

Пример кода:

            workbook.SaveAs(stream);
            workbook.Close();
            stream.Position = 0;

Мы также поделились простым примером для вашей справки, который можно скачать по следующей ссылке.

Пример ссылки: http://www.syncfusion.com/downloads/support/directtrac/general/ze/Sample1020485770.zip

Я работаю в Syncfusion.

0 голосов
/ 22 мая 2018

Используйте FileContentResult Перегрузка , где вы можете указать fileDownloadName следующим образом:

return File(excelExport.Export(tokenExportViewModels).ToArray(),"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $"Tokenlist_{DateTime.Now.ToString("dd.MM.yyyy")}.xlsx");

И использовать расширение потока ToArray() для возвратаbyte[].

(я полагаю, ваш метод Export создает действительный документ)

...