简体   繁体   English

Asp.net WebApi Aspose.Cells - 导出和下载 excel

[英]Asp.net WebApi Aspose.Cells - export and download excel

I use Aspose.Cells to create excel file.我使用 Aspose.Cells 创建 excel 文件。

Actually I'm trying to save xls file on the disk and I can't resolve this problem.实际上我正在尝试将 xls 文件保存在磁盘上,但我无法解决这个问题。 This is my get method.这是我的获取方法。

[Route("xls")]
    [HttpGet]
    public HttpResponseMessage Export()
    {
        try
        {
            string dataDir = KnownFolders.GetPath(KnownFolder.Downloads);
            //var workbook = TransferService.Export();  //TODO get xml
            Workbook workbook = new Workbook();              
            var stream = workbook.SaveToStream();   

            // I need save this workbook

            return Request.CreateResponse(HttpStatusCode.OK); //it's not important here
        }
        catch (Exception ex)
        {

            return Request.CreateResponse(HttpStatusCode.InternalServerError); //it's not important here
        }
    }

Also I have function which is called onClick我还有 function 称为 onClick

function exportToXls() {
    $.get(exportURI, function (response) {
        return response;
    });
}

When someone clicks it should save the file on his disk(or open browser where I could choose the place and name).当有人点击它时,它应该将文件保存在他的磁盘上(或打开浏览器,我可以在其中选择位置和名称)。 How to solve this?如何解决这个问题?

C# C#

    [Route("xls")]
    [HttpPost] // can use Get, but Post seems to be recommended
    public HttpResponseMessage Export()
    {
        var response = new HttpResponseMessage();

        try
        {
            // Create workbook
            var wb = new Workbook();

            /* ** fill in workbook / worksheet content ** */

            // save workbook to MemoryStream
            var stream = new MemoryStream();
            wb.Save(stream, SaveFormat.Xlsx);
            stream.Position = 0;    // important!

            // add stream to response
            response.Content = new StreamContent(stream);

            // set Headers
            response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue(dispositionType: "attachment"); // or "inline"
            response.Content.Headers.ContentDisposition.FileName = wb.FileName; // or other means of getting filename
            response.Content.Headers.ContentType = new MediaTypeHeaderValue(mediaType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.Content.Headers.ContentLength = stream.Length;

            // set the success code
            response.StatusCode = HttpStatusCode.OK;
        }
        catch(Exception ex)
        {
            response.StatusCode = HttpStatusCode.InternalServerError;
            response.Content = null; // just in case
            response.ReasonPhrase = ex.Message;
        }

        return response;
    }

If you have CORS enabled, you may need to allow the Content-Disposition header: 如果启用了CORS,则可能需要允许Content-Disposition标头:

    public static void Register(HttpConfiguration config)
    {
        var cors = new EnableCorsAttribute(origins: "*", headers: "*", methods: "*");
        cors.ExposedHeaders.Add(item: "Content-Disposition");
        config.EnableCors(cors);

        /* The rest of WebAPI configuration */
    }

For the Javascript side -- the answer here may help. 对于Javascript方面- 此处的答案可能会有所帮助。 (Note: make sure you set the method to POST, or change my example to GET.) (注意:确保将方法设置为POST,或将我的示例更改为GET。)

In ASP.NET, you can send your XLS or XLSX file to browser via the following code. 在ASP.NET中,可以通过以下代码将XLS或XLSX文件发送到浏览器。

C# C#

//Save file and send to client browser using selected format
if (yourFileFormat == "XLS")
{
      workbook.Save(HttpContext.Current.Response, "output.xls", ContentDisposition.Attachment, new XlsSaveOptions(SaveFormat.Excel97To2003));

}
else
{
      workbook.Save(HttpContext.Current.Response, "output.xlsx", ContentDisposition.Attachment, new OoxmlSaveOptions(SaveFormat.Xlsx));
}

HttpContext.Current.Response.End();

The above code will send XLS file to browser. 上面的代码会将XLS文件发送到浏览器。 If you change this line 如果您更改此行

if (yourFileFormat == "XLS")

to something like

if (yourFileFormat == "XLSX")

then it will send XLSX file to browser. 然后它将XLSX文件发送到浏览器。 Please download the ASP.NET Web Application Project from the following link to see the above code running. 请从下面的链接下载ASP.NET Web应用程序项目 ,以查看上面的代码正在运行。

Project Link: 项目链接:

http://www.aspose.com/community/forums/293730/postattachment.aspx

Please do not use Workbook.SaveToStream() method to get memory stream object. 请不要使用Workbook.SaveToStream()方法获取内存流对象。 Please check the following code, how you can get memory stream object of different formats like XLS, XLSX etc. 请检查以下代码,如何获取不同格式的内存流对象,例如XLS,XLSX等。

//Create workbook object
Workbook wb = new Workbook("source.xlsx");

//This is how to save Workbook to XLS format
MemoryStream ms1 = new MemoryStream();
wb.Save(ms1, SaveFormat.Excel97To2003);

//Just to check if memory stream is good and contains XLS bytes
byte[] b1 = ms1.ToArray();
File.WriteAllBytes("output.xls", b1);

//This is how to save Workbook to XLSX format
MemoryStream ms2 = new MemoryStream();
wb.Save(ms2, SaveFormat.Xlsx);

//Just to check if memory stream is good and contains XLSX bytes
byte[] b2 = ms2.ToArray();
File.WriteAllBytes("output.xlsx", b2);

Note: I am working as Developer Evangelist at Aspose 注意:我在Aspose担任开发人员布道者

Using .net so slightly adjusted from Andews version using the File action result.使用 .net 从使用File操作结果的 Andews 版本稍微调整。

[HttpGet("download")]
    public async Task<IActionResult> DownloadSystem()
    {
        var workbook = new Workbook();
        var fileName = $"Report.xlsx";
        var cd = new System.Net.Mime.ContentDisposition
        {
            FileName = fileName,
            Inline = false, 
        };
        Response.Headers.Add("Content-Disposition", cd.ToString());
        var stream = new MemoryStream();
        workbook.Save(stream, SaveFormat.Xlsx);
        stream.Position = 0;
        return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName);
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM