摘要:簡介是前端操作以及類似的二維表的最佳選擇之一而是它的社區版本將注意力集中到了數據轉換和導出上所以它支持相當多種類的數據解析和導出不僅僅局限于支持格式支持的導入格式支持的導出格式它可以解析符合格式的數據導出符合格式的數據利用中間層操作數據
簡介
SheetJS是前端操作Excel以及類似的二維表的最佳選擇之一,而js-xlsx是它的社區版本.
js-xlsx將注意力集中到了數據轉換和導出上,所以它支持相當多種類的數據解析和導出.不僅僅局限于支持xlsx格式.
支持的導入格式
支持的導出格式
它可以:
解析符合格式的數據
導出符合格式的數據
利用中間層操作數據
可以運行在:
瀏覽器端
Node端
瀏覽器端特色純瀏覽器端解析數據
純瀏覽器端導出數據
Node端特色讀寫文件
流式讀寫
本篇文章力求精簡,主要討論一下js-xlsx的工作流程和基本概念以及使用方式.
概念js-xlsx提供了一個中間層用于操作數據,他將不同類型的文件抽象成同一個js對象,從而規避了操作不同種類數據數據之間的復雜性.
并且圍繞著這個對象提供了一系列的抽象功能,本小節主要討論這些數據對象與Excel數據之間的關系.
而瀏覽器端和Node端的區別僅僅在于怎樣導入文件和導出文件上而已,對于數據的操作,雙方的接口是一致的.
引入js-xlsx的引入非常簡單,瀏覽器端引入可以是最基本script標簽的形式.
在node端,使用npm安裝如下模塊:
npm install xlsx --save
在Node中如下引入:
const xlsx = require("xlsx");
詳細文檔地址
對應關系在這個表格中我列舉了Excel與js-xlsx之間的關系:
Excel名詞 | js-xlsx中的抽象類型 |
---|---|
工作簿 | workBook |
工作表 | Sheets |
Excel引用樣式(單元格地址) | cellAddress |
單元格 | cell |
有了這個基本的對應關系我們就可以輕松的理解后續的操作,例如在我們使用Excel的過程中,獲取一個數據的流程如下:
打開工作簿
打開一個工作表
選中一片區域或者一個單元格
針對數據進行操作
保存(另存為)
那么在js-xlsx中獲取一個單元格內容的操作如下:
// 先不要關心我們的workbook對象是從哪里來的 var first_sheet_name = workbook.SheetNames[0]; // 獲取工作簿中的工作表名字 var address_of_cell = "A1"; // 提供一個引用樣式(單元格下標) var worksheet = workbook.Sheets[first_sheet_name]; // 獲取對應的工作表對象 var desired_cell = worksheet[address_of_cell]; // 獲取對應的單元格對象 var desired_value = (desired_cell ? desired_cell.v : undefined);// 獲取對應單元格中的數據數據格式
圖片:工作簿的數據結構
一旦我們的Excel文件被解析那么這個Excel表中的所有內容都會被解析上面的這個對象.而且這整個過程是同步完成的.
所以我們可以使用鍵的方式來直接獲取數據,在上面的例子中我們就利用鍵一層層的向下獲取數據.
上圖中常用的鍵一共有兩個:
SheetNames以字符串數組的形式保存了所有的工作表的名稱
Sheets下的內容都是工作表對象,而鍵名就是SheetNames中包含的名字
而Excel的數據單位由小到大有如下排序如下:
單元格
工作表
工作簿
單元格格式在Excel中單元格有多種格式,而js-xlsx會將其解析為對應的JavaScript的格式.
常見格式如下:
鍵 | 描述 |
---|---|
v | 源數據(未經處理的數據) |
w | 格式化后的文本(如果能夠被格式化) |
t | 單元格類型(具體類型請看下方的表格) |
r | 解碼后的富文本(如果可以被解碼) |
h | 渲染成HTML格式的富文本(如果可以被解碼) |
c | 單元格注釋 |
z | 格式化成字符串的數值(如果需要的話) |
完整格式鏈接.
解析后單元格數據格式:
這個數據在Excel中保存在A1的位置上,文本類型,單元格內容為xm.
單元格地址js-xlsx使用有兩種方式來描述操作中的單元格區域.
一種是單元格地址對象(Cell address object)另外一種是地址范圍(Cell range).
地址對象格式如下:
const start = { c: 0, r: 0 }; const end = { c: 1, r: 1 };
上方地址對象對應的地址范圍如下:
const range = "A1:B2";
我們不難發現兩者之間對應的關系:
地址對象描述的是一個起始坐標(從0開始)到結束坐標之間的范圍.
地址范圍就是Excel中的引用樣式.
注意:這兩個概念會在工作表讀寫中使用到.
APIjs-xlsx提供的接口非常清晰主要分為兩類:
xlsx對象本身提供的功能
解析數據
導出數據
utils工具類
將數據添加到數據表對象上
將二維數組以及符合格式的對象或者HTML轉為工作表對象
將工作簿轉為另外一種數據格式
行,列,范圍之間的轉碼和解碼
工作簿操作
單元格操作
讀取數據并解析這里提供一個簡單的Node例子(Node10+):
const xlxs = require("xlsx"); const {readFile} = require("fs").promises; (async function (params) { // 獲取數據 const excelBuffer = await readFile("./books.xlsx"); // 解析數據 const result = xlxs.read(excelBuffer,{ type:"buffer", cellHTML:false, }); console.log("TCL: result", result); })();
還可以使用utils.book_new()創建一個新的工作簿對象:
const xlsx = require("xlsx"), { utils } = xlsx; const workBook= utils.book_new(); // 創建一個工作簿
然后使用跟多的工具來操作工作簿對象:
// 接著上面的例子 const ws_data = [ [ "S", "h", "e", "e", "t", "J", "S" ], [ 1 , 2 , 3 , 4 , 5 ] ]; const workSheet = XLSX.utils.aoa_to_sheet(ws_data);// 使用二維數組創建一個工作表對象 utils.book_append_sheet(workBook,workSheet,"工作表名稱");// 向工作簿追加一個工作表 console.log(workBook);
詳細的解析文檔
詳細解析選項
數據填充工作表是實際存放數據的地方,在大部分情況下我們的操作都是對于工作表對象的操作.
js-xlsx提供了多種方式來操作數據,這里提供最常見的幾種操作:
利用現有的數據結構創建工作表
二維數組作為數據源
JSON作為數據源
修改工作表數據
二維數組作為數據源
JSON作為數據源
創建工作表const workSheet = utils.aoa_to_sheet([[1,2,3,new Date()],[1,2,,4]],{ sheetStubs:false, cellStyles:false, cellDates:true // 解析為原生時間 }); console.log(workSheet);
二維數組的關系非常容易理解,數組中的每一個數組代表一行.
圖片:二維數組結果
const workSheet = utils.json_to_sheet([ { "列1": 1, "列2": 2, "列3": 3 }, { "列1": 4, "列2": 5, "列3": 6 } ],{ header:["列1","列2","列3"], skipHeader:true// 跳過上面的標題行 }) console.log(workSheet);
圖片:JSON效果
詳細文檔地址
修改數據表數據const workSheet = utils.json_to_sheet([ { "列1": 1, "列2": 2, "列3": 3 }, { "列1": 4, "列2": 5, "列3": 6 } ],{ header:["列1","列2","列3"], skipHeader:true// 跳過上面的標題行 }) utils.sheet_add_aoa(workSheet,[ [7,8,9], ["A","B","C"] ],{ origin:"A1" // 從A1開始增加內容 }); console.log(workSheet);
圖片:二維數組結果
const workSheet = utils.json_to_sheet([ { "列1": 1, "列2": 2, "列3": 3 }, { "列1": 4, "列2": 5, "列3": 6 } ],{ header:["列1","列2","列3"], skipHeader:true// 跳過上面的標題行 }) utils.sheet_add_json(workSheet,[ { "列1": 7, "列2": 8, "列3": 9 }, { "列1": "A", "列2": "B", "列3": "C" } ],{ origin:"A1",// 從A1開始增加內容 header: ["列1", "列2", "列3"], skipHeader: true// 跳過上面的標題行 }); console.log(workSheet);
圖片:JSON效果
詳細文檔地址
數據導出數據導出分為兩個部分:
利用工具類將工作簿對象轉為其他數據結構
調用write或者writeFile方法
轉換為其他的數據結構這里就不提供詳細的用例了,可以轉換的格式如下:
詳細文檔地址
輸出文件這里提供一個簡單的Node例子(Node10+):
const xlsx = require("xlsx"), { utils } = xlsx; const {writeFile} =require("fs").promises; const workBook= utils.book_new(); const workSheet = utils.aoa_to_sheet([[1,2,3]],{ cellDates:true, }); // 向工作簿中追加工作表 utils.book_append_sheet(workBook, workSheet,"helloWorld"); // 瀏覽器端和node共有的API,實際上node可以直接使用xlsx.writeFile來寫入文件,但是瀏覽器沒有該API const result = xlsx.write(workBook, { bookType: "xlsx", // 輸出的文件類型 type: "buffer", // 輸出的數據類型 compression:true // 開啟zip壓縮 }); // 寫入文件 writeFile("./hello.xlsx",result) .catch((error)=>{ console.log(error); });
write方法文檔以及輸出選項
支持的輸出文件格式
有關js-xlsx的其他優秀文章https://www.cnblogs.com/liuxi...引用
https://github.com/SheetJS/js...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/101481.html
摘要:使用時,前端可以將后端返回的數據拼接成自己需要導出的格式,下載到電腦中,完全不依賴后端。 前言 github: https://github.com/stardew516... 以往做excel表格下載功能的時候,都是后端生成好表格后,存儲在某個地方,然后給前端一個鏈接,前端使用a標簽加download下載,或者使用node。其實純前端也是可以做表格下載的,有一個很好用的javascr...
摘要:最近工作中遇到一個需求,大致需求就是將文件在導入時解析為格式轉換數據結構再傳輸給后臺。先介紹幾個基本概念對象,指的是整份文檔。對象,指的是文檔中的表。廢話不多說直接上這里演示下網頁中使用共有種讀取方法將文件讀取為。 最近工作中遇到一個需求,大致需求就是將Excel文件在導入時解析為json格式轉換數據結構再傳輸給后臺。這方面的庫比較少,比較主流的是js-xlsx,官網地址為sheetj...
摘要:介紹最近項目中讓實現一個導入導出的功能,查找了一些插件后發現這個插件,所以就嘗試使用了一下,這里將使用方法和遇到的問題簡單記錄一下。 介紹 最近項目中讓實現一個導入導出Excel的功能,查找了一些插件后發現js-xlsx這個插件,所以就嘗試使用了一下,這里將使用方法和遇到的問題簡單記錄一下。 SheetJS js-xlsx 是一款能夠讀寫多種格式表格的插件,瀏覽器支持良好,并且能在多個...
閱讀 2270·2019-08-30 15:56
閱讀 3108·2019-08-30 13:48
閱讀 1123·2019-08-30 10:52
閱讀 1490·2019-08-29 17:30
閱讀 417·2019-08-29 13:44
閱讀 3528·2019-08-29 12:53
閱讀 1113·2019-08-29 11:05
閱讀 2667·2019-08-26 13:24