如何使用JavaScript實現前端導入和導出excel文件

2020-12-16 酷扯兒

本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫

正文

本文接下來的內容素材都是基於H5可視化編輯器(H5-Dooring)項目的截圖, 如果想實際體驗, 可以訪問H5-Dooring網站實際體驗. 接下來我們直接開始我們的方案實現.

1. 使用JavaScript實現前端導入excel文件並自動生成可編輯的Table組件

在開始實現之前, 我們先來看看實現效果.

1.1 實現效果

導入excel文件並通過antd的table組件渲染table:

編輯table組件:

保存table數據後實時渲染可視化圖表:

以上就是我們實現導入excel文件後, 編輯table, 最後動態生成圖表的完整流程.

1.2 實現一鍵導入excel文件並生成table表格

導入excel文件的功能我們可以用javascript原生的方式實現解析, 比如可以用fileReader這些原生api,但考慮到開發效率和後期的維護, 筆者這裡採用antd的Upload組件和XLSX來實現上傳文件並解析的功能. 由於我們採用antd的table組件來渲染數據, 所以我們需要手動將解析出來的數據轉換成table支持的數據格式.大致流程如下:

所以我們需要做的就是將Upload得到的文件數據傳給xlsx, 由xlsx生成解析對象, 最後我們利用javascript算法將xlsx的對象處理成ant-table支持的數據格式即可. 這裡我們用到了FileReader對象, 目的是將文件轉化為BinaryString, 然後我們就可以用xlsx的binary模式來讀取excel數據了, 代碼如下:

// 解析並提取excel數據let reader = new FileReader();reader.onload = function(e) {let data = e.target.result; let workbook = XLSX.read(data, {type: 'binary'}); let sheetNames = workbook.SheetNames; // 工作表名稱集合 let draftObj = {} sheetNames.forEach(name => { // 通過工作表名稱來獲取指定工作表 let worksheet = workbook.Sheets[name]; for(let key in worksheet) { // v是讀取單元格的原始值 if(key[0] !== '!') { if(draftObj[key[0]]) { draftObj[key[0]].push(worksheet[key].v) }else { draftObj[key[0]] = [worksheet[key].v] } } } }); // 生成ant-table支持的數據格式 let sourceData = Object.values(draftObj).map((item,i) => ({ key: i + '', name: item[0], value: item[1]}))

複製代碼

經過以上處理, 我們得到的sourceData即是ant-table可用的數據結構, 至此我們就實現了表格導入的功能.

1.3 table表格的編輯功能實現

table表格的編輯功能實現其實也很簡單, 我們只需要按照antd的table組件提供的自定義行和單元格的實現方式即可. antd官網上也有實現可編輯表格的實現方案, 如下:

大家感興趣的可以私下研究以下. 當然自己實現可編輯的表格也很簡單, 而且有很多方式, 比如用column的render函數來動態切換表格的編輯狀態, 或者使用彈窗編輯等都是可以的.

1.4 根據編輯的table數據動態生成圖表

根據table數據動態生成圖表這塊需要有一定的約定, 我們需要符合圖表庫的數據規範, 不過我們有了table數據, 處理數據規範當然是很簡單的事情了, 筆者的可視化庫採用antv的f2實現, 所以需要做一層適配來使得f2能消費我們的數據.

還有一點就是為了能使用多張圖表, 我們需要對f2的圖表進行統一封裝, 使其成為符合我們應用場景的可視化組件庫. 我們先看看f2的使用的數據格式:

const data = [{ genre: 'Sports', sold: 275 }, { genre: 'Strategy', sold: 115 }, { genre: 'Action', sold: 120 }, { genre: 'Shooter', sold: 350 }, { genre: 'Other', sold: 150 }];

複製代碼

此數據格式會渲染成如下的圖表:

所以說我們總結下來其主要有2個緯度的指標, 包括它們的面積圖, 餅圖, 折線圖, 格式都基本一直, 所以我們可以基於這一點封裝成組件的可視化組件, 如下:

