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工作