import {Injectable} from '@angular/core';
import {Headers, Http} from '@angular/http';
import * as XLSX from 'xlsx';
import * as FileSaver from 'file-saver';
@Injectable()
export class FileService {
constructor(private http: Http) {
}
multiDownLoadExl(dataAll, merges, sheetNames) {
console.log(merges);
const wb: XLSX.WorkBook = {SheetNames: sheetNames, Sheets: {}, Props: {}};
const toSet = XLSX.utils.json_to_sheet(dataAll, {skipHeader: true});
wb.Sheets[sheetNames[0]] = toSet; // 通过json_to_sheet转成单页(Sheet)数据
const wsname: string = wb.SheetNames[0];
const ws: XLSX.WorkSheet = wb.Sheets[wsname];
// ws['!cols'] = colProp[item]; // 单元格宽度
// ws['!rows'] = rowProp[item]; // 列高
ws['!merges'] = merges; // 合并单元格
let fileName = 'excel导出.xlsx';
this.saveAs(
new Blob([this.s2ab(XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'}))], {type: ''}), fileName);
}
saveAs(obj, fileName) { // 当然可以自定义简单的下载文件实现方式
// 这段注销的代码,通过虚拟一个a标签,加一个click事件就可以完美进行excel下载,但是,因项目需求为IE浏览器,
外加本人才疏学浅,故用了一个小窍门,通过插件FileSaver去进行文件的下载,这样下载的excel文件如下图
/*const tmpa = document.createElement('a');
tmpa.download = fileName || '下载';
tmpa.href = URL.createObjectURL(obj); // 绑定a标签
let a = encodeURIComponent(tmpa.href);
tmpa.click();
setTimeout(function () { // 延时释放
URL.revokeObjectURL(obj); // 用URL.revokeObjectURL()来释放这个object URL
}, 100);*/
FileSaver.saveAs(obj, fileName);
}
s2ab(s) {
if (typeof ArrayBuffer !== 'undefined') {
const buf = new ArrayBuffer(s.length);
const view = new Uint8Array(buf);
for (let i = 0; i !== s.length; ++i) {
view[i] = s.charCodeAt(i) & 0xFF;
}
return buf;
} else {
const buf = new Array(s.length);
for (let i = 0; i !== s.length; ++i) {
buf[i] = s.charCodeAt(i) & 0xFF;
}
return buf;
}
}
}
这样的下载方式,可以弥补File-saver下载完没有样式的bug,
