亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

vue實現Excel文件的上傳與下載功能的兩種方式

2019-11-19 11:15:11
字體:
來源:轉載
供稿:網友

一.前言項目中使用到比較多的關于Excel的前端上傳與下載,整理出來,以便后續使用或分析他人。

1.前端vue:模板下載與導入Excel

導入Excel封裝了子組件,點擊導入按鈕可調用子組件,打開文件上傳的對話框,上傳成功后返回結果

<el-col style="padding: 10px 0 20px;">    <el-button     class="pull-right"     icon="el-icon-upload"     type="primary"     size="mini"     @click="importFile()"    >批量導入</el-button>    <el-button     class="pull-right right-10"     icon="el-icon-download"     type="primary"     size="mini"     @click="downloadFile('檔案模板')"    >模板下載</el-button>    <el-button     size="mini"     type="primary"     icon="el-icon-plus"     class="pull-right"     @click="addRow"    >新增</el-button>    <div class="pull-right">     <el-input      placeholder="請輸入編碼,名稱"      prefix-icon="el-icon-search"      v-model="FinQueryParams.archiveFilter"      size="mini"     ></el-input>    </div>   </el-col>   <!-- 批量導入Dialog開始 -->  <uploadTemp   :apiURL="fileUploadUrl"   ref="refFileUpload"   :Refresh="Refresh"   :OtherParams="{brandId: QueryParams.BrandID}"  ></uploadTemp>  <!-- 批量導入Dialog結束 -->importFile() {  this.$refs.refFileUpload.open(); } 

向后臺提交文件的方法

