热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

jshtml导出excel文件,js文件操作之——导出Excel(jsxlsx)

#js文件操作之——导出Excel(js-xlsx)前阵子跟server同学讨论一个Excel导出的需求我说JS搞不定需要server来做被server同学强行打脸。今天研究了下尼

#js文件操作之——导出Excel (js-xlsx)

前阵子跟server同学讨论一个Excel导出的需求我说JS搞不定需要server来做被server同学强行打脸。

今天研究了下尼玛不光可以还很强大了

总结经验是害人的尤其是在发展迅速的前端圈儿and需要保持饥渴保持对新技术的敏感度。

注以下只探讨现代浏览器

1. 最简单的Excel导出

原理js可以通过base64或者blob把一个包含一个的串导出成xx.xls格式。而Excel可以打开html文件。这样看起来就是一个成功的Excel导出。

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

5111dd22a18f33a04c2f7cd7670da073.png

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

PK

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

SheetJSWorksheets1Sheet JSPK

ÃæLTÄ8ããxl/worksheets/sheet1.xml

ThisisaTestவணà®à¯à®à®®à¯à¸ªà¸§à¸±à¸ªà¸à¸µä½ 好ê°ì§ë§1234ClicktoeditcellsPK

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

PK

ÃæL0kÞÞxl/theme/theme1.xml

PK

ÃæLUôZZ

xl/styles.xml

PK

ÃæL÷Â00[Content_Types].xml

PK

ÃæLJjùLL_rels/.rels

PKÃæLÐ?dÝ--xl/_rels/workbook.xml.rels

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中的一大坨字符串通过 Uine8Array转成了无符号数组并通过new Blob方法转成了二进制文件片段关键代码如下

function blobify(strData) { var buf = new ArrayBuffer(strData.length), view = new Uint8Array(buf); for (var i=0; i!=strData.length; ++i) view[i] = strData.charCodeAt(i) & 0xFF; return buf;

}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.cnblogs.com/youryida



推荐阅读
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • python3 nmap函数简介及使用方法
    本文介绍了python3 nmap函数的简介及使用方法,python-nmap是一个使用nmap进行端口扫描的python库,它可以生成nmap扫描报告,并帮助系统管理员进行自动化扫描任务和生成报告。同时,它也支持nmap脚本输出。文章详细介绍了python-nmap的几个py文件的功能和用途,包括__init__.py、nmap.py和test.py。__init__.py主要导入基本信息,nmap.py用于调用nmap的功能进行扫描,test.py用于测试是否可以利用nmap的扫描功能。 ... [详细]
  • Jquery 跨域问题
    为什么80%的码农都做不了架构师?JQuery1.2后getJSON方法支持跨域读取json数据,原理是利用一个叫做jsonp的概念。当然 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 本文介绍了解决mysql 5.1启动问题的方法,通过修改my.ini文件中的相关配置,包括innodb_data_home_dir和skip-innodb等,可以解决启动问题。同时还介绍了如何调整内存池来存储metadata信息。 ... [详细]
author-avatar
我是你的小pig的美丽家园
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有