「項目實戰」React實現導入導出Excel文件

2022-01-14 小獅子前端
🌼 表示層

這裡我是使用的是antd的Upload上傳組件

引用antd部分代碼

import { Button,Table,Upload } from 'antd';

<Upload {...props} fileList={state.fileList}>
    <Button type="primary" >Excel導入</Button>
</Upload>

<Button type="primary" onClick={handleExport}>Excel導出</Button>

🌴  業務層

首先分析一下工作:

「導入」Excel工作:用戶上傳Excel表格,將表格內容轉換為json對象方便後端處理,後端將數據存儲資料庫;「導出」Excel工作:獲取後端json格式數據,前端將數據轉換為sheet工作薄對象,生成的對象轉換為Excel表格下載導出;

下面就是技術層面的細節

✨ 核心插件xlsx

安裝xlsx:npm install xlsx --save-dev

主要介紹用到的核心api:

XLSX.read(data,type) // 解析Excel數據

workbook.Sheets[workbook.SheetNames[0]] // 取到「workbook」對象中的第一個sheet表,規定用戶只有一個sheets,不理解workbook的下面有解釋

XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]], {header:1,defval:』』})// 將工作簿對象轉換為JSON對象數組,注意defval不設置『』則默認值為empty

XLSX.utils.json_to_sheet(json) // 將json對象轉換為工作簿對象

// workbook 理解:
{
    SheetNames: ['sheet1', 'sheet2'],
    Sheets: {
        // worksheet
        'sheet1': {
            // cell
            'A1': { ... },
            // cell
            'A2': { ... },
            ...
        },
        // worksheet
        'sheet2': {
            // cell
            'A1': { ... },
            // cell
            'A2': { ... },
            ...
        }
    }
}

🍒 excel 導入

核心代碼 :

const f = file;
const reader = new FileReader();
reader.onload = function (e) {
    try{
        const datas = e.target.result;
        const workbook = XLSX.read(datas, {type: "binary",}); //解析datas
        const first_worksheet = workbook.Sheets[workbook.SheetNames[0]]; //是工作簿中的工作表的第一個sheet
        const jsonArr = XLSX.utils.sheet_to_json(first_worksheet, {header: 1,defval:''}); //將工作簿對象轉換為JSON對象數組
        handleImpotedJson(jsonArr)// 數組處理
        message.success('Excel上傳解析成功!')
    }catch(e){
      message.error('文件類型不正確!或文件解析錯誤')
    } 
};
reader.readAsBinaryString(f);

理解:

FileReader對象實例化file對象在onload事件裡進行處理XLSX.utils.sheet_to_json(first_worksheet, {header: 1,defval:''}) 將解析出的工作簿對象轉化為JSON對象🍇 excel 導出

核心代碼:

const downloadExcel = () =>{
    const json = handleExportedJson(data)
    const sheet = XLSX.utils.json_to_sheet(json);
    openDownloadDialog(sheet2blob(sheet,"Sheet1"), "下載文件.xls")
}
const handleExportedJson = (array) =>{...}  // 處理Json數據
const openDownloadDialog = (url, saveName) =>{...} // 打開下載
const sheet2blob = (sheet, sheetName) =>{...} // 轉成blob類型

理解:

XLSX.utils.json_to_sheet(json) 轉換成sheet工作簿對象sheet2blob(sheet,saveName) 將工作簿對象轉換成 blobopenDownloadDialog 創建blob地址通過<a>標籤實現下載動作🍑 excel 導出插件(js-export-excel)

之前為啥沒放自實現的代碼,那不是因為發現有好用的插件嘛,代碼很簡單。

核心代碼:

// 直接導出文件
let dataTable = [];  //excel文件中的數據內容
let option = {};  //option代表的就是excel文件
dataTable  = data;  //數據源
option.fileName = "下載文件";  //excel文件名稱
console.log("data===",dataTable)
option.datas = [
    {
        sheetData: dataTable,  //excel文件中的數據源
        sheetName: 'Sheet1',  //excel文件中sheet頁名稱
        sheetFilter: ['id', 'name', 'belong', 'step','tag'],  //excel文件中需顯示的列數據
        sheetHeader: ['項目id', '項目名稱', '所屬公司', '項目階段','項目標籤'],  //excel文件中每列的表頭名稱
    }
]
let toExcel = new ExportJsonExcel(option);  //生成excel文件
toExcel.saveExcel();  //下載excel文件

