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