c# API 导出 Excel (ClosedXML) 并在 Angular 中下载 6
c# API Export Excel (ClosedXML) and Download in Angular 6
我制作了一个从 Angular 到 C# Api 的 post 并成功通过并使用 (ClosedXML) 安装了一个 Excel。
我可以根据需要格式化并保存我完成的 Excel 文件的文件夹。但是我需要 return 这个 Excel 到 Angular 作为二进制文件或类似于页面中 Angular 6 按钮中的下载事件。
我知道错误出现在最后几行代码中,因为我已经知道了,如果我愿意,我可以在本地保存我的 excel 文件,
C#结束API方法:
[HttpPost]
[Route("api/qqq/generateExcel")]
public Task<HttpResponseMessage> Post(List<MyObject> list)
{
...
var localWb = new XLWorkbook();
localWb = arquivo.GerarExcel(listaRegras);
//----------------------
var filePath = "C:\Users\folder";
var fileName = "Export.xlsx";
using (MemoryStream ms = new MemoryStream())
{
localWb.SaveAs(ms);
using (FileStream file = new FileStream(filePath + "\Export.xlsx", FileMode.Open, FileAccess.Read))
{
HttpResponseMessage httpResponseMessage = new HttpResponseMessage();
httpResponseMessage.Content = new ByteArrayContent(ms.GetBuffer());
httpResponseMessage.Content.Headers.Add("x-filename", fileName);
httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
httpResponseMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
httpResponseMessage.Content.Headers.ContentDisposition.FileName = fileName;
httpResponseMessage.Content.Headers.ContentLength = file.Length;
httpResponseMessage.StatusCode = HttpStatusCode.OK;
// return httpResponseMessage;
return CreateResponse(HttpStatusCode.OK, httpResponseMessage);
}
}
我的 angular 服务:
gerarExcel(listaXYZ) {
return this.http.post(this.apiUrl, listaXYZ);
}
** 组件**
exportToExcel(event): void {
let lista= this.regras;
let configs = '{ "config1": "valorConfig1", "config2": "valorConfig2" }';
console.log(listaXYZ);
//console.log(lista.length);
if (lista != null) {
this.myservice
.gerarExcel(listaXYZ)
.subscribe(data => {
this.downloadFile(data)
console.log(<any>data);
},
(error: HttpErrorResponse) => {
...
},
() => {
...
}
);
}
else {
...
}
downloadFile(data: IDownloadArquivo) {
var url = window.URL.createObjectURL(data.blob);
let a = document.createElement("a");
document.body.appendChild(a);
a.style.display = "none";
a.href = url;
a.target = "_blank";
a.download = data.fileName;
a.click();
a.remove();
}
怎么办啊,不开心???
经过大量研究但没有答案,我找到了解决方案。
我将 CloseXML 更改为 OfficeOpenXml,因为最后一个可以使用 Content = new ByteArrayContent(p)(见上文 API 方法)[=14= 很容易地插入响应内容]
太棒了,因为OfficeOpenXml可以随心所欲地制作出时尚的工作簿!!!
C#结束API方法:
return 必须是
public HttpResponseMessage(没有TASK)
public HttpResponseMessage GenerateMyExcel(List<someModel> mylist)
{
...
return httpResponseMessage;
...}
示例:
[HttpPost]
[Route("api/someModel/generateMyExcel")]
public HttpResponseMessage GenerateMyExcel(List<someModel> mylist)
{
var listSomeModelJson = JsonConvert.SerializeObject(mylist);
var MyExcelObjectToMakeAWorkbook = new MyExcelObjectToMakeAWorkbook();
using (var package = MyExcelObjectToMakeAWorkbook .GenerateAnWorkbook(mylist)
{
var p = package.GetAsByteArray();
HttpResponseMessage httpResponseMessage = new HttpResponseMessage();
httpResponseMessage = new HttpResponseMessage
{
StatusCode = HttpStatusCode.OK,
Content = new ByteArrayContent(p)
};
httpResponseMessage.Content.Headers.Add("x-filename", "name.xlsx");
//.XLSX
httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
httpResponseMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
httpResponseMessage.Content.Headers.ContentDisposition.FileName = "nome.xlsx";
httpResponseMessage.Content.Headers.ContentLength = p.Length;
httpResponseMessage.StatusCode = HttpStatusCode.OK;
return httpResponseMessage;
}
}
组件
...
this.myModelService
.generateExcelByPost(this.MyObjectList)
.subscribe(
(data) => {
var file = new Blob([data], { type: 'application/vnd.ms-excel' });
var fileURL = URL.createObjectURL(file);
let a = document.createElement("a");
document.body.appendChild(a);
a.style.display = "none";
a.href = fileURL;
a.target = "_blank";
a.download = "ListOfSomeModel.xlsx";
a.click();
a.remove();
}
)
...
服务
generateExcelByPost(list: any) {
let headers = new HttpHeaders();
headers.set('Content-Type', 'application/json');
return this.http.post(API_Url,list,
{
headers: headers,
responseType: "arraybuffer"
}
)
}
我制作了一个从 Angular 到 C# Api 的 post 并成功通过并使用 (ClosedXML) 安装了一个 Excel。
我可以根据需要格式化并保存我完成的 Excel 文件的文件夹。但是我需要 return 这个 Excel 到 Angular 作为二进制文件或类似于页面中 Angular 6 按钮中的下载事件。
我知道错误出现在最后几行代码中,因为我已经知道了,如果我愿意,我可以在本地保存我的 excel 文件,
C#结束API方法:
[HttpPost]
[Route("api/qqq/generateExcel")]
public Task<HttpResponseMessage> Post(List<MyObject> list)
{
...
var localWb = new XLWorkbook();
localWb = arquivo.GerarExcel(listaRegras);
//----------------------
var filePath = "C:\Users\folder";
var fileName = "Export.xlsx";
using (MemoryStream ms = new MemoryStream())
{
localWb.SaveAs(ms);
using (FileStream file = new FileStream(filePath + "\Export.xlsx", FileMode.Open, FileAccess.Read))
{
HttpResponseMessage httpResponseMessage = new HttpResponseMessage();
httpResponseMessage.Content = new ByteArrayContent(ms.GetBuffer());
httpResponseMessage.Content.Headers.Add("x-filename", fileName);
httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
httpResponseMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
httpResponseMessage.Content.Headers.ContentDisposition.FileName = fileName;
httpResponseMessage.Content.Headers.ContentLength = file.Length;
httpResponseMessage.StatusCode = HttpStatusCode.OK;
// return httpResponseMessage;
return CreateResponse(HttpStatusCode.OK, httpResponseMessage);
}
}
我的 angular 服务:
gerarExcel(listaXYZ) {
return this.http.post(this.apiUrl, listaXYZ);
}
** 组件**
exportToExcel(event): void {
let lista= this.regras;
let configs = '{ "config1": "valorConfig1", "config2": "valorConfig2" }';
console.log(listaXYZ);
//console.log(lista.length);
if (lista != null) {
this.myservice
.gerarExcel(listaXYZ)
.subscribe(data => {
this.downloadFile(data)
console.log(<any>data);
},
(error: HttpErrorResponse) => {
...
},
() => {
...
}
);
}
else {
...
}
downloadFile(data: IDownloadArquivo) {
var url = window.URL.createObjectURL(data.blob);
let a = document.createElement("a");
document.body.appendChild(a);
a.style.display = "none";
a.href = url;
a.target = "_blank";
a.download = data.fileName;
a.click();
a.remove();
}
怎么办啊,不开心???
经过大量研究但没有答案,我找到了解决方案。 我将 CloseXML 更改为 OfficeOpenXml,因为最后一个可以使用 Content = new ByteArrayContent(p)(见上文 API 方法)[=14= 很容易地插入响应内容]
太棒了,因为OfficeOpenXml可以随心所欲地制作出时尚的工作簿!!!
C#结束API方法: return 必须是 public HttpResponseMessage(没有TASK)
public HttpResponseMessage GenerateMyExcel(List<someModel> mylist)
{
...
return httpResponseMessage;
...}
示例:
[HttpPost]
[Route("api/someModel/generateMyExcel")]
public HttpResponseMessage GenerateMyExcel(List<someModel> mylist)
{
var listSomeModelJson = JsonConvert.SerializeObject(mylist);
var MyExcelObjectToMakeAWorkbook = new MyExcelObjectToMakeAWorkbook();
using (var package = MyExcelObjectToMakeAWorkbook .GenerateAnWorkbook(mylist)
{
var p = package.GetAsByteArray();
HttpResponseMessage httpResponseMessage = new HttpResponseMessage();
httpResponseMessage = new HttpResponseMessage
{
StatusCode = HttpStatusCode.OK,
Content = new ByteArrayContent(p)
};
httpResponseMessage.Content.Headers.Add("x-filename", "name.xlsx");
//.XLSX
httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
httpResponseMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
httpResponseMessage.Content.Headers.ContentDisposition.FileName = "nome.xlsx";
httpResponseMessage.Content.Headers.ContentLength = p.Length;
httpResponseMessage.StatusCode = HttpStatusCode.OK;
return httpResponseMessage;
}
}
组件
...
this.myModelService
.generateExcelByPost(this.MyObjectList)
.subscribe(
(data) => {
var file = new Blob([data], { type: 'application/vnd.ms-excel' });
var fileURL = URL.createObjectURL(file);
let a = document.createElement("a");
document.body.appendChild(a);
a.style.display = "none";
a.href = fileURL;
a.target = "_blank";
a.download = "ListOfSomeModel.xlsx";
a.click();
a.remove();
}
)
...
服务
generateExcelByPost(list: any) {
let headers = new HttpHeaders();
headers.set('Content-Type', 'application/json');
return this.http.post(API_Url,list,
{
headers: headers,
responseType: "arraybuffer"
}
)
}