成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[SheetJS] js-xlsx模塊學習指南

zhaot / 1845人閱讀

摘要:簡介是前端操作以及類似的二維表的最佳選擇之一而是它的社區(qū)版本將注意力集中到了數(shù)據(jù)轉(zhuǎn)換和導出上所以它支持相當多種類的數(shù)據(jù)解析和導出不僅僅局限于支持格式支持的導入格式支持的導出格式它可以解析符合格式的數(shù)據(jù)導出符合格式的數(shù)據(jù)利用中間層操作數(shù)據(jù)

簡介

SheetJS是前端操作Excel以及類似的二維表的最佳選擇之一,而js-xlsx是它的社區(qū)版本.

js-xlsx將注意力集中到了數(shù)據(jù)轉(zhuǎn)換和導出上,所以它支持相當多種類的數(shù)據(jù)解析和導出.不僅僅局限于支持xlsx格式.

支持的導入格式

支持的導出格式

它可以:

解析符合格式的數(shù)據(jù)

導出符合格式的數(shù)據(jù)

利用中間層操作數(shù)據(jù)

可以運行在:

瀏覽器端

Node端

瀏覽器端特色

純?yōu)g覽器端解析數(shù)據(jù)

純?yōu)g覽器端導出數(shù)據(jù)

Node端特色

讀寫文件

流式讀寫

本篇文章力求精簡,主要討論一下js-xlsx的工作流程和基本概念以及使用方式.

概念

js-xlsx提供了一個中間層用于操作數(shù)據(jù),他將不同類型的文件抽象成同一個js對象,從而規(guī)避了操作不同種類數(shù)據(jù)數(shù)據(jù)之間的復雜性.

并且圍繞著這個對象提供了一系列的抽象功能,本小節(jié)主要討論這些數(shù)據(jù)對象與Excel數(shù)據(jù)之間的關(guān)系.

而瀏覽器端和Node端的區(qū)別僅僅在于怎樣導入文件和導出文件上而已,對于數(shù)據(jù)的操作,雙方的接口是一致的.

引入

js-xlsx的引入非常簡單,瀏覽器端引入可以是最基本script標簽的形式.

在node端,使用npm安裝如下模塊:

npm install xlsx --save

在Node中如下引入:

const xlsx = require("xlsx");

詳細文檔地址

對應關(guān)系

在這個表格中我列舉了Excel與js-xlsx之間的關(guān)系:

Excel名詞 js-xlsx中的抽象類型
工作簿 workBook
工作表 Sheets
Excel引用樣式(單元格地址) cellAddress
單元格 cell

有了這個基本的對應關(guān)系我們就可以輕松的理解后續(xù)的操作,例如在我們使用Excel的過程中,獲取一個數(shù)據(jù)的流程如下:

打開工作簿

打開一個工作表

選中一片區(qū)域或者一個單元格

針對數(shù)據(jù)進行操作

保存(另存為)

那么在js-xlsx中獲取一個單元格內(nèi)容的操作如下:

// 先不要關(guān)心我們的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);// 獲取對應單元格中的數(shù)據(jù)
數(shù)據(jù)格式

圖片:工作簿的數(shù)據(jù)結(jié)構(gòu)

一旦我們的Excel文件被解析那么這個Excel表中的所有內(nèi)容都會被解析上面的這個對象.而且這整個過程是同步完成的.

所以我們可以使用鍵的方式來直接獲取數(shù)據(jù),在上面的例子中我們就利用鍵一層層的向下獲取數(shù)據(jù).

上圖中常用的鍵一共有兩個:

SheetNames以字符串數(shù)組的形式保存了所有的工作表的名稱

Sheets下的內(nèi)容都是工作表對象,而鍵名就是SheetNames中包含的名字

而Excel的數(shù)據(jù)單位由小到大有如下排序如下:

單元格

工作表

工作簿

單元格格式

在Excel中單元格有多種格式,而js-xlsx會將其解析為對應的JavaScript的格式.

常見格式如下:

描述
v 源數(shù)據(jù)(未經(jīng)處理的數(shù)據(jù))
w 格式化后的文本(如果能夠被格式化)
t 單元格類型(具體類型請看下方的表格)
r 解碼后的富文本(如果可以被解碼)
h 渲染成HTML格式的富文本(如果可以被解碼)
c 單元格注釋
z 格式化成字符串的數(shù)值(如果需要的話)

完整格式鏈接.

解析后單元格數(shù)據(jù)格式:

這個數(shù)據(jù)在Excel中保存在A1的位置上,文本類型,單元格內(nèi)容為xm.

單元格地址

js-xlsx使用有兩種方式來描述操作中的單元格區(qū)域.

一種是單元格地址對象(Cell address object)另外一種是地址范圍(Cell range).

地址對象格式如下:

const start = { c: 0, r: 0 };
const end = { c: 1, r: 1 };

上方地址對象對應的地址范圍如下:

const range = "A1:B2";

我們不難發(fā)現(xiàn)兩者之間對應的關(guān)系:

地址對象描述的是一個起始坐標(從0開始)到結(jié)束坐標之間的范圍.

地址范圍就是Excel中的引用樣式.

注意:這兩個概念會在工作表讀寫中使用到.

API

js-xlsx提供的接口非常清晰主要分為兩類:

xlsx對象本身提供的功能

解析數(shù)據(jù)

導出數(shù)據(jù)

utils工具類

將數(shù)據(jù)添加到數(shù)據(jù)表對象上

將二維數(shù)組以及符合格式的對象或者HTML轉(zhuǎn)為工作表對象

將工作簿轉(zhuǎn)為另外一種數(shù)據(jù)格式

行,列,范圍之間的轉(zhuǎn)碼和解碼

工作簿操作

