js導出的xlsx無法打開_js文件操作之——導出Excel (js-xlsx)

前陣子跟server同學討論一個Excel導出的需求,我說JS搞不定,需要server來做,被server同學強行打臉。

今天研究了下,尼瑪,不光可以,還很強大了!

總結:經驗是害人的,尤其是在發展迅速的前端圈兒,and,需要保持饑渴,保持對新技術的敏感度。

注:以下只探討現代瀏覽器

1. 最簡單的Excel導出

原理:js可以通過base64或者blob,把一個包含一個

var tableHtml='

only one
';//base64 URL形式文件下載

var oa = document.createElement('a');

oa.href= 'data:application/vnd.ms-excel;base64,'+window.btoa(tableHtml);

oa.download= 'htmltable-base64.xls';//通過A標簽 設置文件名

oa.click();

文件,在js中,除了可以是base64,也可以是一個blob。

- base64形式的文件描述,在js或者html中,就是一個很長的base4字符串

- blob形式的文件描述,在js或者html中,是一個URL形式的字符串,他指向的是瀏覽器內存中的一個文件片段,形如"blob:http://sheetjs.com/f999f57f-b79f-4293-a317-3bbf6ea58788"

blob形式的Excel導出,如下:

//blob URL形式文件下載

var tableHtml='

only one
';var excelBlob = new Blob([tableHtml], {type: 'application/vnd.ms-excel'});var oa = document.createElement('a');

oa.href=URL.createObjectURL(excelBlob);

oa.download= 'htmltable-blob.xls';

document.body.appendChild(oa);

oa.click();

毛病:

- 這是個假的excel文件,只有xls格式可以在Excel中打開,xlsx不行。

2. 真正的Excel導出

是的,這里有一個真正的二進制Excel文件導出。

他就是一萬多star的js-xlsx,地址:https://github.com/SheetJS/js-xlsx

我花了兩個多小時,追了好一陣子他的https://github.com/SheetJS/js-xlsx/blob/master/xlsx.js,終于,我搞明白他是什么原理了。

以下拿他的官方demo舉例,http://sheetjs.com/demos/table.html。

從網頁的table DOM到Excel文件的演化過程如下:

2.1 網頁上的table

This

is

a

Test

???????

??????

你好

???

1

2

3

4

Click

to

edit

cells

2.2 sheet JSON

這里,他用一個json來描述了Excel表格中的A1,B1,C1等各個單元格。

{"Sheet JS":{"A1":{"t":"s","v":"This"},"B1":{"t":"s","v":"is"},"C1":{"t":"s","v":"a"},"D1":{"t":"s","v":"Test"},"A2":{"t":"s","v":"???????"},"B2":{"t":"s","v":"??????"},"C2":{"t":"s","v":"你好"},"D2":{"t":"s","v":"???"},"A3":{"t":"n","v":1},"B3":{"t":"n","v":2},"C3":{"t":"n","v":3},"D3":{"t":"n","v":4},"A4":{"t":"s","v":"Click"},"B4":{"t":"s","v":"to"},"C4":{"t":"s","v":"edit"},"D4":{"t":"s","v":"cells"},"!ref":"A1:D4"}}

2.3?未壓縮的zip文件

源碼中的“write_zip_type”方法,它按照標準的電子表格格式協議,把上述JSON轉成了下面的樣子。

如下,很明顯,這里面包含了一些亂碼和一些xml描述。

(這里本著不求甚解的精神,我咨詢了一下我們部門的資深技術專家,他搭眼一看,說這是一個未壓縮的zip。我也懶得輸出一下zip來驗證這個了,他說是,那就是了)

PK

??L?|ZZdocProps/core.xml<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

PK

??Ltù?44docProps/app.xml<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

SheetJSWorksheets1Sheet JSPK

??LT?8??xl/worksheets/sheet1.xml<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

ThisisaTestà?μà?£à?àˉà?à??àˉà?aà?§à?±à?aà?à?μ????¥?ê°ì§?§1234ClicktoeditcellsPK

??Lüèˉ?DDxl/workbook.xml<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

PK

??L0kTTxl/theme/theme1.xml<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

PK

??LU?ZZ

xl/styles.xml<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

PK

??L÷?00[Content_Types].xml<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

PK

??LJjùLL_rels/.rels<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

PK

??LD?dY--xl/_rels/workbook.xml.rels<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

PK

??L?|ZZdocProps/core.xmlPK

??Ltù?44docProps/app.xmlPK

??LT?8???xl/worksheets/sheet1.xmlPK

??Lüèˉ?DDxl/workbook.xmlPK

??L0kTTu xl/theme/theme1.xmlPK

??LU?ZZ

'xl/styles.xmlPK

??L÷?00 ,[Content_Types].xmlPK

??LJjùLLj3_rels/.relsPK

??LD?dY--?5xl/_rels/workbook.xml.relsPK >D8

