node 简单解析 xlsx

2017-08-29  本文已影响0人  夫子有多高酱
const fs = require('fs')
const convert = require('xml-js')
const zip = require('node-zip')

module.exports.readFile = readFile

function readFile (fileName) {
  const a = zip(fs.readFileSync(fileName), { base64: false, checkCRC32: true })
  return readZip(a)
}

function readZip (f) {
  const keys = Object.keys(f.files)
  let workbookRels
  let worksheets = []
  keys.forEach(v => {
    switch (v) {
      case 'xl/_rels/workbook.xml.rels':
        workbookRels = v
        return
      default:
        if (v.length > 14) {
          const len = v.length
          if (v.startsWith('xl/worksheets')) {
            worksheets.push([v.substring(14, len - 4), v])
          }
        }
    }
  })

  if (!workbookRels) throw new Error('xl/_relx/workbook.xml.rels not found in input xlsx.')
  if (worksheets.length === 0) throw new Error('Input xlsx contains no wroksheets.')
  const returnDate = []
  console.log(worksheets)
  worksheets.forEach(v => {
    const data = readSheetsFromZipFile(f.files[v[1]]._data)
    returnDate.push({ sheetName: v[0], data })
  })
  return returnDate
}

function readSheetsFromZipFile (sheetXML) {
  const data = convert.xml2js(sheetXML)
  const sheets = []
  data.elements[0].elements.forEach(v => {
    if (v.name !== 'sheetData') return
    v.elements.forEach(v1 => {
      const s = v1.elements.map(v2 => {
        return getText(v2)
      })
      sheets.push(s)
    })
  })
  return sheets
}

function getText (d) {
  if (d.elements && d.elements[0]) {
    return getText(d.elements[0])
  } else {
    return d.text
  }
}

上一篇下一篇

猜你喜欢

热点阅读