天天看點

js 預覽 excel,js-xlsx的使用

js-xlsx 介紹

由sheetjs出品的<code>js-xlsx</code>是一款非常友善的隻需要純js即可讀取和導出excel的工具庫,功能強大,支援格式衆多,支援<code>xls</code>、<code>xlsx</code>、<code>ods</code>(一種openoffice專有表格檔案格式)等十幾種格式。本文全部都是以<code>xlsx</code>格式為例。

相容性如下圖:

js 預覽 excel,js-xlsx的使用

<code>dist</code>目錄下有很多個js檔案,一般情況下用<code>xlsx.core.min.js</code>就夠了,<code>xlsx.full.min.js</code>則是包含了所有功能子產品。

js 預覽 excel,js-xlsx的使用

直接<code>script</code>标簽引入即可:

讀取excel

讀取excel主要是通過<code>xlsx.read(data, {type: type});</code>方法來實作,傳回一個叫<code>workbook</code>的對象,type主要取值如下:

<code>base64</code>: 以base64方式讀取;

<code>binary</code>: binarystring格式(byte n is data.charcodeat(n))

<code>string</code>: utf8編碼的字元串;

<code>buffer</code>: nodejs buffer;

<code>array</code>: uint8array,8位無符号數組;

<code>file</code>: 檔案的路徑(僅nodejs下支援);

直接上代碼:

<code>workbook</code>裡面有什麼東西呢,我們列印出來看一下:

js 預覽 excel,js-xlsx的使用

可以看到,<code>sheetnames</code>裡面儲存了所有的sheet名字,然後<code>sheets</code>則儲存了每個sheet的具體内容(我們稱之為<code>sheet object</code>)。每一個<code>sheet</code>是通過類似<code>a1</code>這樣的鍵值儲存每個單元格的内容,我們稱之為單元格對象(<code>cell object</code>):

js 預覽 excel,js-xlsx的使用

每一個<code>sheet object</code>表示一張表格,隻要不是<code>!</code>開頭的都表示普通<code>cell</code>,否則,表示一些特殊含義,具體如下:

<code>sheet['!ref']</code>:表示所有單元格的範圍,例如從a1到f8則記錄為<code>a1:f8</code>;

<code>sheet[!merges]</code>:存放一些單元格合并資訊,是一個數組,每個數組由包含<code>s</code>和<code>e</code>構成的對象組成,<code>s</code>表示開始,<code>e</code>表示結束,<code>r</code>表示行,<code>c</code>表示列;

等等;

關于單元格合并,看懂下面這張圖基本上就沒問題了:

js 預覽 excel,js-xlsx的使用

結果如下:

js 預覽 excel,js-xlsx的使用

每一個單元格是一個對象(<code>cell object</code>),主要有<code>t</code>、<code>v</code>、<code>r</code>、<code>h</code>、<code>w</code>等字段(詳見這裡):

t:表示内容類型,<code>s</code>表示string類型,<code>n</code>表示number類型,<code>b</code>表示boolean類型,<code>d</code>表示date類型,等等

v:表示原始值;

f:表示公式,如<code>b2+b3</code>;

h:html内容

w:格式化後的内容

r:富文本内容<code>rich text</code>

等等

普通方法:

根據<code>!ref</code>确定excel的範圍,再根據<code>!merges</code>确定單元格合并(如果有),最後輸出整個table,比較麻煩,幸運的是,插件自身已經寫好工具類<code>xlsx.utils</code>給我們直接使用,無需我們自己周遊,工具類輸出主要包括如下:

js 預覽 excel,js-xlsx的使用

有些不常用,常用的主要是:

<code>xlsx.utils.sheet_to_csv</code>:生成csv格式

<code>xlsx.utils.sheet_to_txt</code>:生成純文字格式

<code>xlsx.utils.sheet_to_html</code>:生成html格式

<code>xlsx.utils.sheet_to_json</code>:輸出json格式

常用的主要是<code>sheet_to_csv</code>或者<code>sheet_to_html</code>,轉csv的話會忽略格式、單元格合并等資訊,是以複雜表格可能不适用。轉html的話會保留單元格合并,但是生成的是<code>代碼,而不是</code>,需要對表格進行一些定制時不太友善,是以具體還是要視情況來采用合适的工具類。

這裡寫一個采用轉csv方式輸出結果的簡單示例,可點選這裡檢視線上demo:

導出excel

導出分為2種,一種是基于現有excel修改,一種是全新生成,前者比較簡單,我們這裡着重講後者。

導出excel檔案,主要是如何生成一個<code>sheet</code>,我們這裡寫一個最簡單的csv轉excel示例:

拿到上面的blob對象就可以直接下載下傳了

是以,最終下載下傳實作如下:

其實上面這些代碼都不需要我們手寫,官方已經提供好了現成的工具類給我們使用,主要包括:

<code>aoa_to_sheet</code>: 這個工具類最強大也最實用了,将一個二維數組轉成sheet,會自動處理number、string、boolean、date等類型資料;

<code>table_to_sheet</code>: 将一個<code>table dom</code>直接轉成sheet,會自動識别<code>colspan</code>和<code>rowspan</code>并将其轉成對應的單元格合并;

<code>json_to_sheet</code>: 将一個由對象組成的數組轉成sheet;

<code>aoa_to_sheet</code>示例:

<code>table_to_sheet</code>就更簡單了,直接<code>xlsx.utils.table_to_sheet($('table')[0])</code>即可;

一般來說,前端生成<code>excel</code>而不是<code>csv</code>最主要目的都是為了解決csv不能實作單元格合并的問題,要不然直接導出csv檔案就好了,何必引入幾百kb的插件。

假設我們要生成如下格式的excel檔案,其中<code>a1-c1</code>進行單元格合并:

js 預覽 excel,js-xlsx的使用

代碼如下:

需要注意的地方就是被合并的單元格要用<code>null</code>預留出位置,否則後面的内容(本例中是第四列<code>其它資訊</code>)會被覆寫。