美文网首页
node 简单解析 xlsx

node 简单解析 xlsx

作者: 夫子有多高酱 | 来源:发表于2017-08-29 12:20 被阅读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
      }
    }
    
    

    相关文章

      网友评论

          本文标题:node 简单解析 xlsx

          本文链接:https://www.haomeiwen.com/subject/pejodxtx.html