博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Angular Excel 导入与导出
阅读量:6216 次
发布时间:2019-06-21

本文共 3780 字,大约阅读时间需要 12 分钟。

前言

本文基于 angular v7.2.7,初次编写于2019-4-17。

虽然代码是基于angular 7.2.7,但是语法是基于 angular 4.X 以上均可使用。在项目开发过程中,我们经常需要跟后端进行文件交互,常见的诸如 图片上传,excel 导入与导出等。这里我们只讨论关于excel 的导入与导出。

Excel 导入

excel 导入在angular 中其实非常简单,只需要安装 xlsx插件 就可以了。

  • 安装 xlsx 插件

npm install xlsx --save

  • 在component 中导入

import * as XLSX from 'xlsx';

  • 关键代码
import * as XLSX from 'xlsx';excelData = [];importExcel(evt: any) {    /* wire up file reader */    const target: DataTransfer = 
(evt.target); if (target.files.length !== 1) throw new Error('Cannot use multiple files'); const reader: FileReader = new FileReader(); reader.onload = (e: any) => { /* read workbook */ const bstr: string = e.target.result; const wb: XLSX.WorkBook = XLSX.read(bstr, { type: 'binary' }); /* grab first sheet */ const wsname: string = wb.SheetNames[0]; const ws: XLSX.WorkSheet = wb.Sheets[wsname]; /* save data */ this.excelData = (XLSX.utils.sheet_to_json(ws, { header: 1 })); evt.target.value = "" // 清空 }; reader.readAsBinaryString(target.files[0]); }复制代码

Excel 导出

传统的导出功能我们一般是放在后端实现,由后端生成文件的Url或者文件流给到前端。注:这种是通过浏览器的下载功能直接下载的。一般有以下几种方式实现:

  • get 请求 + window.open(url)

后端返回一个 文件的url 或者 文件流,这种方式均可以直接下载。前提是http请求为get

  • post 请求 + <a>标签

前端代码:

exportExcel(codeList: string[]) {    return this.http.post(this.ExportExcelByCodesUrl, codeList, {      responseType: 'arraybuffer',//设置响应类型      observe:"response",//返回response header      headers: { 'Content-Type': 'application/json' }    })      .subscribe((response:any)=>{        this.downLoadFile(response, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8")      })  } /**   * Method is use to download file.   * @param data - Array Buffer data   * @param type - type of the document. */downLoadFile(data: any, type: string) {     var blob = new Blob([data.body], { type: type});     let downloadElement = document.createElement('a');     let href = window.URL.createObjectURL(blob); //创建下载的链接     downloadElement.href = href;     let filename = data.headers.get("Download-FileName");//后端返回的自定义header     downloadElement.download = decodeURI(filename);      document.body.appendChild(downloadElement);     downloadElement.click(); //点击下载     document.body.removeChild(downloadElement); //下载完成移除元素     window.URL.revokeObjectURL(href); //释放掉blob对象  }复制代码

后端代码:

这里后端是使用的Asp.Net Core 2.1

public IActionResult CreateExcel(string fileName,List
list) { string[] propertyNames = {
""};//业务代码 string[] propertyNameCn = {
""};//业务代码 MemoryStream ms = ExcelsHelper
.ListToExcel(fileName, list, propertyNames, propertyNameCn); HttpContext.Response.Headers.Add("Download-FileName",WebUtility.UrlEncode(fileName)); return File(ms, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;", WebUtility.UrlEncode(fileName)); }services.AddCors(options => { options.AddPolicy("AllowAllOrigin", builder => { builder.AllowAnyHeader() .AllowAnyMethod() .AllowAnyOrigin() .AllowCredentials() .WithExposedHeaders("Download-FileName"); }); });复制代码

后端代码这里关键点是需要设置跨域的响应头(也就是“Download-FileName”),具体每个语言有自己的实现方式。如果不设置的话,前端无法获取响应头。

  • post 请求 + form 表单 + iframe 标签(暂无代码实现)

总结

我在开发过程中有遇到以下几个问题,折腾了很久:

  • 前后端的MIME类型没有对应,导致文件无法成功下载,这里是
  • 无法获取response header,原因有二:

(1)后端没有设置跨域的响应头

(2)前端的http请求 语法书写错误,一直获取到的是http response body,而非完整的http response。完整写法参考以上代码,关键是 : observe:"response"

最后,希望这篇文章能够帮助到你,共勉!

转载地址:http://ncvja.baihongyu.com/

你可能感兴趣的文章
MapGuide Tips----如何在MapGuide Fusion Viewer里设置搜索选中地物时的Scale?
查看>>
do_exit【转】
查看>>
Java生成某段时间内的随机时间
查看>>
GNU make manual 翻译(十三)
查看>>
Android -- onMeasure
查看>>
ElasticSearch vs Solr多维度分析对比
查看>>
Metasploit的三种启动方式
查看>>
[EntLib]微软企业库5.0 学习之路——第六步、使用Validation模块进行服务器端数据验证...
查看>>
【转】c++中引用的全方位解读
查看>>
MapGuide Maestro 5.1发布了
查看>>
C#中string与byte[]的转换帮助类
查看>>
海量数据面试题
查看>>
XMOVE3.0手持终端——软件介绍(一):精简型嵌入式管理系统的菜单实现和任务切换...
查看>>
iOS:实现图片的无限轮播(二)---之使用第三方库SDCycleScrollView
查看>>
Linux 僵尸进程
查看>>
ASP.NET Core 异常重试组件 Polly
查看>>
RabbitMQ~广播消息
查看>>
未能加载文件或程序集 ICSharpCode.SharpZipLib
查看>>
shellKali Linux Web 渗透测试— 初级教程(第三课)
查看>>
Examples of GoF Design Patterns(GOF提及的设计模式在java中的例子)
查看>>