Метод сохранения GemBox.Spreadsheet ничего не делает и ошибок нет

Я пытался использовать Gembox для экспорта некоторой информации из моего веб-приложения в электронную таблицу Excel.

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

private void SaveExcelFile(ExcelDataModel excelDataModel)
    {            
        var workbook = new ExcelFile();
        ExcelWorksheet employeesWorksheet = workbook.Worksheets.Add("Employees");
        ExcelWorksheet contractsWorksheet = workbook.Worksheets.Add("Contracts");

        employeesWorksheet.Cells["A1"].Value = "Employees:";
        employeesWorksheet.InsertDataTable(excelDataModel.EmployeeDatatable,
            new InsertDataTableOptions
            {
                ColumnHeaders = true,
                StartRow = 3
            });

        contractsWorksheet.Cells["A1"].Value = "Contracts:";
        contractsWorksheet.InsertDataTable(excelDataModel.ContractDatatable,
            new InsertDataTableOptions
            {
                ColumnHeaders = true,
                StartRow = 3
            });

        workbook.Save("Employees.xls");
    }

Передаваемая модель просто содержит две таблицы данных:

    public class ExcelDataModel
{
    public DataTable EmployeeDatatable { get; set; }
    public DataTable ContractDatatable { get; set; }

}

Я вызываю свой метод SaveExcelFile из:

public async Task<ActionResult> ExportEmployees()
    {
        SpreadsheetInfo.SetLicense(ConfigurationManager.AppSettings["GemBoxSpreadsheetSerialKey"]);

        var response = await **I have removed the call/url but this just calls a controller method on the api**;
        if (response.IsSuccessStatusCode)
        {
            var data = response.Content.ReadAsStringAsync().Result;
            var model = JsonConvert.DeserializeObject<ExcelDataModel>(data);

            SaveExcelFile(model);
            return Json(new { success = true, message = "Successfully exported employees" }, JsonRequestBehavior.AllowGet);
        }

        return Json(new { success = false, message = "Failed to export employees to excel" }, JsonRequestBehavior.AllowGet);
    }

Передаваемая модель выглядит нормально, в ней есть таблицы данных, заполненные правильными данными.


person Kiwi    schedule 12.11.2020    source источник


Ответы (1)


Метод workbook.Save("Employees.xls") сохранит файл по указанному пути, а в случае относительного пути (например, того, что у вас там есть), он будет сохранен относительно текущего рабочего каталога.

Чтобы загрузить файл, вам нужно использовать FileResult вместо JsonResult, как показано в пример ASP.NET Core.

// Changed "void" to "MemoryStream" and added "SaveOptions".
private MemoryStream SaveExcelFile(ExcelDataModel excelDataModel, SaveOptions options)
{
    // ...

    // Changed saving from path to stream.
    var stream = new MemoryStream();
    workbook.Save(stream, options);
    return stream;
}

public async Task<ActionResult> ExportEmployees()
{
    // ...

    if (response.IsSuccessStatusCode)
    {
        var data = response.Content.ReadAsStringAsync().Result;
        var model = JsonConvert.DeserializeObject<ExcelDataModel>(data);

        // Changed "JsonResult" to "FileResult".
        var excelOptions = SaveOptions.XlsDefault;
        using (var excelStream = SaveExcelFile(model, excelOptions))
            return File(excelStream.ToArray(), excelOptions.ContentType, "Employees.xls");
    }

    return Json(new { success = false, message = "Failed to export employees to excel" }, JsonRequestBehavior.AllowGet);
}
person Mario Z    schedule 13.11.2020
comment
Спасибо большое! Это действительно помогло, теперь все работает отлично! - person Kiwi; 13.11.2020