123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- var Excel =
- {
- open : function(data, filename, sheetname) {
- this.name = sheetname || 'sheet1';
- this.sheet = XLSX.utils.aoa_to_sheet(data, {raw: true});
- this.autoWidthFunc(this.sheet, data);
- if (filename.substr(-5).toLowerCase() !== '.xlsx') {
- filename += '.xlsx';
- }
- this.openDownloadDialog(this.sheet2blob(this.sheet, this.name), filename);
- },
- autoWidthFunc : function (ws, data) {
- // set worksheet max width per col
- const colWidth = data.map(row =>
- row.map(val => {
- // if null/undefined
- if (val == null) {
- return { wch: 10 };
- } else if (val.toString().charCodeAt(0) > 255) {
- // if chinese
- var l = val.toString().length;
- var n = l + l*0.5;
- return { wch: n * 2 };
- } else {
- var l = val.toString().length;
- var n = l + l*0.5;
- return { wch: n };
- }
- })
- );
- // start in the first row
- const result = colWidth[0];
- for (let i = 1; i < colWidth.length; i++) {
- for (let j = 0; j < colWidth[i].length; j++) {
- if (result[j].wch < colWidth[i][j].wch) {
- result[j].wch = colWidth[i][j].wch;
- }
- }
- }
- ws['!cols'] = result;
- },
- export : function (url, data) {
- var self = this;
- var filename = '';
- var head = [];
- var alldata = [];
- var loading = layer.msg('正在加载 <span data-upload-page></span>,完成<span data-upload-progress>0</span>%', {time:0,icon: 1});
- nextPage(1, 1);
- function nextPage(curPage, maxPage) {
- if (curPage > maxPage) {
- alldata.unshift(head);
- this.result = alldata;
- if (this.result !== false) {
- self.open(this.result, filename || '文件下载.xlsx');
- } else {
- console.log('格式化函数返回`false`,已终止数据导出操作', alldata, this.result);
- }
- layer.close(loading);
- } else {
- $.post(url, {excel_type:1,pg:curPage,json:1}, function (ret) {
- var ret = eval('(' + ret + ')');
- if (ret.status == 1 && ret.data) {
- filename = ret.data.filename;
- head = ret.data.head;
- alldata = alldata.concat(ret.data.body);
- curPage = ret.page.current_page;
- maxPage = ret.page.total_page;
- $('[data-upload-page]').html(curPage + '/' + maxPage);
- $('[data-upload-progress]').html((curPage / maxPage * 100).toFixed(2));
- return nextPage(curPage + 1, maxPage, false);
- } else {
- layer.close(loading);
- layer.alert(ret.msg);
- }
- }, false);
- }
- }
- },
- /*! Sheet 转下载对象 */
- sheet2blob : function(sheet, name) {
- this.workbook = {SheetNames: [name], Sheets: {}};
- this.workbook.Sheets[name] = sheet;
- this.content = XLSX.write(this.workbook, {
- type: 'binary', bookSST: false, bookType: 'xlsx',
- });
- return new Blob([this.toArrayBuffer(this.content)], {
- type: "application/octet-stream"
- });
- },
- /*! 字符串转 ArrayBuffer */
- toArrayBuffer : function(s) {
- this.buff = new ArrayBuffer(s.length);
- this.view = new Uint8Array(this.buff);
- for (this.index = 0; this.index !== s.length; ++this.index) {
- this.view[this.index] = s.charCodeAt(this.index) & 0xFF;
- }
- return this.buff;
- },
- /*! 通用的打开下载对话框方法 */
- openDownloadDialog : function(location, filename) {
- if (typeof location == 'object' && location instanceof Blob) {
- location = URL.createObjectURL(location);
- }
- this.link = document.createElement('a');
- this.link.download = filename || Date.now() + '.xlsx';
- this.link.href = location;
- if (window.MouseEvent) {
- this.event = new MouseEvent('click');
- } else {
- this.event = document.createEvent('MouseEvents');
- this.event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
- }
- this.link.dispatchEvent(this.event);
- }
- }
|