From dd95a0ec668f210ad5d37359f8a4ce88665dd985 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=99=AF=E7=AB=8B?= Date: Sat, 23 Jan 2021 16:46:20 +0800 Subject: [PATCH] Update excel.xlsx.js --- public/static/plugs/jquery/excel.xlsx.js | 104 ++++++++++++++++++++--- 1 file changed, 93 insertions(+), 11 deletions(-) diff --git a/public/static/plugs/jquery/excel.xlsx.js b/public/static/plugs/jquery/excel.xlsx.js index a1b3b07ba..a8892f2dd 100644 --- a/public/static/plugs/jquery/excel.xlsx.js +++ b/public/static/plugs/jquery/excel.xlsx.js @@ -8,6 +8,7 @@ define(['xlsx'], function () { XLSX.writeFile(this.work, filename); } + /*! 绑定导出的事件 */ excel.bind = function (done, filename) { $('body').off('click', '[data-form-export]').on('click', '[data-form-export]', function () { var form = $(this).parents('form'); @@ -17,6 +18,7 @@ define(['xlsx'], function () { }); }; + /*! 加载导出的文档 */ excel.load = function (url, data, done, name, method) { var alldata = []; var loading = $.msg.loading('正在加载 ,完成 0%'); @@ -47,18 +49,19 @@ define(['xlsx'], function () { } }; - excel.read = function (file) { - return (function (defer, reader, loaded) { - defer = jQuery.Deferred(), reader = new FileReader(); + /*! 读取本地的文件 */ + excel.read = function (file, filter) { + return (function (defer, reader, loaded, Work) { reader.onload = function (event) { - var work = XLSX.read(event.target.result, {type: 'binary'}); - for (var sheet in work.Sheets) if (work.Sheets.hasOwnProperty(sheet)) { - var object = {}, data = work.Sheets[sheet], keys = '', atrs = ''; + Work = XLSX.read(event.target.result, {type: 'binary'}); + for (var sheet in Work.Sheets) if (Work.Sheets.hasOwnProperty(sheet)) { + var object = {}, data = Work.Sheets[sheet], keys = '', atrs = ''; for (keys in data) if ((atrs = keys.match(/^([A-Z]+)(\d+)$/i))) { object[atrs[2]] = object[atrs[2]] || {}; - object[atrs[2]][atrs[1]] = data[keys].v; + object[atrs[2]][atrs[1]] = data[keys].v || ''; } - return jQuery.msg.close(loaded), defer.resolve(object); + defer.resolve(filter ? excel.read.filter(object, filter) : object); + break; } jQuery.msg.close(loaded) }; @@ -69,12 +72,91 @@ define(['xlsx'], function () { defer.notify((event.loaded / event.total).toFixed(4) * 100); }; if (typeof file === 'object') { - return reader.readAsBinaryString(file), defer; + return reader.readAsBinaryString(file), defer.promise(); } else { - return defer; + defer.reject('只能读取 file 文件对象'); + return defer.promise(); } - })(); + })(jQuery.Deferred(), new FileReader()); }; + /*! 直接推送文档内容 */ + excel.read.push = function (url, filterCf, filterFn) { + return (function (defer, $input, loaded) { + $input.appendTo($('body')).click(); + $input.on('change', function (event) { + if (!event.target.files || event.target.files.length < 1) return $.msg.tips('没有可操作文件'); + loaded = jQuery.msg.loading('正在读取文件 0.00%'); + excel.read(event.target.files[0], filterCf).then(function (items, total, ers, oks) { + if ((total = items.length) < 1) return closeAll(), jQuery.msg.tips('未读取到有效数据') + ers = 0, oks = 0; + jQuery('[data-load-name]').html('正在更新数据 '); + doPostItem(0, items[0]); + + /*! 执行导入的数据 */ + function doPostItem(index, item, message) { + if (index >= total) { + message = '共处理' + total + '条记录' + '( 成功 ' + oks + ' 条, 失败 ' + ers + ' 条 )'; + return closeAll(), jQuery.msg.success(message, 3, function () { + jQuery.form.reload(); + }); + } else { + message = (index * 100 / total).toFixed(2) + '%( 成功 ' + oks + ' 条, 失败 ' + ers + ' 条 )'; + jQuery('[data-load-progress]').html(message); + /*! 单元数据过滤 */ + var result = item; + if (filterFn && (result = filterFn(item)) === false) { + return (ers++), doPostItem(index + 1, items[index + 1]); + } + /*! 提交单个数据 */ + doUpdate(url, result).then(function (ret) { + ret.code ? oks++ : ers++; + doPostItem(index + 1, items[index + 1]); + }); + } + } + }).progress(function (progress) { + jQuery('[data-load-progress]').html(progress + '%') + }).fail(function () { + closeAll(); + }); + }); + return defer; + + /*! 清理文件选择器 */ + function closeAll() { + $input.remove(); + jQuery.msg.close(loaded); + } + + /*! 队列方式上传数据 */ + function doUpdate(url, item) { + return (function (defer) { + return jQuery.form.load(url, item, 'post', function (ret) { + return defer.resolve(ret), false; + }, false), defer.promise(); + })(jQuery.Deferred()); + } + })(jQuery.Deferred(), $('')); + } + + /*! 解析读取的数据 */ + excel.read.filter = function (books, cols) { + return (function (items, item, row, col, key) { + for (row in books) if (row <= 1) { + for (col in books[row]) for (key in cols) { + if (books[row][col] === cols[key].name && !cols[key].bind) { + cols[key].bind = col; + } + } + } else { + item = {}; + for (key in cols) item[key] = books[row][cols[key].bind] || '' + items.push(item); + } + return items + })([]); + } + return excel; }); \ No newline at end of file