上為這個插件的基本用法,還支持導出Blob,支持壓縮等,詳細見官網

解釋核心 「option」:

fileName 下載文件名(默認:download)

/*多個sheet*/
/*每個sheet為一個object */
[{
    sheetData:[], // 數據
    sheetName:'', // (非必需)sheet名字,默認為sheet1
    sheetFilter:[], //(非必需)列過濾(只有在 data 為 object 下起作用)
    sheetHeader:[] // 第一行,標題
    columnWidths: [] //(非必需)列寬,需與列順序對應
}]

瀏覽器支持:ie 10+ 我測試下來demo在chrom、Safari、IE下都是能用的。

🌸  實現效果2021-07-09 12.23.55 1 1.gif

還有不懂得可以看 GitHub demo源碼

🍀 結語

這是一個簡單的業務實現,仔細的總結了一下。💗 感謝你看到這~💗 ,如果覺得不錯麻煩點個讚 👍

剛忙完畢業的事兒,事情沒有那麼多了,又可以慢慢發文了,預告下一篇吧,關於我的「畢業設計」,給大家看個效果圖:

image.png

我感覺這個可以到時候改成 🌟博客啥的,畢竟開發了挺久的,想著有點用嘛 😂

相關焦點

  • 如何使用JavaScript實現前端導入和導出excel文件(H5編輯器實戰復盤)
    筆者將分成3篇文章來復盤, 主要解決場景如下:如何使用JavaScript實現前端導入和導出excel文件(H5編輯器實戰復盤)前端如何基於table中的數據一鍵生成多維度數據可視化分析報表以上場景也是前端工程師在開發後臺管理系統中經常遇到的或者即將遇到的問題, 本文是上述介紹中的第一篇文章, 你將收穫:使用JavaScript實現前端導入excel文件並自動生成可編輯的Table組件使用JavaScript
  • EasyExcel實現Excel文件的導入導出
    →[設為星標⭐]EasyExcel實現Excel文件的導入導出前言在我們日常的開發過程中經常會使用Excel文件的形式來批量地上傳下載系統數據,我們最常用的工具是Apache poi,但是如果數據到底上百萬時,將會造成內存溢出的問題,那麼我們怎麼去實現百萬數據批量導入導出。
  • 十分鐘上手 xlsx,4 種方法實現 Excel 導入導出
    畢竟管理後臺一般就只會導入一個表的數據。所以,下面我都以一個 Sheet 的情況來實現,多個 Sheet 的情況你們自己實現加個循環就好了。Excel 文件導出的難點在於寫成 Excel 之後要立馬下載,幸好 xlsx 的 xlsx.writeFile 直接幫我們實現這一步了。
  • C# excel文件導入導出
    excel數據導入導出到C#界面上存在疑惑,所以今天專門做了這個主題,希望大家有所收穫!excel中,點擊ImportExcel,選擇excel後讀取數據到datagridview2.實現數據導出到excel public DataSet ImportExcel(int t = 1)實現讀取excel數據 public void ExportCSV() 數據導出到csv其次保存選項對話框  string fileName = "";                string saveFileName = "";
  • 實戰:Java如何實現文件批量導入導出(兼容xls,xlsx)?
    # 介紹java實現文件的導入導出資料庫,目前在大部分系統中是比較常見的功能了
  • 優雅 | 今天很水的文章-Excel導入導出
    前端部分這裡闡述前端部分導入,導出,生成Excel表格這裡使用的是一個js-xlsx插件,所以這裡進行嘗試。安裝依賴yarn add xlsx項目中引入import * as XLSX from 'xlsx'導出基本實現定義導出的基本方法export default function download
  • Vue+Element前端導入導出Excel
    根據一個數組導出Excel表格。excel中格式為橫向 設備ID 和 設備型號。2.3 導出Excel2.3.1 引入JS文件可參考下載地址:- github將其中的2個JS文件放入到自己的工程中。2.3.2 修改JS文件中地址
  • 讓 .Net 更方便的導入導出Excel
    Intro因為前一段時間需要處理一些 excel 數據,主要是導入/導出操作,將 Excel 數據轉化為對象再用程序進行處理和分析,沒有找到比較滿意的庫
  • Java實現文件批量導入導出實踐(兼容xls,xlsx)
    https://blog.csdn.net/baidu_39322753/article/details/1049442291、介紹java實現文件的導入導出資料庫
  • Java:實現文件批量導入導出實踐(兼容xls,xlsx)
    作者:小賣鋪的老爺爺cnblogs.com/laoyeye/p/6938889.html1、介紹java實現文件的導入導出資料庫目前我所接觸過的導入導出技術主要有POI和iReport,poi主要作為一些數據批量導入資料庫,iReport做報表導出。另外還有jxl類似poi的方式,不過貌似很久沒跟新了,2007之後的office好像也不支持,這裡就不說了。2、POI使用詳解2.1 什麼是Apache POI?
  • Go Gin 系列十四:實現導出、導入 Excel
    知識點本文目標在本節,我們將實現對標籤信息的導出、導入功能,這是很標配功能了,希望你掌握基礎的使用方式。配置首先要指定導出的 Excel 文件的存儲路徑,在 app.ini 中增加配置:[app]...
  • EasyExcel,讓excel導入導出更加簡單
    EasyExcel在做excel導入導出的時候,發現項目中封裝的工具類及其難用,於是去gitHub上找了一些相關的框架,最終選定了EasyExcel。之前早有聽聞該框架,但是一直沒有去了解,這次藉此學習一波,提高以後的工作效率。
  • (進階篇)使用PHP導入和導出CSV文件
    項目開發中,很多時候要將外部CSV文件導入到資料庫中或者將數據導出為CSV文件,那麼具體該如何實現呢?本文將使用PHP並結合mysql,實現了CSV格式數據的導入和導出功能。我們先準備mysql數據表,假設項目中有一張記錄學生信息的表student,並有id,name,sex,age分別記錄學生的姓名、性別、年齡等信息。
  • 你要的不固定列excel導入導出,它來啦!
    看完本文,你一定會有所收穫一、介紹在上篇文章中,我們簡單的介紹了 excel 導入導出技術實踐方案,就目前而已,使用最多的開源框架主要有以下三類,分別是:apache poi:poi是使用最廣的一種導入導出框架,但是缺點也很明顯,導出大數據量的時候,容易
  • Vue+axios+WebAPI+NPOI導出Excel文件(附github源碼地址)
    cnblogs.com/xyb0226/p/10976819.html一、前言項目中前端採用的Element UI 框架, 遠程數據請求,使用的是axios,後端接口框架採用的ASP.NET WebApi,數據導出成Excel採用NPOI組件。
  • EasyExcel,讓 excel 導入導出更加簡單
    在做excel導入導出的時候,發現項目中封裝的工具類及其難用,於是去gitHub上找了一些相關的框架,最終選定了EasyExcel。之前早有聽聞該框架,但是一直沒有去了解,這次藉此學習一波,提高以後的工作效率。
  • ASP.NET Core 導入導出Excel xlsx 文件
    xlsx文件導入導出,可以運行在Windows, Linux和Mac。EPPlus:http://epplus.codeplex.com/EPPlus.Core:https://github.com/VahidN/EPPlus.Core下面在ASP.NET Core 中導入導出Excel xlsx 文件。
  • 牛逼的EasyExcel,讓Excel導入導出更加簡單,附詳細教程!
    EasyExcel在做excel導入導出的時候,發現項目中封裝的工具類及其難用,於是去gitHub上找了一些相關的框架,最終選定了EasyExcel。之前早有聽聞該框架,但是一直沒有去了解,這次藉此學習一波,提高以後的工作效率。
  • 分享我基於NPOI+ExcelReport實現的導入與導出EXCEL類庫:ExcelUtility
    ExcelUtility功能:   1.將數據導出到EXCEL(支持XLS,XLSX,支持多種類型模板,支持列寬自適應)     類名:ExcelUtility.Export   2.將EXCEL數據導入到數據對象中(DataTable、Dataset,支持XLS,XLSX)     類名:ExcelUtility. Import  類庫項目文件結構如下圖示:   2.
  • PhpOffice實現Excel表格導入的解耦方法
    但是這裡主要是使用PhpOffice類庫介紹實現導入表格數據的功能。衝突:        大部分的導入功能,就是通過點擊按鈕上傳一張表格,然後後臺讀取表格數據根據業務整理後直接插入到資料庫,最後再返回給前端。但是如果表格數據龐大,業務邏輯複雜的時候,就會導致導入那一塊很臃腫不好維護。