import { Chart } from '@antv/f2';import React, { memo, useEffect, useRef } from 'react';import ChartImg from '@/assets/chart.png';import styles from './index.less';import { IChartConfig } from './schema';interface XChartProps extends IChartConfig {isTpl: boolean;}const XChart = (props: XChartProps) => { const { isTpl, data, color, size, paddingTop, title } = props; const chartRef = useRef(null); useEffect(() => { if (!isTpl) { const chart = new Chart({ el: chartRef.current || undefined, pixelRatio: window.devicePixelRatio, // 指定解析度 }); // step 2: 處理數據 const dataX = data.map(item => ({ ...item, value: Number(item.value) })); // Step 2: 載入數據源 chart.source(dataX); // Step 3:創建圖形語法,繪製柱狀圖,由 genre 和 sold 兩個屬性決定圖形位置,genre 映射至 x 軸,sold 映射至 y 軸 chart .interval() .position('name*value') .color('name'); // Step 4: 渲染圖表 chart.render(); } }, [data, isTpl]); return ( <div className={styles.chartWrap}> <div className={styles.chartTitle} style={{ color, fontSize: size, paddingTop }}> {title} </div> {isTpl ? <img src={ChartImg} alt="dooring chart" /> : <canvas ref={chartRef}></canvas>} </div> );};export default memo(XChart);

複製代碼

當然其他的可視化組件也可以用相同的模式封裝,這裡就不一一舉例了. 以上的組件封裝使用react的hooks組件, vue的也類似, 基本原理都一致.

2. 使用JavaScript實現前端基於Table數據一鍵導出excel文件

同樣的, 我們實現將table數據一鍵導出為excel也是類似, 不過方案有所不同, 我們先來看看在Dooring中的實現效果.

2.1 一鍵導出為excel實現效果

以上就是用戶基於後臺採集到的數據, 一鍵導出excel文件的流程, 最後一張圖是生成的excel文件在office軟體中的呈現.

2.2 使用javascript實現一鍵導出excel文件功能

一鍵導出功能主要用在H5-Dooring的後臺管理頁面中, 為用戶提供方便的導出數據能力. 我們這裡導出功能也依然能使用xlsx來實現, 但是綜合對比了一下筆者發現有更簡單的方案, 接下來筆者會詳細介紹, 首先我們還是來看一下流程:

很明顯我們的導出流程比導入流程簡單很多, 我們只需要將table的數據格式反編譯成插件支持的數據即可. 這裡筆者使用了js-export-excel來做文件導出, 使用它非常靈活,我們可以自定義:

自定義導出的excel文件名自定義excel的過濾欄位自定義excel文件中每列的表頭名稱由於js-export-excel支持的數據結構是數組對象, 所以我們需要花點功夫把table的數據轉換成數組對象, 其中需要注意的是ant的table數據結構中鍵對應的值可以是數組, 但是js-export-excel鍵對應的值是字符串, 所以我們要把數組轉換成字符串,如[a,b,c]變成'a,b,c', 所以我們需要對數據格式進行轉換, 具體實現如下:

const generateExcel = () => {let option = {}; //option代表的就是excel文件 let dataTable = []; //excel文件中的數據內容 let len = list.length; if (len) { for(let i=0; i<len; i++) { let row = list[i]; let obj:any = {}; for(let key in row) { if(typeof row[key] === 'object') { let arr = row[key]; obj[key] = arr.map((item:any) => (typeof item === 'object' ? item.label : item)).join(',') }else { obj[key] = row[key] } } dataTable.push(obj); //設置excel中每列所獲取的數據源 } } let tableKeys = Object.keys(dataTable[0]); option.fileName = tableName; //excel文件名稱 option.datas = [ { sheetData: dataTable, //excel文件中的數據源 sheetName: tableName, //excel文件中sheet頁名稱 sheetFilter: tableKeys, //excel文件中需顯示的列數據 sheetHeader: tableKeys, //excel文件中每列的表頭名稱 } ] let toExcel = new ExportJsonExcel(option); //生成excel文件 toExcel.saveExcel(); //下載excel文件 }

複製代碼

注意, 以上筆者實現的方案對任何table組件都使用, 可直接使用以上代碼在大多數場景下使用. 至此, 我們就實現了使用JavaScript實現前端導入和導出excel文件的功能.

相關焦點

  • ZBrush如何導入和導出ZPR文件
    在之前的學習中我們知道了ZBrush對不同文件有著不一樣的儲存方式上篇文章中我們已將介紹了OBJ和ZTL格式的文件的打開和保存,還有一種格式是ZPR格式的文件,它是一種文檔文件,本文小編將對如何導入和導出ZPR文件做詳細講解。
  • java——POI導入Excel文件
    最近手頭上項目的涉及到關於目標值錄入的問題,甲方爸爸要求提供excel導入的方式錄入目標值,之前項目裡也用到excel導入的方式錄入數據,不過當時是自己研究了導出PPT的時候,順手給同事寫了一個簡單的excel導入的工具類,這次的需求稍微複雜一些,涉及到合併單元格的excel讀取,
  • Hutool excel導出並合併單元格
    Hutool是項目中「util」包友好的替代,它節省了開發人員對項目中公用類和公用工具方法的封裝時間,使開發專注於業務,同時可以最大限度地避免封裝不完善帶來的bug。今天要講的是excel的導出並合併單元格,其他工具類,可查看參考文檔,之後也會陸續的更新一些常用工具類的用法。
  • 程式設計師:Java操作導出excel的三種方法,POI、easyExcel、Hutool
    前言最近在開發一個管理後臺,有一些excel的導出和導入操作,以前都是使用POI操作excel,這一次嘗試了別的人組件:easyExcel和Hutool,今天就來分享一下,這三種方式中POI操作導出excel。POI導出excel文件。
  • 前端組件/庫打包利器rollup使用與配置實戰
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫目前主流的前端框架vue和react都採用rollup來打包,為了探索rollup的奧妙,接下來就讓我們一步步來探索,並基於rollup搭建一個庫打包腳手架,來發布自己的庫和組件。
  • SpreadJS 表格控制項發布 V11 版本,新增圖表及前端 PDF 導出
    開發人員可利用SpreadJS,更好的顯示和管理類似 Excel 的數據,更方便的進行公式引擎、排序、過濾、輸入控制項、數據可視化、Excel導入/導出等操作。同時,還支持組合圖表、對圖表各個部分的定製,以及導入和導出含圖表的Excel文件。SpreadJS支持的圖表類型包括:柱狀圖、折線圖、餅圖或圓環圖、條形圖、面積圖、散點圖、股價圖、組合圖表。
  • 通訊錄導入助手
    通訊錄導入助手簡介 產品簡介: 本產品是一款通訊錄同步助手,可以快速的將excel聯繫人導入到手機通訊錄中
  • 第一集:認識premiere,如何導入文件及導出儲存完成好的素材
    premiere進入的主界面1,首先肯定是需要安裝好一個剪輯軟體,本人安裝的是premiere CC2018版本的2,接下來需要就是創建一個項目,當然在主界面裡面的左上角「文件」找到「新建」也能新建一個項目
  • 前端:用javascript實現一個轉盤小遊戲?
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫本文主要介紹如何使用原生javascript和Css3來實現一個在各大移動應用中經常出現的轉盤遊戲,由於改實現可以有不同方式,如果熟悉canvas的話也可以用canvas實現,本文採用js和css實現主要考慮到複雜度較小性能較好
  • 如何實現在WORD中打開EXCEL文件
    ,這裡用了一個myfile變量來表示這個文件,在取得當前路徑後,用OPEN語句來實現打開的命令,當然在之前還要實現一下這個應用程式的引用Set XLApp = CreateObject("excel.application"),如果是在其他的應用程式,只需要變更這裡就可以實現不同的引用了。
  • 如何將SRT文件導入PR生成字幕
    本文適用場景:SRT文件導入PR 。(PR CC 2017及以上版本支持SRT導入)本文使用版本:PR CC 2018。具體操作如下:1. 導入。將在「繪影字幕」中導出的SRT文件和視頻文件導入PR CC 2017及以上版本中。(PR CC 2017有很多bug,有些操作無法完成,建議使用2018及以上版本。)2.
  • PS如何把視頻文件導出為gif動畫
    經常看到貼吧或者是在評論區看到有人將電影中的片段轉換成gif動畫,感覺挺酷的,於是便自己嘗試用Photoshop(以下簡稱PS)做了起來,其實操作起來還是很簡單,接下來用圖解的形式介紹給大家怎麼用PS實現。廢話不多說,先將做好的gif動畫送上。
  • 《騎馬與砍殺2:霸主》角色導入導出MOD
    原作者:Femos搬運及漢化作者:Bombadil@騎砍中文站介紹導出導入角色的txt文件,編輯你的屬性、技能和特長。免責聲明1、作者本人不對壞檔或是遊戲文件損壞負責,使用此mod請牢記後果自負2、作者建議最好還是開新檔,或是至少備份好舊存檔3、不要將技能等級調得過高,作者測試過1000級,結果存檔損壞
  • BAK格式的備份文件如何導入審計軟體
    bak,必須滿足前提條件:自己電腦上安裝有sqlserver資料庫 https://pan.baidu.com/s/1E9MkqqcInTbE5-mcgYTY6Q 2)裝上資料庫之後,第一次導入bak文件前需要先做測試連接:登錄項目,點擊前端數據導入--連接SQLSERVER---設置SQLERVER連接參數。
  • 《QQ飛車》手遊捏臉導出導入方法 怎麼捏臉導出導入
    導 讀 《QQ飛車》手遊捏臉的數據我們應該如何進行導出和導入呢?對此,很多小夥伴還不是很了解。
  • javascript這些特點你知道其中幾個?建議前端小白好好看看!
    JavaScript是一門屬於客戶端的腳本語言,你可以簡單理解為基於網站和網頁的程序語言(雖然這樣解釋不太嚴謹)。它是web開發中常用的腳本語言,特別是前端。 JavaScript主要功能是增強網頁互動性能,從而增加網站的用戶粘性。
  • 文件太多找不到咋整?用excel製作文件管理器,所有版本皆可使用
    Hello,大家好,之前跟大家分享了使用excel中的power query功能製作一個文件管理器,但是很多分析反應自己的excel版本不夠高,無法使用,今天就跟大家分享如何使用宏表函數製作文件管理器,他也是可以實現文件刷新的,這個的操作也不難,下面就讓我們來看下他是如何設置的一、什麼是宏表函數以及FILES函數
  • 0基礎學習JavaScript一定要知道如何使用VS2019去編寫代碼
    編寫JS代碼對於.NET開發者來說,前端技術也是不能少的,0基礎的開發者來說,使用Visual Studio 2019開發工具是非常容易上手的。這裡創建一個空白的Web應用程式項目,ASP.NET Web應用程式是完全支持JavaScript代碼編寫的。
  • Sketchup文件怎樣導入到SolidWorks中?
    有朋友問我:Sketchup文件如何導入到SolidWorks中?在這裡我整理了一下具體的操作方法。先看看兩款軟體,Sketchup是景觀、建築設計用的3D軟體,SolidWorks是機械設計用的3D軟體,它們的文件格式確實不能直接通用,所以一般Sketchup文件導入到SolidWorks中,要藉助其他軟體。下面是我的日常操作方法,我藉助的是meshlab這個軟體(其他類似軟體均可)。
  • 如何使用SAP Intelligent Robotic Process Automation自動操作Excel
    打開SAP Intelligent Robotic Process Automation Desktop Studio,導入SAP預置的操作Excel的nodejs腳本庫文件。在庫文件裡選擇Excel Integration.