excel.xlsx.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. define(function () {
  2. /*! 定义构造函数 */
  3. function Excel(data, name) {
  4. if (data && name) this.export(data, name);
  5. }
  6. /*! 默认导出配置 */
  7. Excel.prototype.options = {writeOpt: {bookSST: true}};
  8. /*! 导出 Excel 文件 */
  9. Excel.prototype.export = function (data, name) {
  10. if (name.substring(0, -5).toLowerCase() !== '.xlsx') name += '.xlsx';
  11. layui.excel.exportExcel(data, name, 'xlsx', this.options || {writeOpt: {bookSST: true}});
  12. };
  13. /*! 绑定导出的事件 */
  14. Excel.prototype.bind = function (done, filename) {
  15. var that = this;
  16. this.options = {}; // {writeOpt: {bookSST: true}};
  17. $('body').off('click', '[data-form-export]').on('click', '[data-form-export]', function () {
  18. var form = $(this).parents('form');
  19. var name = this.dataset.filename || filename;
  20. var method = this.dataset.method || form.attr('method') || 'get';
  21. var location = this.dataset.excel || this.dataset.formExport || form.attr('action') || '';
  22. var sortType = $(this).attr('data-sort-type') || '', sortField = $(this).attr('data-sort-field') || '';
  23. if (sortField.length > 0 && sortType.length > 0) {
  24. location += (location.indexOf('?') > -1 ? '&' : '?') + '_order_=' + sortType + '&_field_=' + sortField;
  25. }
  26. that.load(location, form.serialize(), method).then(function (ret) {
  27. that.export(done.call(that, ret, []), name);
  28. }).fail(function (ret) {
  29. $.msg.tips(ret || '文件导出失败');
  30. });
  31. });
  32. };
  33. /*! 加载导出的文档 */
  34. Excel.prototype.load = function (url, data, method) {
  35. return (function (defer, lists, loaded) {
  36. loaded = $.msg.loading("正在加载 <span data-upload-count>0.00</span>%");
  37. return (lists = []), LoadNextPage(1, 1), defer;
  38. function LoadNextPage(curPage, maxPage, urlParams) {
  39. var proc = (curPage / maxPage * 100).toFixed(2);
  40. $('[data-upload-count]').html(proc > 100 ? '100.00' : proc);
  41. if (curPage > maxPage) return $.msg.close(loaded), defer.resolve(lists);
  42. urlParams = (url.indexOf('?') > -1 ? '&' : '?') + 'output=json&not_cache_limit=1&limit=100&page=' + curPage;
  43. $.form.load(url + urlParams, data, method, function (ret) {
  44. if (ret.code) {
  45. lists = lists.concat(ret.data.list);
  46. if (ret.data.page) LoadNextPage((ret.data.page.current || 1) + 1, ret.data.page.pages || 1);
  47. } else {
  48. defer.reject('数据加载异常');
  49. }
  50. return false;
  51. }, false);
  52. }
  53. })($.Deferred());
  54. };
  55. /*! 直接推送表格内容 */
  56. Excel.prototype.push = function (url, sheet, cols, filter) {
  57. var loaded, $input;
  58. $input = $('<input class="layui-hide" type="file" accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet">');
  59. $input.appendTo($('body')).click().on('change', function (event) {
  60. if (!event.target.files || event.target.files.length < 1) return $.msg.tips('没有可操作文件');
  61. loaded = $.msg.loading('<span data-load-name>读取</span> <span data-load-count>0.00%</span>');
  62. try {
  63. // 导入Excel数据,并逐行上传处理
  64. layui.excel.importExcel(event.target.files, {}, function (data) {
  65. if (!data[0][sheet]) return $.msg.tips('未读取到表[' + sheet + ']的数据');
  66. var _cols = {}, _data = data[0][sheet], items = [], row, col, key, item;
  67. for (row in _data) if (parseInt(row) + 1 === parseInt(cols._ || '1')) {
  68. for (col in _data[row]) for (key in cols) if (_data[row][col] === cols[key]) _cols[key] = col;
  69. } else if (parseInt(row) + 1 > cols._ || 1) {
  70. item = {};
  71. for (key in _cols) item[key] = CellToValue(_data[row][_cols[key]]);
  72. items.push(item);
  73. }
  74. PushQueue(items, items.length, 0, 0, 1);
  75. });
  76. } catch (e) {
  77. $.msg.error('读取 Excel 文件失败!')
  78. }
  79. });
  80. /*! 单项推送数据 */
  81. function PushQueue(items, total, ers, oks, idx) {
  82. if ((total = items.length) < 1) return CleanAll(), $.msg.tips('未读取到有效数据');
  83. return (ers = 0, oks = 0, idx = 0), $('[data-load-name]').html('更新'), DoPostItem(idx, items[idx]);
  84. /*! 执行导入的数据 */
  85. function DoPostItem(idx, item, data) {
  86. if (idx >= total) {
  87. return CleanAll(), $.msg.success('共处理' + total + '条记录( 成功 ' + oks + ' 条, 失败 ' + ers + ' 条 )', 3, function () {
  88. $.form.reload();
  89. });
  90. } else {
  91. var proc = (idx * 100 / total).toFixed(2);
  92. $('[data-load-count]').html((proc > 100 ? '100.00' : proc) + '%( 成功 ' + oks + ' 条, 失败 ' + ers + ' 条 )');
  93. /*! 单元数据过滤 */
  94. data = item;
  95. if (filter && (data = filter(item)) === false) {
  96. return (ers++), DoPostItem(idx + 1, items[idx + 1]);
  97. }
  98. /*! 提交单个数据 */
  99. DoUpdate(url, data).then(function (ret) {
  100. (ret.code ? oks++ : ers++), DoPostItem(idx + 1, items[idx + 1]);
  101. });
  102. }
  103. }
  104. }
  105. /*! 清理文件选择器 */
  106. function CleanAll() {
  107. $input.remove();
  108. if (loaded) $.msg.close(loaded);
  109. }
  110. /*! 表格单元内容转换 */
  111. function CellToValue(v) {
  112. if (typeof v !== 'undefined' && /^\d+\.\d{12}$/.test(v)) {
  113. return LAY_EXCEL.dateCodeFormat(v, 'YYYY-MM-DD HH:ii:ss');
  114. } else {
  115. return typeof v !== 'undefined' ? v : '';
  116. }
  117. }
  118. /*! 队列方式上传数据 */
  119. function DoUpdate(url, item) {
  120. return (function (defer) {
  121. return $.form.load(url, item, 'post', function (ret) {
  122. return defer.resolve(ret), false;
  123. }, false), defer.promise();
  124. })($.Deferred());
  125. }
  126. }
  127. /*! 返回对象实例 */
  128. return new Excel;
  129. });