excel.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import XLSX from 'xlsx'
  2. import FileSaver from 'file-saver'
  3. import Blob from 'blob'
  4. function datenum (v, date1904) {
  5. if (date1904) v += 1462
  6. var epoch = Date.parse(v)
  7. return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000)
  8. }
  9. export function SheetFromArray (data, opts) {
  10. var ws = {}
  11. var range = {s: {c: 10000000, r: 10000000}, e: {c: 0, r: 0 }}
  12. for (var R = 0; R !== data.length; ++R) {
  13. for (var C = 0; C !== data[R].length; ++C) {
  14. if (range.s.r > R) range.s.r = R
  15. if (range.s.c > C) range.s.c = C
  16. if (range.e.r < R) range.e.r = R
  17. if (range.e.c < C) range.e.c = C
  18. var cell = {v: data[R][C] }
  19. if (cell.v == null) continue
  20. var cell_ref = XLSX.utils.encode_cell({c: C, r: R})
  21. if (typeof cell.v === 'number') cell.t = 'n'
  22. else if (typeof cell.v === 'boolean') cell.t = 'b'
  23. else if (cell.v instanceof Date) {
  24. cell.t = 'n'; cell.z = XLSX.SSF._table[14]
  25. cell.v = datenum(cell.v)
  26. } else cell.t = 's'
  27. ws[cell_ref] = cell
  28. }
  29. }
  30. if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range)
  31. return ws
  32. }
  33. export function Workbook () {
  34. if (!(this instanceof Workbook)) return new Workbook()
  35. this.SheetNames = []
  36. this.Sheets = {}
  37. }
  38. function s2ab (s) {
  39. var buf = new ArrayBuffer(s.length)
  40. var view = new Uint8Array(buf)
  41. for (var i = 0; i !== s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF
  42. return buf
  43. }
  44. export function saveAs (workbook, filename) {
  45. const wopts = {bookType: 'xlsx', bookSST: false, type: 'binary'}
  46. const wbout = XLSX.write(workbook, wopts)
  47. FileSaver.saveAs(new Blob([s2ab(wbout)], {type: ''}), filename)
  48. }