2.4 Blob URL

其實,我最感興趣的是這兒。2.3中的一大坨字符串,通過 Uint8Array轉成了無符號數組,并通過new Blob方法,轉成了二進制文件片段,關鍵代碼如下:

functionblobify(strData) {var buf = new ArrayBuffer(strData.length), view = newUint8Array(buf);for (var i=0; i!=strData.length; ++i) view[i] = strData.charCodeAt(i) & 0xFF;returnbuf;

}var excelBlob = new Blob([blobify(data)], {type:"application/octet-stream"});var blobURL=URL.createObjectURL(excelBlob);

最后,通過URL.createObjectURL方法,把blob轉成了,肉眼可見的js和HTML中可以看到的,Blob URL,如下:

blob:http://sheetjs.com/f999f57f-b79f-4293-a317-3bbf6ea58788

尼瑪,一個html轉Excel的庫js,有20170行代碼,恩,不錯,開源萬歲。

3. 總結

看起來,先不說性能如何,上面這些關鍵API利用一下,js應該是可以導出很多種格式的文件了。

- 文本類的,txt html js css xml

- 特定協議的文檔,pdf Excel cvs(看起來word ppt 應該也可以了,懶得去查了)

- 其他各類二進制文件,zip png jpg gif (不曉得是不是可以導出音視頻...)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538206.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538206.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538206.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux上Svn環境搭建

一般情況下&#xff0c;Linux都是自帶SVN環境的。 查看svn是否安裝了 [14:50:28][rootVM60 ~]# rpm -aq subversion [14:50:30]subversion-1.6.11-9.el6_4.x86_64 [14:52:01][rootVM60 ~]# whereis svn [14:52:01]svn: /usr/bin/svn /usr/share/man/man1/svn.1.gz [14:55:…

android主流技術框架,android開發現在流行什么IDE和開發框架?

慕仙森idea, AS (android studio), adt, 其中 AS 是google 非常推薦的.看官網就知道了. 框架的話: xutils , andbase , volley等等,還有比較流行的UI界面效果,個性化控件等等.  關于 IDE 的優劣勢. 個人認為:各有各的好處.  對于以前 Java 的開發人員來說(我就是的,嘿嘿) ,…

聯想拯救者y7000加內存條_關于2020款聯想拯救者Y7000、R7000和Y7000P,r7000p選哪個好?看這里就對了...

朋友咨詢&#xff1a;作為傳媒行業&#xff0c;經常用到ps&#xff0c;pr&#xff0c;lr&#xff0c;ae&#xff0c;au&#xff0c;flash&#xff0c;3d max&#xff0c;edius等這些軟件&#xff0c;8000以內的預算&#xff0c;那么2020款聯想拯救者Y7000、R7000和Y7000P&#…

Hivesql里的limit使用誤區

select * from HIVE_D_MT_UU_H_SPARK limit 1000;讀取前1000行。需求&#xff1a;在hive表前1000行里&#xff0c;過濾出不重復的refid,imsi。錯誤的寫法&#xff1a;select distinct refid,imsi from HIVE_D_MT_UU_H_SPARK limit 1000;會去讀取全表&#xff0c;把0~1000行的不…

android 釋放bitmap fragment,,為什么重復Replace Fragment會內存泄漏

如圖&#xff0c;當點擊下面的兩個按鈕時&#xff0c;REPALCE上面的Fragmnet&#xff0c;共兩個&#xff0c;反復切換時發生了內存泄漏這是Fragment的代碼&#xff1a;public class Fragment2 extends Fragment {private List lb new ArrayList<>();NullableOverridepub…

Improved GAN

https://www.bilibili.com/video/av9770302/?p16 從之前講的basic gan延伸到unified framework&#xff0c;到WGAN 再到通過WGAN進行Generation和Transformation 復習一下GAN&#xff0c; 首先我們有一個目標&#xff0c;target分布&#xff0c;Pdata&#xff0c; 藍色部分表示…

cython加密代碼python_利用Cython對python代碼進行加密

利用Cython對python代碼進行加密Cython是屬于PYTHON的超集&#xff0c;他首先會將PYTHON代碼轉化成C語言代碼&#xff0c;然后通過c編譯器生成可執行文件。優勢&#xff1a;資源豐富&#xff0c;適合快速開發。翻譯成C后速度比較快&#xff0c;在windows環境中用cython加密后的…

Linux ftp 命令

[deepenvd26wyjl01 ~]$ ftp IP地址 Connected to 10.xxxx.191 (10.xxxx191). 220-FileZilla Server 0.9.53 beta 220-written by Tim Kosse (tim.kossefilezilla-project.org) 220 Please visit https://filezilla-project.org/ Name (10.xxxx.191:deepen): yzcloud 331 Passwo…

android viewpager 間隔,viewpager 系統兼容 clipChildren 頁卡間距

