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
}
}
网友评论