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

ÃæLþù«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வணà®à¯à®à®®à¯à¸ªà¸§à¸±à¸ªà¸à¸µä½ å¥½ê°ì§ë§1234ClicktoeditcellsPK

ÃæLÜè¯ÏDDxl/workbook.xml<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

PK

ÃæL0kÞÞxl/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

ÃæLÐ?dÝ--xl/_rels/workbook.xml.rels<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

PK

ÃæLÖ|ZZdocProps/core.xmlPK

ÃæLþù«44docProps/app.xmlPK

ÃæLTÄ8ããëxl/worksheets/sheet1.xmlPK

ÃæLÜè¯ÏDDxl/workbook.xmlPK

ÃæL0kÞÞu xl/theme/theme1.xmlPK

ÃæLUôZZ

'xl/styles.xmlPK

ÃæL÷Â00 ,[Content_Types].xmlPK

ÃæLJjùLLj3_rels/.relsPK

ÃæLÐ?dÝ--ß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.mzph.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;以…