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
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 现在我们来简单的实现一个 Node 命令行(cli)文件管理程序。 效果演示 需求分析 程序在命令行中运行,那么程...
- 前言从Node.js进入人们的视野时,我们所知道的它就由这些关键字组成 事件驱动、非阻塞I/O、高效、轻量,它在官...