最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Angular Excel 導(dǎo)入與導(dǎo)出的實(shí)現(xiàn)代碼

 更新時(shí)間:2019年04月17日 15:13:52   作者:ValueMar  
這篇文章主要介紹了Angular Excel 導(dǎo)入與導(dǎo)出的實(shí)現(xiàn)代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

前言

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

雖然代碼是基于angular 7.2.7,但是語法是基于 angular 4.X 以上均可使用 。在項(xiàng)目開發(fā)過程中,我們經(jīng)常需要跟后端進(jìn)行文件交互,常見的諸如 圖片上傳,excel 導(dǎo)入與導(dǎo)出等。這里我們只討論關(guān)于excel 的導(dǎo)入與導(dǎo)出。

Excel 導(dǎo)入

excel 導(dǎo)入在angular 中其實(shí)非常簡(jiǎn)單,只需要安裝 xlsx插件 就可以了。

安裝 xlsx 插件

npm install xlsx --save

在component 中導(dǎo)入

import * as XLSX from 'xlsx';

關(guān)鍵代碼

import * as XLSX from 'xlsx';

excelData = [];

importExcel(evt: any) {
  /* wire up file reader */
  const target: DataTransfer = <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 導(dǎo)出

傳統(tǒng)的導(dǎo)出功能我們一般是放在后端實(shí)現(xiàn),由后端生成文件的Url或者文件流給到前端。注:這種是通過瀏覽器的下載功能直接下載的。一般有以下幾種方式實(shí)現(xiàn):

get 請(qǐng)求 + window.open(url)

后端返回一個(gè) 文件的url 或者 文件流,這種方式均可以直接下載。 前提是http請(qǐng)求為get 。

post 請(qǐng)求 + <a>標(biāo)簽

前端代碼:

exportExcel(codeList: string[]) {
  return this.http.post(this.ExportExcelByCodesUrl, codeList, {
   responseType: 'arraybuffer',//設(shè)置響應(yīng)類型
   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); //創(chuàng)建下載的鏈接
   downloadElement.href = href;
   let filename = data.headers.get("Download-FileName");//后端返回的自定義header
   downloadElement.download = decodeURI(filename); 

   document.body.appendChild(downloadElement);
   downloadElement.click(); //點(diǎn)擊下載
   document.body.removeChild(downloadElement); //下載完成移除元素
   window.URL.revokeObjectURL(href); //釋放掉blob對(duì)象
 }

后端代碼:

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

public IActionResult CreateExcel(string fileName,List<ExportProductModel> list)
 {
  string[] propertyNames = {""};//業(yè)務(wù)代碼
  string[] propertyNameCn = {""};//業(yè)務(wù)代碼
  MemoryStream ms = ExcelsHelper<ExportProductModel>.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"); 

                   });
         });

后端代碼

這里關(guān)鍵點(diǎn)是需要設(shè)置跨域的響應(yīng)頭(也就是“Download-FileName”),具體每個(gè)語言有自己的實(shí)現(xiàn)方式。如果不設(shè)置的話,前端無法獲取響應(yīng)頭。

post 請(qǐng)求 + form 表單 + iframe 標(biāo)簽(暫無代碼實(shí)現(xiàn))

總結(jié)

我在開發(fā)過程中有遇到以下幾個(gè)問題,折騰了很久:

  • 前后端的MIME類型沒有對(duì)應(yīng),導(dǎo)致文件無法成功下載,這里是完整的MIME類型列表
  • 無法獲取response header,原因有二:

(1)后端沒有設(shè)置跨域的響應(yīng)頭

