index2.html 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8"/>
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  6. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  7. <title>可视化编辑</title>
  8. <link rel="stylesheet" href="../../../../assets/libs/layui/css/layui.css"/>
  9. <link rel="stylesheet" href="../css/soulTable.css"/>
  10. </head>
  11. <body>
  12. <!-- 页面加载loading -->
  13. <div class="page-loading">
  14. <div class="ball-loader">
  15. <span></span><span></span><span></span><span></span>
  16. </div>
  17. </div>
  18. <!-- 正文开始 -->
  19. <div class="layui-fluid">
  20. <div class="layui-card">
  21. <div class="layui-card-body">
  22. <table id="myTable" lay-filter="test"></table>
  23. </div>
  24. </div>
  25. </div>
  26. <!-- js部分 -->
  27. <script type="text/javascript" src="../../../../assets/libs/layui/layui.js"></script>
  28. <script type="text/javascript" src="../../../../assets/js/common.js?v=312"></script>
  29. <script type="text/javascript" src="../../../../assets/libs/jquery/jquery-3.2.1.min.js"></script>
  30. <script>
  31. layui.use(['form', 'table', 'soulTable'], function () {
  32. var table = layui.table,
  33. soulTable = layui.soulTable;
  34. var excel = layui.excel;
  35. var insTb = table.render({
  36. elem: '#myTable'
  37. ,
  38. toolbar: true
  39. ,
  40. defaultToolbar: ['filter', 'print', { //自定义导出
  41. title: '导出'
  42. , layEvent: 'LAYTABLE_EXPORT_EXCEL'
  43. , icon: 'layui-icon-export'
  44. }]
  45. ,
  46. url: 'http://localhost:63342/aqpt/aqpt-old/src/main/resources/static/back/assets/module/layui-soul-table/demo/data-1.json'
  47. ,
  48. height: 500
  49. ,
  50. page: false
  51. ,
  52. cols: [[
  53. {title: '1-1', colspan: 3, align: 'center'},
  54. {title: '1-2', colspan: 2},
  55. {field: 'heat', title: '点赞数', width: 112, rowspan: 3, sort: true},
  56. {field: 'createTime', title: '录入时间', rowspan: 3, width: 165, fixed: 'right'}
  57. ], [
  58. {title: '2-1', colspan: 2},
  59. {merge: true, field: 'author', title: '作者', rowspan: 2, width: 165},
  60. {title: '2-2', colspan: 2}
  61. ], [
  62. {merge: true, field: 'title', title: '诗词', width: 200, sort: true},
  63. {merge: true, field: 'dynasty', title: '朝代', width: 100, sort: true},
  64. {merge: true, field: 'content', title: '内容', width: 123},
  65. {merge: true, field: 'type', title: '类型', width: 112}
  66. ]]
  67. // ,
  68. // excel: {
  69. // filename: '复杂表头导出.xlsx', add: {
  70. // top: {
  71. // // data: [
  72. // // ['表头1-1'], //头部第一行数据,由于我设置了后面的数据merge了,就只写一个
  73. // // ['表头2-1', '', '', '表头2-2'] // 头部第二行数据, 中间的空数据是为了 merge 使用
  74. // // ],
  75. // // heights: [100, 50],
  76. // merge: [['1,1', '1,5'], ['2,1', '2,5'], ['2,4', '2,8']]
  77. // },
  78. // bottom: {
  79. // // data: [
  80. // // ['表尾1-1', '', '', '表尾1-2'], // 尾部第一行数据, 中间的空数据是为了 merge 使用
  81. // // ['表尾2-1'] //尾部第二行数据,由于我设置了后面的数据merge了,就只写一个
  82. // // ],
  83. // // heights: [50, 100],
  84. // merge: [['1,1', '1,5'], ['2,1', '2,5'], ['2,4', '2,8']]
  85. // }
  86. // }
  87. // }
  88. ,
  89. done: function () {
  90. soulTable.render(this)
  91. }
  92. });
  93. //监听头工具栏事件
  94. table.on('toolbar(test)', function (obj) {
  95. var checkStatus = table.checkStatus(obj.config.id);
  96. switch (obj.event) {
  97. //自定义头工具栏右侧图标 - 导出
  98. case 'LAYTABLE_EXPORT_EXCEL':
  99. soulTable.export(insTb, {filename: '复杂表头导出.xlsx'},
  100. {
  101. mergeData: true,
  102. dependKey: 'title',
  103. lineStyleConfig: [
  104. {
  105. field: 'title', // 字段名称
  106. type: '1', // 字段设置类型 1=>直接设置样式属性, 2=> 根据数值类型设置属性
  107. style: { // 样式属性
  108. bgColor: 'ffffff',
  109. color: '666666'
  110. }
  111. },
  112. {
  113. field: 'heat', // 字段名称
  114. type: '2', // 字段设置类型 1=>直接设置样式属性, 2=> 根据数值类型设置属性
  115. numericType: [
  116. {
  117. typeNumber: 0,
  118. style: { // 样式属性
  119. bgColor: 'F3565D',
  120. color: '666666'
  121. }
  122. },
  123. {
  124. typeNumber: 3803,
  125. style: { // 样式属性
  126. bgColor: 'FFA500',
  127. color: '666666'
  128. }
  129. },
  130. {
  131. typeNumber: 15,
  132. style: { // 样式属性
  133. bgColor: 'dfba49',
  134. color: '666666'
  135. }
  136. }
  137. ],
  138. }
  139. ]
  140. }
  141. );
  142. break;
  143. }
  144. ;
  145. });
  146. /**
  147. * by yutons
  148. * Array.from() 非常方便的将一个类数组的集合 ==》 数组,直接使用数组身上的方法。例如:常用的map,foreach…
  149. * 但是,问题来了,IE不识别Array.from这个方法。所以写了它兼容IE的写法。
  150. */
  151. if (!Array.from) {
  152. Array.from = function (el) {
  153. return Array.apply(this, el);
  154. }
  155. }
  156. //表格导出
  157. function exportFile(id) {
  158. //根据传入tableID获取表头
  159. var headers = $("div[lay-id=" + id + "] .layui-table-box table").get(0);
  160. var htrs = Array.from(headers.querySelectorAll('tr'));
  161. var titles = {};
  162. for (var j = 0; j < htrs.length; j++) {
  163. var hths = Array.from(htrs[j].querySelectorAll("th"));
  164. for (var i = 0; i < hths.length; i++) {
  165. var clazz = hths[i].getAttributeNode('class').value;
  166. // if (clazz != ' layui-table-col-special' && clazz != 'layui-hide') {
  167. //排除居左、具有、隐藏字段
  168. //修改:默认字段data-field+i,兼容部分数据表格中不存在data-field值的问题
  169. titles['data-field' + i] = hths[i].innerText;
  170. // }
  171. }
  172. }
  173. //根据传入tableID获取table内容
  174. var bodys = $("div[lay-id=" + id + "] .layui-table-box table").get(1);
  175. var btrs = Array.from(bodys.querySelectorAll("tr"))
  176. var bodysArr = new Array();
  177. for (var j = 0; j < btrs.length; j++) {
  178. var contents = {};
  179. var btds = Array.from(btrs[j].querySelectorAll("td"));
  180. for (var i = 0; i < btds.length; i++) {
  181. for (var key in titles) {
  182. //修改:默认字段data-field+i,兼容部分数据表格中不存在data-field值的问题
  183. var field = 'data-field' + i;
  184. if (field === key) {
  185. //根据表头字段获取table内容字段
  186. contents[field] = btds[i].innerText;
  187. }
  188. }
  189. }
  190. bodysArr.push(contents)
  191. }
  192. //将标题行置顶添加到数组
  193. bodysArr.unshift(titles);
  194. //导出excel
  195. console.log(excel)
  196. var mergeConf = excel.makeMergeConfig([
  197. ['A2', 'A10'],
  198. ['B3', 'B4'],
  199. ['C3', 'C4'],
  200. ['D5', 'D6'],
  201. ]);
  202. console.log(bodysArr)
  203. return false;
  204. excel.exportExcel({
  205. sheet1: bodysArr
  206. }, '用户表' + new Date().toLocaleString() + '.xlsx', 'xlsx', {
  207. extend: {
  208. // 复杂表头合并[A1,E1][A2, D4]
  209. '!merges': mergeConf
  210. }
  211. });
  212. }
  213. // var mergeConf = excel.makeMergeConfig([
  214. // ['A1', 'E1'],
  215. // ['A2', 'D4']
  216. // ]);
  217. // layui.$('#export').on('click', function() {
  218. // soulTable.export(myTable, '测试导出复杂表头.xlsx');
  219. // })
  220. })
  221. </script>
  222. </body>
  223. </html>