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

我使用Aspose.Cells来创buildexcel文件。

其实我试图保存磁盘上的xls文件,我无法解决这个问题。 这是我的get方法。

[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 } } 

另外我有一个叫onClick的函数

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

当有人点击它应该保存在他的磁盘上的文件(或打开浏览器,我可以select的地方和名称)。 如何解决这个问题?

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

如果您启用了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 */ } 

对于Javascript方面 – 这里的答案可能会有所帮助。 (注意:确保将方法设置为POST,或将我的示例更改为GET。)

在ASP.NET中,可以通过以下代码将XLS或XLSX文件发送到浏览器。

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

上面的代码会将XLS文件发送到浏览器。 如果你改变这一行

 if (yourFileFormat == "XLS") 

类似的东西

 if (yourFileFormat == "XLSX") 

那么它会发送XLSX文件到浏览器。 请从以下链接下载ASP.NET Web应用程序项目 ,以查看上面的代码正在运行。

项目链接:

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

请不要使用Workbook.SaveToStream()方法来获取内存stream对象。 请检查以下代码,了解如何获取XLS,XLSX等不同格式的内存stream对象。

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

注意:我在Aspose作为Developer Evangelist工作