submitFile() {   const _this = this;   if (!_this.files.name) {    _this.$message.warning("請選擇要上傳的文件!");    return false;   }   let fileFormData = new FormData();   //filename是鍵,file是值,就是要傳的文件   fileFormData.append("file", _this.files, _this.files.name);   if(_this.OtherParams){    const keys=Object.keys(_this.OtherParams);    keys.forEach(e=>{     fileFormData.append(e, _this.OtherParams[e]);    })   }   let requestConfig = {    headers: {     "Content-Type": "multipart/form-data"    }   };   AjaxHelper.post(_this.apiURL, fileFormData, requestConfig)    .then(res => {     console.log(res);     if (res.success) {      const result = res.result;      if (result.errorCount == 0 && result.successCount > 0) {       _this.$message({        message: `導入成功,成功${result.successCount}條`,        type: "success"       });       _this.closeFileUpload();       _this.Refresh();      } else if (result.errorCount > 0 && result.successCount >= 0) {       _this.Refresh();       _this.tableData = result.uploadErrors;       _this.successCount = result.successCount;       _this.innerVisible = true;      } else if (result.errorCount == 0 && result.successCount == 0) {       _this.$message({        message: `上傳文件中數據為空`,        type: "error"       });      }     }    })    .catch(function(error) {     console.log(error);    });  },

這是上傳文件的調用方法。

2.模板下載

關于模板下載,之前沒有考慮到IE10瀏覽器的兼容問題,導致在IE10下文件沒法下載,后來百度后找到了解決辦法。

downloadFile(name) {   let requestConfig = {    headers: {     "Content-Type": "application/json;application/octet-stream"    }   };   AjaxHelper.post(this.downLoadUrl, requestConfig, {    responseType: "blob"   }).then(res => {    // 處理返回的文件流    const content = res.data;    const blob = new Blob([content]);    var date =     new Date().getFullYear() +     "" +     (new Date().getMonth() + 1) +     "" +     new Date().getDate();    const fileName = date + name + ".xlsx";    if ("download" in document.createElement("a")) {     // 非IE下載     const elink = document.createElement("a");     elink.download = fileName;     elink.style.display = "none";     elink.href = URL.createObjectURL(blob);     document.body.appendChild(elink);     elink.click();     URL.revokeObjectURL(elink.href); // 釋放URL 對象     document.body.removeChild(elink);    } else {     // IE10+下載     navigator.msSaveBlob(blob, fileName);    }   });  },

  前端的處理就結束了。

3.后端對于文件上傳和下載的處理

文件上傳

public UploadResult UploadFiles(IFormFile file, Guid brandId)    {      try      {        UploadResult uploadResult = new UploadResult();        if (file == null)        {          throw new UserFriendlyException(501, "上傳的文件為空,請重新上傳");        }        string filename = Path.GetFileName(file.FileName);        string fileEx = Path.GetExtension(filename);//獲取上傳文件的擴展名        string NoFileName = Path.GetFileNameWithoutExtension(filename);//獲取無擴展名的文件名        string FileType = ".xls,.xlsx";//定義上傳文件的類型字符串        if (!FileType.Contains(fileEx))        {          throw new UserFriendlyException(501, "無效的文件類型,只支持.xls和.xlsx文件");        }        //源數據        MemoryStream msSource = new MemoryStream();        file.CopyTo(msSource);        msSource.Seek(0, SeekOrigin.Begin);        DataTable sourceExcel = ReadStreamToDataTable(msSource, "", true);        //模板數據        string dataDir = _hosting.WebRootPath;//獲得當前服務器程序的運行目錄         dataDir = Path.Combine(dataDir, "ExcelTemplate");        var path = dataDir + "http://檔案模版.xlsx";        MemoryStream msModel = new MemoryStream();        FileStream stream = new FileStream(path, FileMode.Open);        stream.CopyTo(msModel);        msModel.Seek(0, SeekOrigin.Begin);        DataTable templateExcel = ReadStreamToDataTable(stream, "", true);        //驗證是否同模板相同         string columnName = templateExcel.Columns[0].ColumnName;        if (columnName != sourceExcel.Columns[0].ColumnName)        {          throw new UserFriendlyException(501, "上傳的模板文件不正確");        }        int sucessCount = 0;        int errorCount = 0;        // 處理后臺邏輯 執行 插入操作        uploadResult.SuccessCount = sucessCount;        uploadResult.ErrorCount = errorCount;        uploadResult.uploadErrors = errorList;        return uploadResult;      }      catch (Exception ex)      {        throw new UserFriendlyException(501, "上傳的模板文件不正確");      }    }

將文件流轉化為Datable

 public static DataTable ReadStreamToDataTable(Stream fileStream, string sheetName = null, bool isFirstRowColumn = true)    {      //定義要返回的datatable對象      DataTable data = new DataTable();      //excel工作表      ISheet sheet = null;      //數據開始行(排除標題行)      int startRow = 0;      try      {        //根據文件流創建excel數據結構,NPOI的工廠類WorkbookFactory會自動識別excel版本,創建出不同的excel數據結構        IWorkbook workbook = WorkbookFactory.Create(fileStream);        //如果有指定工作表名稱        if (!string.IsNullOrEmpty(sheetName))        {          sheet = workbook.GetSheet(sheetName);          //如果沒有找到指定的sheetName對應的sheet,則嘗試獲取第一個sheet          if (sheet == null)          {            sheet = workbook.GetSheetAt(0);          }        }        else        {          //如果沒有指定的sheetName,則嘗試獲取第一個sheet          sheet = workbook.GetSheetAt(0);        }        if (sheet != null)        {          IRow firstRow = sheet.GetRow(0);          //一行最后一個cell的編號 即總的列數          int cellCount = firstRow.LastCellNum;          //如果第一行是標題列名          if (isFirstRowColumn)          {            for (int i = firstRow.FirstCellNum; i < cellCount; ++i)            {              ICell cell = firstRow.GetCell(i);              if (cell != null)              {                string cellValue = cell.StringCellValue;                if (cellValue != null)                {                  DataColumn column = new DataColumn(cellValue);                  data.Columns.Add(column);                }              }            }            startRow = sheet.FirstRowNum + 1;          }          else          {            startRow = sheet.FirstRowNum;          }          //最后一列的標號          int rowCount = sheet.LastRowNum;          for (int i = startRow; i <= rowCount; ++i)          {            IRow row = sheet.GetRow(i);            if (row == null || row.FirstCellNum < 0) continue; //沒有數據的行默認是null                   DataRow dataRow = data.NewRow();            for (int j = row.FirstCellNum; j < cellCount; ++j)            {              //同理,沒有數據的單元格都默認是null              ICell cell = row.GetCell(j);              if (cell != null)              {                if (cell.CellType == CellType.Numeric)                {                  //判斷是否日期類型                  if (DateUtil.IsCellDateFormatted(cell))                  {                    dataRow[j] = row.GetCell(j).DateCellValue;                  }                  else                  {                    dataRow[j] = row.GetCell(j).ToString().Trim();                  }                }                else                {                  dataRow[j] = row.GetCell(j).ToString().Trim();                }              }            }            data.Rows.Add(dataRow);          }        }        return data;      }      catch (Exception ex)      {        throw ex;      }    }文件下載比較簡單 public async Task<FileStreamResult> DownloadFiles()    {      string dataDir = _hosting.WebRootPath;//獲得當前服務器程序的運行目錄       dataDir = Path.Combine(dataDir, "ExcelTemplate");      var path = dataDir + "http://檔案模版.xlsx";      var memoryStream = new MemoryStream();      using (var stream = new FileStream(path, FileMode.Open))      {        await stream.CopyToAsync(memoryStream);      }      memoryStream.Seek(0, SeekOrigin.Begin);      return new FileStreamResult(memoryStream, "application/octet-stream");//文件流方式,指定文件流對應的ContenType。    }

文件下載比較簡單

 public async Task<FileStreamResult> DownloadFiles()    {      string dataDir = _hosting.WebRootPath;//獲得當前服務器程序的運行目錄       dataDir = Path.Combine(dataDir, "ExcelTemplate");      var path = dataDir + "http://檔案模版.xlsx";      var memoryStream = new MemoryStream();      using (var stream = new FileStream(path, FileMode.Open))      {        await stream.CopyToAsync(memoryStream);      }      memoryStream.Seek(0, SeekOrigin.Begin);      return new FileStreamResult(memoryStream, "application/octet-stream");//文件流方式,指定文件流對應的ContenType。    }

文件上傳結果通知類

public class UploadResult  {    public int RepeatCount { get; set; }    public int SuccessCount { get; set; }    public int FileRepeatCount { get; set; }    public int ErrorCount { get; set; }    public List<UploadErrorDto> uploadErrors { get; set; }  }  public class UploadErrorDto  {    public string RowIndex { get; set; }    public string ErrorCol { get; set; }    public string ErrorData { get; set; }  } 

 通過以上處理后,我們就可以在前端實現文件的上傳了,若上傳失敗則會返回失敗結果

 以上就是整個前后端關于文件上傳與下載的實現,想通過日常記錄這種方式,來幫助自己更好的掌握基礎,穩固自己的技能

總結

以上所述是小編給大家介紹的vue實現Excel文件的上傳與下載功能的兩種方式,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲一区中文字幕在线观看| 欧美日韩在线第一页| 久久久久久久久久久91| 亚洲国产精品免费| 456国产精品| 精品综合久久久久久97| 日韩中文视频免费在线观看| 精品国内亚洲在观看18黄| 91黑丝高跟在线| 美女久久久久久久久久久| 久久精品国产精品| 日韩精品视频三区| 欧美在线视频一区| 欧美做受高潮1| 国产精品一区久久| 97婷婷大伊香蕉精品视频| 91av免费观看91av精品在线| 日韩在线中文字| 亚洲国产精品人久久电影| 色偷偷9999www| 亚洲jizzjizz日本少妇| 日韩免费精品视频| 97在线免费观看视频| 亚洲综合大片69999| 亚洲人午夜精品| 亚洲肉体裸体xxxx137| 91在线视频导航| 91性高湖久久久久久久久_久久99| 精品久久久久久久久久久| 91在线观看欧美日韩| 精品一区二区三区电影| 国产精品十八以下禁看| 久久国产精品偷| 国产高清在线不卡| 亚洲欧美一区二区三区四区| 欧美视频一区二区三区…| 91久久嫩草影院一区二区| 亚洲剧情一区二区| 97视频在线观看播放| 国产拍精品一二三| 亚洲色图第一页| 国产精品海角社区在线观看| 成人国产精品一区| 欧美一区二区三区四区在线| 欧美精品18videosex性欧美| 亚洲人成电影网站| 午夜精品视频在线| 国产精品久久久久aaaa九色| 久久久之久亚州精品露出| 欧美日韩加勒比精品一区| 秋霞午夜一区二区| 久久欧美在线电影| 亲子乱一区二区三区电影| 亚洲欧美日韩高清| 欧美日韩激情视频| 久青草国产97香蕉在线视频| 亚洲国产精品视频在线观看| 久久久久亚洲精品成人网小说| 国产一级揄自揄精品视频| 91麻豆桃色免费看| 中文字幕日韩在线视频| 亚洲аv电影天堂网| 久久天天躁狠狠躁夜夜躁2014| 91成人福利在线| 欧美成人黑人xx视频免费观看| 国产成人福利夜色影视| 成人免费观看49www在线观看| 欧美激情a∨在线视频播放| 国产欧美精品一区二区三区-老狼| 久久av红桃一区二区小说| 国产一区二区三区在线观看视频| 欧美国产视频一区二区| 国产一区二区三区久久精品| 欧美精品国产精品日韩精品| 久久国产精品影片| 欧美成人午夜免费视在线看片| 国产日韩欧美视频| 久久亚洲成人精品| 最近2019年中文视频免费在线观看| 大桥未久av一区二区三区| 欧美日韩午夜剧场| 国产裸体写真av一区二区| 欧美插天视频在线播放| 国产精品久久久91| 国产成人精品av| 欧美另类极品videosbest最新版本| 欧美亚洲另类激情另类| 日韩精品一二三四区| 亚洲精品一区二区网址| 亚洲精品欧美日韩| 一区二区三区 在线观看视| 欧美激情a∨在线视频播放| 日韩电视剧在线观看免费网站| 国产精品久久中文| 国内免费久久久久久久久久久| 久久免费视频在线观看| 日韩av高清不卡| 久久中文字幕国产| 91亚洲人电影| 成人久久久久爱| 亚洲影院在线看| 欧美一级淫片aaaaaaa视频| 色综合男人天堂| 性色av香蕉一区二区| 国产精品精品久久久久久| 自拍视频国产精品| 91理论片午午论夜理片久久| 91在线观看免费观看| 国产精品久久久久久久av大片| 国产在线观看精品| 茄子视频成人在线| 91精品国产自产在线老师啪| 欧美性猛交xxxx乱大交| 日韩中文字幕在线视频| 欧美日韩综合视频| 精品无人国产偷自产在线| 亚洲激情视频在线播放| 亚洲黄页视频免费观看| 亚洲第一区在线观看| 欧美激情在线狂野欧美精品| 国产69久久精品成人看| 久久精品成人动漫| 91在线观看免费高清| 亚洲aⅴ男人的天堂在线观看| 欧美性猛交xxxx乱大交3| 欧美激情视频在线观看| 久久香蕉精品香蕉| 国产91精品视频在线观看| 国模叶桐国产精品一区| 国产欧美一区二区三区在线| 久久激情五月丁香伊人| 国产精品wwww| 欧美老少配视频| 国产日本欧美一区二区三区| 国产69精品久久久久9| 亚洲a中文字幕| 久久久人成影片一区二区三区观看| 亚洲免费伊人电影在线观看av| 成人av在线亚洲| 亚洲综合在线播放| 欧美色道久久88综合亚洲精品| 久久久久久久久久亚洲| 精品久久久久久久久国产字幕| 热久久这里只有精品| 国产欧美日韩丝袜精品一区| 亚洲一区二区在线| 在线看国产精品| 中文字幕欧美国内| 欧美视频在线看| 欧美性生交xxxxx久久久| 日韩小视频网址| 午夜精品一区二区三区av| 一区二区三欧美| 成人免费视频97| 精品久久香蕉国产线看观看亚洲| 久久久噜噜噜久噜久久| 亚洲国产成人久久综合一区| 欧美国产日韩一区二区在线观看| 亚洲国产日韩欧美综合久久| 78m国产成人精品视频| 美女黄色丝袜一区| 亚洲免费一级电影| 亚洲视频在线播放| 日韩免费高清在线观看|