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、高效、轻量,它在官...