Execl.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. /**
  2. * /framework/common/download-file
  3. * 下载文件
  4. * @param string file
  5. * @return mixed
  6. */
  7. window.$ExportExcel = {
  8. _ColumnItems:[],
  9. _TablesData:[],
  10. _Options:{
  11. sheet:'Sheet1',
  12. fileName:'导出文件',
  13. },
  14. column:function (column){
  15. $ExportExcel._ColumnItems = column;
  16. return $ExportExcel;
  17. },
  18. fileName:function (file_name){
  19. $ExportExcel._Options.fileName = (file_name?file_name:'导出文件');
  20. return $ExportExcel;
  21. },
  22. sheet:function (sheet){
  23. $ExportExcel._Options.sheet = (sheet?sheet:'Sheet1');
  24. return $ExportExcel;
  25. },
  26. export:function(page) {
  27. page = page?parseInt(page):1;
  28. $App.tablesGetExportTableList(function (res, last_page){
  29. if(res.length > 0 ){
  30. $ExportExcel._TablesData = $ExportExcel._TablesData.concat(res);
  31. }
  32. if(last_page > page){
  33. $ExportExcel.export(page += 1 );return true;
  34. }else {
  35. $ExportExcel.ExportEventEntities();return true;
  36. }
  37. }, page);
  38. return false;
  39. },
  40. ExportEventEntities:function() {
  41. if($ExportExcel._TablesData.length < 1){
  42. return false;
  43. }
  44. // 用于替换数据中的换行符,是其可以在单元格内正常显示
  45. const wrapMark = '<br style="mso-data-placement:same-cell;"/>';
  46. // 设置单元格数据显示为文本格式,避免过大的数字以科学计数法的形式显示
  47. const tdTagHeader = `<td style="mso-number-format:'\@'">`;
  48. let dataStr = '<tr>'
  49. $ExportExcel._ColumnItems.forEach(function (column) {
  50. dataStr += `${tdTagHeader + column.label}</td>`;
  51. });
  52. dataStr += '</tr>';
  53. $ExportExcel._TablesData.forEach(function(item) {
  54. dataStr += '<tr>'
  55. $ExportExcel._ColumnItems.forEach(function (column){
  56. var values = $ExportExcel._ColumnFormatMap(item, column);
  57. // 这种方式本质是导出 html 文件,html 中连续的空格符会被合并成一个显示
  58. // replace(/ /g, '&nbsp;') 将空格符替换成 &nbsp; 使其可以正常显示
  59. dataStr += tdTagHeader + `${values}`.replace(/ /g, '&nbsp;').replace(/\n/g, wrapMark) + '</td>';
  60. });
  61. dataStr += '</tr>'
  62. });
  63. const template = `<html xmlns:o="urn:schemas-microsoft-com:office:office"
  64. xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40">
  65. <head><meta charset="UTF-8" />
  66. <!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>
  67. <x:Name>${$ExportExcel._Options.sheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/>
  68. </x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->
  69. </head><body><table>${dataStr}</table></body></html>`;
  70. const link = document.createElement("a");
  71. link.href = 'data:application/vnd.ms-excel;base64,' + window.btoa(unescape(encodeURIComponent(template))) ;
  72. link.download = $ExportExcel._Options.fileName + ".xls";
  73. link.style.display = 'none';
  74. link.click();
  75. },
  76. //
  77. // exportToExcel:function(data, fileName) {
  78. // var csv = this.convertToCSV(data); // 将数据转换为CSV格式
  79. // var blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' }); // 创建Blob对象
  80. // var url = URL.createObjectURL(blob); // 转换为URL
  81. // var link = document.createElement('a'); // 创建<a>元素
  82. // link.setAttribute('href', url);
  83. // link.setAttribute('download', `${fileName}.csv`);
  84. // link.style.visibility = 'hidden';
  85. // document.body.appendChild(link);
  86. // link.click(); // 触发下载
  87. // document.body.removeChild(link); // 清理
  88. // },
  89. _ColumnFormatMap:function (item, column){
  90. var values = item[column.key]?item[column.key]:'';
  91. switch (column.key){
  92. case 'stated':
  93. return (parseInt(values) === 10)?'启用':'禁用';
  94. break;
  95. case 'updated_at':
  96. case 'created_at':
  97. return $Utils.formatDate('yyyy-MM-dd hh:mm:ss', values);
  98. }
  99. if((typeof column.format) === 'undefined'){
  100. return item[column.key];
  101. }
  102. switch (column.format){
  103. case 'datetime':
  104. return $Utils.formatDate('yyyy-MM-dd hh:mm:ss', values)
  105. break;
  106. case 'date':
  107. return $Utils.formatDate('yyyy-MM-dd', values)
  108. break;
  109. case 'map':
  110. if(!column.formatMap){
  111. return values;
  112. }
  113. return $Arrays.arrayLookup(column.formatMap,'value', values, 'label')
  114. break;
  115. default:
  116. return values;
  117. }
  118. }
  119. }