【问题标题】:GemBox.Spreadsheet Save method is not doing anything and no errorsGemBox.Spreadsheet Save 方法没有做任何事情并且没有错误
【发布时间】:2021-02-24 09:09:40
【问题描述】:

我一直在尝试使用 Gembox 将一些信息从我的 Web 应用程序导出到 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");
    }

传入的模型只包含两个DataTable:

    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);
    }

传入的模型看起来不错,它的数据表中填充了正确的数据。

【问题讨论】:

    标签: c# web save downloadfile gembox-spreadsheet


    【解决方案1】:

    workbook.Save("Employees.xls") 方法会将文件保存到指定的路径,如果是相对路径(如您所拥有的),它将相对于当前工作目录保存。

    要下载文件你需要使用FileResult而不是JsonResult,如ASP.NET Core example所示。

    // 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);
    }
    

    【讨论】:

    • 非常感谢!这真的很有帮助,它现在工作得很好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 2016-10-02
    • 2013-09-28
    相关资源
    最近更新 更多