excel文件下载下来损坏 js_js文件操作之——导出Excel (js-xlsx)
前阵子跟server同学讨论一个Excel导出的需求我说JS搞不定需要server来做被server同学强行打脸。
今天研究了下尼玛不光可以还很强大了
总结经验是害人的尤其是在发展迅速的前端圈儿and需要保持饥渴保持对新技术的敏感度。
注以下只探讨现代浏览器
1. 最简单的Excel导出
原理js可以通过base64或者blob把一个包含一个
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 网页上的tableThisisaTest
வணக்கம்สวัสดี你好가지마
1234
Clicktoeditcells
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中的一大坨字符串通过 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 (不晓得是不是可以导出音视频...)
excel文件下载下来损坏 js_js文件操作之——导出Excel (js-xlsx)相关推荐
- excel文件下载下来损坏 js_js处理文件流下载excel
this.requestUp.post(this.APIS.UPLOADFORM, formData,{ responseType: "blob"}).then(res => ...
- excel文件下载下来损坏 js_js读取本地excel文件出现问题,这是咋回事
展开全部 1.将此文件复制一份来并重命名为.zip的文自件. 然后打开bai此文件,再打开xl的文件夹du. 会看到有一个文zhi件名为daosharedStrings.xml的文件. 将此文件sha ...
- excel文件下载下来损坏 js_使用exceljs和nodejs下载的xlsx文件正在libreoffice中打开,但在excel 2007中显示已损坏...
这是我的密码.它创建一个xlsx文件,该文件在libreoffice中打开,但在excel-2007中显示为已损坏 还有workbook.xlsx.write(response)downloads.z ...
- js导出的xlsx无法打开_js文件操作之——导出Excel (js-xlsx)
前阵子跟server同学讨论一个Excel导出的需求,我说JS搞不定,需要server来做,被server同学强行打脸. 今天研究了下,尼玛,不光可以,还很强大了! 总结:经验是害人的,尤其是在发展迅 ...
- Java操作poi导出Excel自定义字体颜色
Java操作poi导出Excel自定义字体颜色 功能介绍 POI操作Excel 第一步创建一个导出的工具类 整体定义表格字体样式 自定义表格字体样式 总结 功能介绍 Apache POI 是用Java ...
- 导出 服务器 excel文件,服务器数据库导出excel文件格式
服务器数据库导出excel文件格式 内容精选 换一换 GaussDB(DWS)支持使用gs_dumpall工具导出所有数据库的全量信息,包含集群中每个数据库信息和公共的全局对象信息.可根据需要自定义导 ...
- vue使用luckySheet前端excel的在线表格,导入显示以及导出excel文件
场景: 当界面上普通的element表格已经不足以展示的数据的时候,或是为了更好的体验.由后端处理数据为二进制文档流,返回到前端直接进行显示为excel. 效果图: 代码实现: 安装引入: index ...
- 上传文件、下载文件、数据导出excel表格整理模板
上传文件 思路: 1.设置上传的路径,上传名 2.在这个路径path上新建名为filename的文件 file 3.判断该文件的父目录是否存在,若不存在就新建一个 4.用.transferTo方法将文 ...
- java生成excel文件步骤_java导出Excel文件的步骤全纪录
一.背景 当前b/s模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用excel打开(电信系统.银行系统).或者是:我们已经习惯用excel打印.这样在我们实际 ...
- vue导出excel加一个进度条_使用vue导出excel文件
今天再开发中遇到一件事情,就是怎样用已有数据导出excel文件,网上有许多方法,有说用数据流的方式,https://www.cnblogs.com/yeqrblog/p/9758981.html,但是 ...
最新文章
- c++ include 路径_头文件中,#include使用引号“”和尖括号lt;gt;有什么区别?
- unix编程艺术的设计原则
- python中使用flask实现人脸实时检测
- LeetCode 85. Maximal Rectangle --python,java解法
- 武汉大专计算机专业分数线,武汉高考分数线最低的大专,2021年武汉大专最低分数线是多少...
- Java IO (二),常见的输入/输出流
- webuploader+PHP实现超大文件分片上传的功能
- socket 中 SOCK_STREAM 和 SOCK_DGRAM的区别?
- c# 线向量生成多边形_python脚本实现abaqus前处理2D多晶粒建模(附完整源码)-Voronoi多边形的生成...
- c语言画爱心附带解释,用C语言画一个“爱心”
- http://blog.51cto.com/forsk/1531568
- 跟公司妹子交流了一下
- 【图像压缩】基于matlab DCT变换图像压缩【含Matlab源码 804期】
- EXCEL电子表格使用技巧大全
- 自走棋突然显示服务器无法定位,刀塔自走棋服务器无法定位游戏会话_刀塔自走棋服务器无法定位游戏会话怎么回事_玩游戏网...
- mysql error 1236_MySQL Got fatal error 1236原因和解决方法
- vue 图片加载完成事件
- Dev C++的安装以及基本使用方法
- python自动解析json_JsonParser–使用python编写的json解析器
- 云笔记Leanote,超级好用的一款开源云笔记