exportExcel.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import * as XLSX from 'xlsx'
  2. function openDownloadDialog(url, saveName) {
  3. if (typeof url == 'object' && url instanceof Blob) {
  4. url = URL.createObjectURL(url); // 创建blob地址
  5. }
  6. let aLink = document.createElement('a');
  7. aLink.href = url;
  8. aLink.download = saveName || ''; // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,file:///模式下不会生效
  9. let event;
  10. if (window.MouseEvent) event = new MouseEvent('click');
  11. else {
  12. event = document.createEvent('MouseEvents');
  13. event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
  14. }
  15. aLink.dispatchEvent(event);
  16. }
  17. // 将一个sheet转成最终的excel文件的blob对象,然后利用URL.createObjectURL下载
  18. function sheet2blob(sheet, sheetName) {
  19. sheetName = sheetName || 'sheet1';
  20. let workbook = {
  21. SheetNames: [sheetName],
  22. Sheets: {}
  23. };
  24. workbook.Sheets[sheetName] = sheet;
  25. // 生成excel的配置项
  26. let wopts = {
  27. bookType: 'xlsx', // 要生成的文件类型
  28. bookSST: false, // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
  29. type: 'binary'
  30. };
  31. let wbout = XLSX.write(workbook, wopts);
  32. let blob = new Blob([s2ab(wbout)], {type: "application/octet-stream"});
  33. // 字符串转ArrayBuffer
  34. function s2ab(s) {
  35. let buf = new ArrayBuffer(s.length);
  36. let view = new Uint8Array(buf);
  37. for (let i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
  38. return buf;
  39. }
  40. return blob;
  41. }
  42. /**
  43. * @description: 导出excel
  44. * @param {*} arr 数据是数组包含的对象
  45. * @param {*} name 名字
  46. * @return {*}
  47. */
  48. function exp(arr,name="导出") {
  49. var sheet = XLSX.utils.json_to_sheet(arr);
  50. // excel宽高设置
  51. sheet["!cols"]= arr.map(item=>{
  52. return {wch:30}
  53. })
  54. openDownloadDialog(sheet2blob(sheet), name+'.xlsx')
  55. }
  56. export default exp;