index.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. 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. 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. 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. }
  49. function readWorkbook (file, callback) {
  50. const reader = new FileReader()
  51. reader.onload = (e) => {
  52. const data = e.target.result
  53. const workbook = XLSX.read(data, {type: 'binary', cellDates: true})
  54. console.log('Workbook after read:', workbook)
  55. if (workbook.SheetNames.length !== 1) {
  56. throw Error(`Expected only one worksheet in the file, but found ${workbook.SheetNames.length}.`)
  57. }
  58. const worksheet = XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]], { header: 1, raw: true })
  59. callback(worksheet)
  60. }
  61. reader.readAsBinaryString(file)
  62. }
  63. export default { Workbook, SheetFromArray, saveAs, readWorkbook }