yvanui.excel.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. /**
  2. * YvanUI
  3. *
  4. * Copyright (c) 2019 www.yvanui.com. All rights reserved.
  5. * @author luoyifan@qq.com
  6. * @time 2019-03-09 14:44:00
  7. */
  8. (function ($) {
  9. var $dg, $footer, $dlg, $fileForm, $retry;
  10. var fileIdForm = $.yvan.createId('file');
  11. function excelWindow(opts) {
  12. function startImport() {
  13. if (!$fileForm.find('input').val()) {
  14. //如果文件框中无值,就选文件
  15. $footer.find('span').html('请选择文件');
  16. $fileForm.find('input').trigger('click');
  17. $retry.linkbutton({
  18. text: '选择文件',
  19. iconCls: 'fa fa-file-excel-o'
  20. });
  21. return;
  22. }
  23. //选好了文件,就进行上传
  24. $footer.find('span').html("正在导入:" + $fileForm.find('input').val() + ". 请耐心等待...");
  25. $retry.linkbutton({
  26. text: '重试',
  27. iconCls: 'fa fa-refresh'
  28. });
  29. var formData = new FormData($fileForm[0]);
  30. opts.data = $.extend(true, {
  31. action: 'startImport'
  32. }, opts.data);
  33. if (opts.data) {
  34. for (var name in opts.data) {
  35. if (!opts.data.hasOwnProperty(name)) continue;
  36. formData.append(name, opts.data[name]);
  37. }
  38. }
  39. $dg.datagrid('loading');
  40. $.yvan.ajax({
  41. url: opts.url,
  42. type: 'post',
  43. data: formData,
  44. cache: false,
  45. processData: false,
  46. contentType: false,
  47. success: function (root) {
  48. $dg.datagrid('loaded');
  49. $dg.datagrid('loadData', root.data || []);
  50. $.yvan.msg(root.msg);
  51. $dlg.window('close');
  52. if (opts.success) {
  53. opts.success(root.data);
  54. }
  55. },
  56. error: function (root, textStatus, errorThrown) {
  57. $dg.datagrid('loaded');
  58. if (textStatus !== 'success') {
  59. $footer.find('span').html('网络错误!!');
  60. return;
  61. }
  62. if ($.type(root.data) === 'array') {
  63. $footer.find('span').html(root.msg);
  64. $dg.datagrid('loadData', root.data);
  65. } else {
  66. console.error(root);
  67. }
  68. }
  69. });
  70. }
  71. if (!opts.columns) {
  72. opts.columns = [[]];
  73. }
  74. for (var i = 0; i < opts.columns[0].length; i++) {
  75. opts.columns[0][i].styler = (function (c) {
  76. return function (value, row) {
  77. if ($.type(row['errorCollection']) === 'object' && row['errorCollection'].hasOwnProperty(c)) {
  78. return 'background-color:RED;" title="' + row['errorCollection'][c].join('\n') + '" class="easyui-tooltip';
  79. }
  80. };
  81. })(opts.columns[0][i].field);
  82. }
  83. return {
  84. xtype: 'dialog',
  85. dialogId: $.yvan.createId('dialog'),
  86. title: '导入 Excel',
  87. width: opts.width || 700,
  88. height: opts.height || 500,
  89. onOpen: function () {
  90. $dlg = $(this);
  91. //构建 multipart-form
  92. $fileForm = $('<form id=' + fileIdForm + ' enctype="multipart/form-data">'
  93. + '<input type="file" name="file" multiple="multiple" accept="application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"/>'
  94. + '</form>');
  95. $dlg.append($fileForm.hide());
  96. $fileForm.change(function () {
  97. startImport();
  98. });
  99. setTimeout(function () {
  100. $footer.find('span').html('请选择文件');
  101. if (opts.autoOpen !== false) {
  102. startImport();
  103. }
  104. }, 0);
  105. },
  106. center: {
  107. border: true,
  108. items: {
  109. xtype: 'datagrid',
  110. onRender: function () {
  111. $dg = $(this);
  112. },
  113. toolbar: [
  114. {
  115. text: '选择文件', iconCls: 'fa fa-file-excel-o',
  116. onRender: function () {
  117. $retry = $(this);
  118. },
  119. onClick: function () {
  120. startImport();
  121. }
  122. },
  123. {
  124. text: '下载模版', iconCls: 'fa fa-download', onClick: function () {
  125. $.yvan.download({
  126. url: opts.url + '?action=template',
  127. fileName: opts.fileName
  128. });
  129. }
  130. },
  131. {
  132. text: '关闭', iconCls: 'fa fa-window-close', onClick: function () {
  133. $dlg.window('close');
  134. }
  135. }
  136. ],
  137. pagination: false,
  138. remoteSort: false,
  139. singleSelect: true,
  140. striped: true,
  141. rownumbers: true,
  142. showHeader: true,
  143. emptyMsg: '',
  144. columns: opts.columns,
  145. onLoadSuccess: function () {
  146. $(".easyui-tooltip").tooltip({
  147. onShow: function () {
  148. $(this).tooltip('tip').css({
  149. borderColor: 'RED'
  150. });
  151. }
  152. });
  153. },
  154. /*frozenColumns: [[
  155. {
  156. field: 'excelRowNum', title: '行号', width: 35,
  157. styler: function (value, row) {
  158. if ($.type(row['errorCollection']) === 'object' && row['errorCollection'].hasOwnProperty('row_error')) {
  159. return 'background-color:RED;" title="' + row['errorCollection']['row_error'].join('\n ') + '" class="easyui-tooltip';
  160. }
  161. }
  162. },
  163. ]],*/
  164. data: []
  165. }
  166. },
  167. footer: {
  168. xtype: 'div',
  169. onRender: function () {
  170. $footer = $(this);
  171. },
  172. items: [
  173. '<span style="color:RED; padding-left: 10px;float: left;">&nbsp;</span>'
  174. ]
  175. }
  176. };
  177. }
  178. function excelEasyWindow(opts) {
  179. function startImport() {
  180. if (!$fileForm.find('input').val()) {
  181. //如果文件框中无值,就选文件
  182. $footer.find('span').html('请选择文件');
  183. $fileForm.find('input').trigger('click');
  184. $retry.linkbutton({
  185. text: '选择文件',
  186. iconCls: 'fa fa-file-excel-o'
  187. });
  188. return;
  189. }
  190. //选好了文件,就进行上传
  191. $footer.find('span').html("正在导入:" + $fileForm.find('input').val() + ". 请耐心等待...");
  192. $retry.linkbutton({
  193. text: '重试',
  194. iconCls: 'fa fa-refresh'
  195. });
  196. var formData = new FormData($fileForm[0]);
  197. opts.data = $.extend(true, {
  198. action: 'startImport'
  199. }, opts.data);
  200. if (opts.data) {
  201. for (var name in opts.data) {
  202. if (!opts.data.hasOwnProperty(name)) continue;
  203. formData.append(name, opts.data[name]);
  204. }
  205. }
  206. $dg.datagrid('loading');
  207. $.yvan.ajax({
  208. url: opts.url,
  209. type: 'post',
  210. data: formData,
  211. cache: false,
  212. processData: false,
  213. contentType: false,
  214. success: function (root) {
  215. $dg.datagrid('loaded');
  216. $dg.datagrid('loadData', root.data || []);
  217. $.yvan.msg(root.msg);
  218. $dlg.window('close');
  219. if (opts.success) {
  220. opts.success(root.data);
  221. }
  222. },
  223. error: function (root, textStatus, errorThrown) {
  224. $dg.datagrid('loaded');
  225. if (textStatus !== 'success') {
  226. $footer.find('span').html('网络错误!!');
  227. return;
  228. }
  229. if ($.type(root.data) === 'array') {
  230. $footer.find('span').html(root.msg);
  231. $dg.datagrid('loadData', root.data);
  232. } else {
  233. console.error(root);
  234. }
  235. }
  236. });
  237. }
  238. if (!opts.columns) {
  239. opts.columns = [[]];
  240. }
  241. for (var i = 0; i < opts.columns[0].length; i++) {
  242. opts.columns[0][i].styler = (function (c) {
  243. return function (value, row) {
  244. if ($.type(row['errorCollection']) === 'object' && row['errorCollection'].hasOwnProperty(c)) {
  245. return 'background-color:RED;" title="' + row['errorCollection'][c].join('\n') + '" class="easyui-tooltip';
  246. }
  247. };
  248. })(opts.columns[0][i].field);
  249. }
  250. return {
  251. xtype: 'dialog',
  252. dialogId: $.yvan.createId('dialog'),
  253. title: '导入 Excel',
  254. width: opts.width || 700,
  255. height: opts.height || 500,
  256. onOpen: function () {
  257. $dlg = $(this);
  258. //构建 multipart-form
  259. $fileForm = $('<form id=' + fileIdForm + ' enctype="multipart/form-data">'
  260. + '<input type="file" name="file" multiple="multiple" accept="application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"/>'
  261. + '</form>');
  262. $dlg.append($fileForm.hide());
  263. $fileForm.change(function () {
  264. startImport();
  265. });
  266. setTimeout(function () {
  267. $footer.find('span').html('请选择文件');
  268. if (opts.autoOpen !== false) {
  269. startImport();
  270. }
  271. }, 0);
  272. },
  273. center: {
  274. border: true,
  275. items: {
  276. xtype: 'datagrid',
  277. onRender: function () {
  278. $dg = $(this);
  279. },
  280. toolbar: [
  281. {
  282. text: '选择文件', iconCls: 'fa fa-file-excel-o',
  283. onRender: function () {
  284. $retry = $(this);
  285. },
  286. onClick: function () {
  287. startImport();
  288. }
  289. },
  290. {
  291. text: '关闭', iconCls: 'fa fa-window-close', onClick: function () {
  292. $dlg.window('close');
  293. }
  294. }
  295. ],
  296. pagination: false,
  297. remoteSort: false,
  298. singleSelect: true,
  299. striped: true,
  300. rownumbers: true,
  301. showHeader: true,
  302. emptyMsg: '',
  303. columns: opts.columns,
  304. onLoadSuccess: function () {
  305. $(".easyui-tooltip").tooltip({
  306. onShow: function () {
  307. $(this).tooltip('tip').css({
  308. borderColor: 'RED'
  309. });
  310. }
  311. });
  312. },
  313. /*frozenColumns: [[
  314. {
  315. field: 'excelRowNum', title: '行号', width: 35,
  316. styler: function (value, row) {
  317. if ($.type(row['errorCollection']) === 'object' && row['errorCollection'].hasOwnProperty('row_error')) {
  318. return 'background-color:RED;" title="' + row['errorCollection']['row_error'].join('\n ') + '" class="easyui-tooltip';
  319. }
  320. }
  321. },
  322. ]],*/
  323. data: []
  324. }
  325. },
  326. footer: {
  327. xtype: 'div',
  328. onRender: function () {
  329. $footer = $(this);
  330. },
  331. items: [
  332. '<span style="color:RED; padding-left: 10px;float: left;">&nbsp;</span>'
  333. ]
  334. }
  335. };
  336. }
  337. $.extend($.yvan, {
  338. importExcel: function ($sender, opts) {
  339. opts = excelWindow(opts);
  340. return $.yvan.showDialog($sender, opts);
  341. }
  342. });
  343. $.extend($.yvan, {
  344. importEasyExcel: function ($sender, opts) {
  345. opts = excelEasyWindow(opts);
  346. return $.yvan.showDialog($sender, opts);
  347. }
  348. });
  349. })(jQuery);