download.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import { openWindow } from '..';
  2. import { dataURLtoBlob, urlToBase64 } from './base64Conver';
  3. import * as XLSX from 'xlsx' // Vue3 版本
  4. import fs from 'file-saver'
  5. /**
  6. * Download online pictures
  7. * @param data
  8. * @param filename
  9. */
  10. export function exportElsxFile(json, fields, filename = '表格.xlsx') {
  11. json.forEach(item => {
  12. for (let i in item) {
  13. if (fields.hasOwnProperty(i)) {
  14. item[fields[i]] = item[i];
  15. }
  16. delete item[i]; //删除原先的对象属性
  17. }
  18. })
  19. let sheetName = filename //excel的文件名称
  20. let wb = XLSX.utils.book_new() //工作簿对象包含一SheetNames数组,以及一个表对象映射表名称到表对象。XLSX.utils.book_new实用函数创建一个新的工作簿对象。
  21. let ws = XLSX.utils.json_to_sheet(json, { header: Object.values(fields) }) //将JS对象数组转换为工作表。
  22. wb.SheetNames.push(sheetName)
  23. wb.Sheets[sheetName] = ws
  24. const defaultCellStyle = { font: { name: "Verdana", sz: 13, color: "FF00FF88" }, fill: { fgColor: { rgb: "FFFFAA00" } } };//设置表格的样式
  25. let wopts = { bookType: 'xlsx', bookSST: false, type: 'binary', cellStyles: true, defaultCellStyle: defaultCellStyle, showGridLines: false } //写入的样式
  26. let wbout = XLSX.write(wb, wopts)
  27. let blob = new Blob([s2ab(wbout)], { type: 'application/octet-stream' })
  28. fs.saveAs(blob, filename + '.xlsx')
  29. }
  30. const s2ab = s => {
  31. if (typeof ArrayBuffer !== 'undefined') {
  32. var buf = new ArrayBuffer(s.length)
  33. var view = new Uint8Array(buf)
  34. for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xff
  35. return buf
  36. } else {
  37. var buf = new Array(s.length);
  38. for (var i = 0; i != s.length; ++i) buf[i] = s.charCodeAt(i) & 0xFF;
  39. return buf;
  40. }
  41. }
  42. /**
  43. * Download online pictures
  44. * @param url
  45. * @param filename
  46. * @param mime
  47. * @param bom
  48. */
  49. export function downloadByOnlineUrl(url: string, filename: string, mime?: string, bom?: BlobPart) {
  50. urlToBase64(url).then((base64) => {
  51. downloadByBase64(base64, filename, mime, bom);
  52. });
  53. }
  54. /**
  55. * Download pictures based on base64
  56. * @param buf
  57. * @param filename
  58. * @param mime
  59. * @param bom
  60. */
  61. export function downloadByBase64(buf: string, filename: string, mime?: string, bom?: BlobPart) {
  62. const base64Buf = dataURLtoBlob(buf);
  63. downloadByData(base64Buf, filename, mime, bom);
  64. }
  65. /**
  66. * Download according to the background interface file stream
  67. * @param {*} data
  68. * @param {*} filename
  69. * @param {*} mime
  70. * @param {*} bom
  71. */
  72. export function downloadByData(data: BlobPart, filename: string, mime?: string, bom?: BlobPart) {
  73. const blobData = typeof bom !== 'undefined' ? [bom, data] : [data];
  74. const blob = new Blob(blobData, { type: mime || 'application/octet-stream' });
  75. const blobURL = window.URL.createObjectURL(blob);
  76. const tempLink = document.createElement('a');
  77. tempLink.style.display = 'none';
  78. tempLink.href = blobURL;
  79. tempLink.setAttribute('download', filename);
  80. if (typeof tempLink.download === 'undefined') {
  81. tempLink.setAttribute('target', '_blank');
  82. }
  83. document.body.appendChild(tempLink);
  84. tempLink.click();
  85. document.body.removeChild(tempLink);
  86. window.URL.revokeObjectURL(blobURL);
  87. }
  88. /**
  89. * Download file according to file address
  90. * @param {*} sUrl
  91. */
  92. export function downloadByUrl({
  93. url,
  94. target = '_blank',
  95. fileName,
  96. }: {
  97. url: string;
  98. target?: TargetContext;
  99. fileName?: string;
  100. }): boolean {
  101. const isChrome = window.navigator.userAgent.toLowerCase().indexOf('chrome') > -1;
  102. const isSafari = window.navigator.userAgent.toLowerCase().indexOf('safari') > -1;
  103. if (/(iP)/g.test(window.navigator.userAgent)) {
  104. console.error('Your browser does not support download!');
  105. return false;
  106. }
  107. if (isChrome || isSafari) {
  108. const link = document.createElement('a');
  109. link.href = url;
  110. link.target = target;
  111. if (link.download !== undefined) {
  112. link.download = fileName || url.substring(url.lastIndexOf('/') + 1, url.length);
  113. }
  114. if (document.createEvent) {
  115. const e = document.createEvent('MouseEvents');
  116. e.initEvent('click', true, true);
  117. link.dispatchEvent(e);
  118. return true;
  119. }
  120. }
  121. if (url.indexOf('?') === -1) {
  122. url += '?download';
  123. }
  124. openWindow(url, { target });
  125. return true;
  126. }