單元格操作

讀取數(shù)據(jù)并解析

這里提供一個簡單的Node例子(Node10+):

const xlxs = require("xlsx");
const {readFile} = require("fs").promises;

(async function (params) {
    
    // 獲取數(shù)據(jù)
    const excelBuffer = await readFile("./books.xlsx");
    
    // 解析數(shù)據(jù)
    const result = xlxs.read(excelBuffer,{
        type:"buffer",
        cellHTML:false,
    });
    
    console.log("TCL: result", result);

})();

還可以使用utils.book_new()創(chuàng)建一個新的工作簿對象:

const
    xlsx = require("xlsx"),
    { utils } = xlsx;

const workBook= utils.book_new(); // 創(chuàng)建一個工作簿

然后使用跟多的工具來操作工作簿對象:

// 接著上面的例子

const ws_data = [
  [ "S", "h", "e", "e", "t", "J", "S" ],
  [  1 ,  2 ,  3 ,  4 ,  5 ]
];

const workSheet = XLSX.utils.aoa_to_sheet(ws_data);// 使用二維數(shù)組創(chuàng)建一個工作表對象

utils.book_append_sheet(workBook,workSheet,"工作表名稱");// 向工作簿追加一個工作表

console.log(workBook);

詳細的解析文檔

詳細解析選項

數(shù)據(jù)填充

工作表是實際存放數(shù)據(jù)的地方,在大部分情況下我們的操作都是對于工作表對象的操作.

js-xlsx提供了多種方式來操作數(shù)據(jù),這里提供最常見的幾種操作:

利用現(xiàn)有的數(shù)據(jù)結(jié)構(gòu)創(chuàng)建工作表

二維數(shù)組作為數(shù)據(jù)源

JSON作為數(shù)據(jù)源

修改工作表數(shù)據(jù)

二維數(shù)組作為數(shù)據(jù)源

JSON作為數(shù)據(jù)源

創(chuàng)建工作表
const workSheet = utils.aoa_to_sheet([[1,2,3,new Date()],[1,2,,4]],{
    sheetStubs:false,
    cellStyles:false,
    cellDates:true // 解析為原生時間
});

console.log(workSheet);

二維數(shù)組的關(guān)系非常容易理解,數(shù)組中的每一個數(shù)組代表一行.

圖片:二維數(shù)組結(jié)果

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效果

詳細文檔地址

修改數(shù)據(jù)表數(shù)據(jù)
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開始增加內(nèi)容
});

console.log(workSheet);

圖片:二維數(shù)組結(jié)果

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開始增加內(nèi)容
    header: ["列1", "列2", "列3"],
    skipHeader: true// 跳過上面的標題行
});

console.log(workSheet);

圖片:JSON效果

詳細文檔地址

數(shù)據(jù)導出

數(shù)據(jù)導出分為兩個部分:

利用工具類將工作簿對象轉(zhuǎn)為其他數(shù)據(jù)結(jié)構(gòu)

調(diào)用write或者writeFile方法

轉(zhuǎn)換為其他的數(shù)據(jù)結(jié)構(gòu)

這里就不提供詳細的用例了,可以轉(zhuǎn)換的格式如下:

詳細文檔地址

輸出文件

這里提供一個簡單的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", // 輸出的數(shù)據(jù)類型
    compression:true // 開啟zip壓縮
});

// 寫入文件
writeFile("./hello.xlsx",result)
.catch((error)=>{
    console.log(error);
});

write方法文檔以及輸出選項

支持的輸出文件格式

有關(guān)js-xlsx的其他優(yōu)秀文章
https://www.cnblogs.com/liuxi...
引用
https://github.com/SheetJS/js...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/101481.html

相關(guān)文章

  • 純前端實現(xiàn)excel表格導入導出

    摘要:使用時,前端可以將后端返回的數(shù)據(jù)拼接成自己需要導出的格式,下載到電腦中,完全不依賴后端。 前言 github: https://github.com/stardew516... 以往做excel表格下載功能的時候,都是后端生成好表格后,存儲在某個地方,然后給前端一個鏈接,前端使用a標簽加download下載,或者使用node。其實純前端也是可以做表格下載的,有一個很好用的javascr...

    CoyPan 評論0 收藏0
  • 如何將Excel文件解析為json格式

    摘要:最近工作中遇到一個需求,大致需求就是將文件在導入時解析為格式轉(zhuǎn)換數(shù)據(jù)結(jié)構(gòu)再傳輸給后臺。先介紹幾個基本概念對象,指的是整份文檔。對象,指的是文檔中的表。廢話不多說直接上這里演示下網(wǎng)頁中使用共有種讀取方法將文件讀取為。 最近工作中遇到一個需求,大致需求就是將Excel文件在導入時解析為json格式轉(zhuǎn)換數(shù)據(jù)結(jié)構(gòu)再傳輸給后臺。這方面的庫比較少,比較主流的是js-xlsx,官網(wǎng)地址為sheetj...

    andycall 評論0 收藏0
  • 前端實現(xiàn)Excel導入和導出功能

    摘要:介紹最近項目中讓實現(xiàn)一個導入導出的功能,查找了一些插件后發(fā)現(xiàn)這個插件,所以就嘗試使用了一下,這里將使用方法和遇到的問題簡單記錄一下。 介紹 最近項目中讓實現(xiàn)一個導入導出Excel的功能,查找了一些插件后發(fā)現(xiàn)js-xlsx這個插件,所以就嘗試使用了一下,這里將使用方法和遇到的問題簡單記錄一下。 SheetJS js-xlsx 是一款能夠讀寫多種格式表格的插件,瀏覽器支持良好,并且能在多個...

    Amio 評論0 收藏0

發(fā)表評論

0條評論

zhaot

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<