前序
导出excel的方法简单来说有两部思路,一个是‘excel格式’是什么格式,一个是怎么下载,后者比较简单,基本实现都是以一个a标签,设置link元素下载,问题在于前者,对于excel的格式了解比较少的时候,会比较难下手,以及再ie等其他版本的浏览器导出的时候,需要考虑什么因素?
下面还是举一个简单点的例子(比较普遍的现象)
导出一个excel文件
核心在于导出流的时候的文件格式,一般选用的是csv格式,部分时候也有用table等html来假冒excel,但是试过会有错误提示,所以不考虑,而a标签的我们以blob的格式来嵌入,而各个元素之间的,则以‘,’还有’\n’来隔开,所以大概的逻辑就是
// 以blob流的形式,组合成csv格式导出
public createLargerCsv(titleArray: Array<String>, jsonData: Array<any>) {
let str: string = ''
let blob: Blob
this.startTime = new Date()
// 使用string是因为如果是0的话会不显示,
titleArray.forEach(title => {
str += `${title.toString()},`
})
str += '\n'
jsonData.forEach(data => {
Object.values(data).forEach(o => {
str += `${o.toString()},`
})
str += '\n'
})
// 添加编码格式
blob = new Blob([str], { type: 'text/plain;charset=utf-8' })
//解决中文乱码问题
blob = new Blob([String.fromCharCode(0xFEFF), blob], { type: blob.type })
this.createLink(this.fileName, window.URL.createObjectURL(blob), FileType.csv)
this.endTime = new Date()
// 返回开始,结束时间
return {
endTime: this.endTime,
startTime: this.startTime
}
}
// 创建一条a标签的链接
private createLink(fileName: String, linkUrl: string, fileExtension: FileType) {
let aTag = document.createElement('a')
aTag.download = `${fileName}.${fileExtension}`
document.body.appendChild(aTag)
aTag.href = linkUrl
aTag.click()
document.body.removeChild(aTag)
}
注意,这只是考虑一种大体的情况,具体情况还要很多完善,只是大概让大家知道原理的实现
用法
import { AEXECEL } from { aexece }
var myExecel = new AEXECEL.AExecel('fileName');
const title = ['标题1', '标题2', '标题3', '标题4']
let data = new Array(1000000);
data.fill({ 'name1': 'value1', 'name2': 'value2', 'name3': 'value3', 'name4': 'value4' })
myExecel.createLargerCsv(title, data)
链接: js实现文件导出为excel
npm: aexecel
github:aexecel