此效果在4.4以下有個bug&#xff0c;兩邊的會有遮蓋&#xff0c;但是一滑動就沒事了。。。此時需要給viewpager設置onpagerchangedListener 刷新父布局invalidateviewpager.setPagerMargin();//設置頁卡間隔viewpager.setOffscreenPageLimit(); 設置緩存數量viewpager的父布局…

python web驗證碼_python web框架Flask——手機短信驗證碼

下列代碼都是以自己的項目實例講述的&#xff0c;相關的文本內容很少&#xff0c;主要說明全在代碼注釋中。我是使用阿里云云通信的短信服務&#xff0c;第一次使用會摸不著頭緒&#xff0c;這里我們需要做些準備工作&#xff1a;1、登陸自己的賬號進入阿里云官網&#xff0c;沒…

機器學習:樣本集、驗證集(開發集)、測試集

樣本集、驗證集&#xff08;開發集&#xff09;、測試集。 Ripley, B.D&#xff08;1996&#xff09;在他的經典專著Pattern Recognition and Neural Networks中給出了這三個詞的定義。 Training set: A set of examples used for learning, which is to fit the parameters [i…

Linux ftp傳送問題 WARNING! 258831 bare linefeeds received in ASCII mode

WARNING! 258831 bare linefeeds received in ASCII mode 原因是傳輸時ftp的傳輸類型不一致。 在上傳的時候&#xff0c;選擇傳輸類型為 二進制 在Linux上用ftp命令get的時候&#xff0c;也要設置二進制 ftp> binary // 設置傳輸方式為binary

html輸入支付密碼樣式,基于JS實現類似支付寶支付密碼輸入框

基于JS實現類似支付寶支付密碼輸入框2019-01-06編程之家https://www.jb51.cc編程之家收集整理的這篇文章主要介紹了基于JS實現類似支付寶支付密碼輸入框&#xff0c;編程之家小編覺得挺不錯的&#xff0c;現在分享給大家&#xff0c;也給大家做個參考。本文實現的是一個類似支付…

海康+螢石云+云存儲多少錢一個月_400萬極清畫質 螢石C6Wi智能家居攝像機

作為全球最大安防企業海康威視旗下子品牌&#xff0c;螢石以“家庭安防”切入智能家居市場&#xff0c;螢石C6Wi作為一款融合目前市面上云臺攝像頭最新設計和最全功能的產品&#xff0c;其外觀設計獲得多項國際大獎&#xff0c;支持2K分辨率(25601440)及4倍變焦拍攝、微光全彩、…

unzip 報錯error [clas.zip]:? missing 1844 bytes in zipfile

error [clas.zip]: missing 1844 bytes in zipfile 解決方法&#xff1a; http://blog.csdn.net/zengmingen/article/details/78604574

Vue+axios統一接口管理

通過axios請求接口已經很簡單了&#xff0c;但最近在做一個vue項目&#xff0c;想著把axios請求再封裝一下&#xff0c;這樣api就可以只在一處配置成方法&#xff0c;在使用的時候直接調用這個方法。 但咱們不用每個接口都定義成一個啰嗦的axios請求方法&#xff0c;既然是想簡…

html網頁 table布局實例,HTML用Table表格對網頁布局

HTML是用于開發網頁的“超文本標記語言”&#xff0c;今天我們一起來學習一下HTMLCSS網頁布局中Table布局方式。常見的網頁布局用CSS而言一般有經典行布局、經典列布局、雙飛翼布局、圣杯布局等。今天小編教大家用Table表格布局。大家先來欣賞幾個網頁&#xff1a;這幾個網頁布…

vue設置輸入框輸入長度_Vue實現input寬度隨文字長度自適應操作

業務需求&#xff0c;輸入文字&#xff0c;后面的元要緊隨其后&#xff0c;奈何input默認是有寬度&#xff0c;我想要達到&#xff0c;輸入文字&#xff0c;動態改變input的寬度,試了很多方法&#xff0c;目前自己琢磨一種&#xff0c;有遇到問題的可以參考一下&#xff0c;直接…

JDBC 連接Hive 簡單樣例(開啟Kerberos)

今天在移動的云平臺上通過jdbc連接hive&#xff0c;發現云平臺使用了 kerberos的認證。與寧波實驗環境不同。 發現一文解決了問題&#xff0c;轉載如下&#xff1a; 原文地址&#xff1a;http://blog.csdn.net/zengmingen/article/details/78605086 -----------------------…

新年快樂輪播特效html,基于owl-carousel的卡片水平輪播展示特效

這是一款基于owl-carousel的卡片水平輪播展示特效。該卡片輪播展示特效可以通過前后導航按鈕來切換卡片&#xff0c;它是響應式設計&#xff0c;在手機等小屏幕設備上&#xff0c;會自動調節為只展示一個卡片。使用方法在頁面中引入bootstrap.css和style.css文件&#xff0c;以…