(2)前端的http請(qǐng)求 語法書寫錯(cuò)誤,一直獲取到的是http response body,而非完整的http response。完整寫法參考以上代碼,關(guān)鍵是 : observe:"response"

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Ubuntu安裝angular-cli遇到的坑

    詳解Ubuntu安裝angular-cli遇到的坑

    這篇文章主要介紹了詳解Ubuntu安裝angular-cli遇到的坑,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-09-09
  • 掌握Queries設(shè)計(jì)模式優(yōu)化Angular應(yīng)用開發(fā)技巧

    掌握Queries設(shè)計(jì)模式優(yōu)化Angular應(yīng)用開發(fā)技巧

    這篇文章主要介紹了掌握Queries設(shè)計(jì)模式優(yōu)化Angular應(yīng)用開發(fā)的技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • angularjs自定義ng-model標(biāo)簽的屬性

    angularjs自定義ng-model標(biāo)簽的屬性

    這篇文章主要介紹了angularjs自定義ng-model標(biāo)簽的屬性的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • 詳解AngularJS中的filter過濾器用法

    詳解AngularJS中的filter過濾器用法

    這篇文章主要介紹了AngularJS中的filter過濾器用法,包括其在模版中和在controller以及service的常見應(yīng)用場(chǎng)合,需要的朋友可以參考下
    2016-01-01
  • 對(duì)angularJs中自定義指令replace的屬性詳解

    對(duì)angularJs中自定義指令replace的屬性詳解

    今天小編就為大家分享一篇對(duì)angularJs中自定義指令replace的屬性詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • 詳解Angular開發(fā)中的登陸與身份驗(yàn)證

    詳解Angular開發(fā)中的登陸與身份驗(yàn)證

    Angular是Google開發(fā)的一款瀏覽器端的高人氣JavaScript框架,Angular 經(jīng)常會(huì)被用到后臺(tái)和管理工具的開發(fā),這兩類都會(huì)需要對(duì)用戶進(jìn)行鑒權(quán)。而鑒權(quán)的第一步,就是進(jìn)行身份驗(yàn)證。本文詳細(xì)介紹了Angular開發(fā)中的登陸與身份驗(yàn)證。
    2016-07-07
  • Angular實(shí)現(xiàn)下載安裝包的功能代碼分享

    Angular實(shí)現(xiàn)下載安裝包的功能代碼分享

    本文通過實(shí)例代碼給大家介紹了angular實(shí)現(xiàn)下載安裝包的功能以及基于angularjs代碼實(shí)現(xiàn)錨點(diǎn)跳轉(zhuǎn)的功能,需要的朋友參考下吧
    2017-09-09
  • 詳解angular部署到iis出現(xiàn)404解決方案

    詳解angular部署到iis出現(xiàn)404解決方案

    這篇文章主要介紹了詳解angular部署到iis出現(xiàn)404解決方案,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • Angular項(xiàng)目從新建、打包到nginx部署全過程記錄

    Angular項(xiàng)目從新建、打包到nginx部署全過程記錄

    一直比較喜歡angular,正巧最近有個(gè)項(xiàng)目用到了,所以想和大家來分享下,下面這篇文章主要給大家介紹了關(guān)于Angular項(xiàng)目從新建、打包到nginx部署的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-12-12
  • 詳解Angular 中 ngOnInit 和 constructor 使用場(chǎng)景

    詳解Angular 中 ngOnInit 和 constructor 使用場(chǎng)景

    最初學(xué)習(xí)Angular的時(shí)候總是搞不清楚ngOnInit和constructor的區(qū)別,現(xiàn)在我們來稍微理一下兩者之間的區(qū)別。
    2017-06-06

最新評(píng)論

茶陵县| 垫江县| 卢龙县| 鄂尔多斯市| 达拉特旗| 庆云县| 健康| 北京市| 读书| 南通市| 鹤壁市| 临邑县| 闽清县| 北川| 高台县| 封开县| 开江县| 固原市| 石渠县| 邹平县| 纳雍县| 鲁甸县| 哈尔滨市| 呼玛县| 全州县| 丽水市| 盈江县| 呼玛县| 临清市| 富源县| 永靖县| 孝义市| 公安县| 昌黎县| 满洲里市| 利辛县| 天门市| 富川| 杭锦后旗| 栖霞市| 肇东市|