之前是用 node-xlsx 来处理excel文件,主要是读取数据或者根据数据生成excel文件。不过,node-xlsx 似乎无法处理超大的excel(100MB以上),例如:

var xlsx = require('node-xlsx');
var sheets = xlsx.parse('./test.xlsx'); //获取所有sheets
 
文件中有一个sheet的体积比较大,得到的是一个空的数组,估计是因为内存加载不进去。想要解决这个问题,似乎只有一种方法,就是用stream的方式,一段一段提取excel里面的数据。
然而,node-xlsx 不支持用流的方式读取Excel,因为excel文件编码的原因,只有把excel转为xml或者csv,才能用流的方式处理。
 
 

感谢这位老哥,找到了xlsx-extract 这个库,完美解决用流的方式读取excel

 var powXLSX = require('xlsx-extract').XLSX;
new powXLSX().extract('./test.xlsx', { sheet_all: true }) // 读取文件所有sheet,默认只读取第一张sheet,参数配置如下
.on('sheet', function (sheet) {
console.log('sheet', sheet); // sheet is array [sheetname, sheetid, sheetnr]
})
.on('row', function (row) {
console.log('row', row); // row is a array of values or []
})
.on('cell', function (cell) {
// console.log('cell', cell); //cell is a value or null
})
.on('error', function (err) {
console.error('error', err);
})
.on('end', function (err) {
console.log('eof');
});
options = {
// sheet selection (provide one of the following)
sheet_name?: string; // select by sheet name
sheet_nr?: string; // default "1" - select by number of the sheet starting on 1
sheet_id?: string; // select by sheet id, e.g. "1"
sheet_rid?: string; // select by internal sheet rid, e.g. "rId1'
sheet_all?: boolean; // default false - select all sheets
// sax parser selection
parser?: string; // default "sax" - 'sax'|'expat'
// row selection
ignore_header?: number; // default 0 - the number of header lines to ignore
include_empty_rows?: boolean; // default false - include empty rows in the middle/at start
// how to output sheet, rows and cells
format?: string; // default array - convert to 'array'||'json'||'tsv'||'obj'
// tsv output options
tsv_float_comma?: boolean; // default false - use "," als decimal point for floats
tsv_delimiter?: string; // default '\t' - use specified character to field delimiter
tsv_endofline?: string; // default depending on your operating system (node os.EOL) e.g. '\n'
// cell value formats
raw_values?: boolean; // default false - do not apply cell formats (get values as string as in xlsx)
round_floats?: boolean; // default true - round float values as the cell format defines (values will be reported as parsed floats otherwise)
date1904?: boolean; // default false - use date 1904 conversion
ignore_timezone?: boolean; // default false - ignore timezone in date parsing
convert_values?: { // apply cell number formats or not (values will be reported as strings otherwise)
ints?: boolean; // rounds to int if number format is for int
floats?: boolean; // rounds floats according to float number format
dates?: boolean; // converts xlsx date to js date
bools?: boolean; // converts xlsx bool to js boolean
};
// xlsx structure options
workfolder?: string; // default 'xl' - the workbook subfolder in zip structure
}
 

具体的实现原理可以去github 探究 xlsx-extract

node 读取超大Excel 文件,提取数据的更多相关文章

  1. POI读取/写入Excel文件

    import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io ...

  2. 根据NPOI 读取一个excel 文件的多个Sheet

    大家都知道NPOI组件可以再你本地没有安装office的情况下来 读取,创建excel文件.但是大家一般都是只默认读取一个excel文件的第一个sheet.那么如果要读取一个excel 的所有shee ...

  3. Ajax获取 Json文件提取数据

    摘自 Ajax获取 Json文件提取数据 1. json文件内容(item.json) [ { "name":"张国立", "sex":&q ...

  4. node.js之excel文件读取

    金天:学习一个新东西,就要持有拥抱的心态,如果固守在自己先前的概念体系,就会有举步维艰的感觉.node.js解析excel, 读取记录. 业务需求,从excel (xlsx, xls)导入数据. 备选 ...

  5. java 读取Excel文件并数据持久化方法Demo

    import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util ...

  6. 读取超大Excel(39万行数据)

    有个学长需要处理Excel数据,Excel数据共有39W,将数据读取后处理并导出数据.最开始尝试了 NPOI ,发现NPOI 并不能完成该项任务,随后尝试引用的com组件:Microsoft.Offi ...

  7. java - 读取,导出 excel文件数据

    首先需下载poi java包,添加至构建路径, 写处理方法: import java.io.FileInputStream;import java.io.FileOutputStream;import ...

  8. [译]使用Pandas读取大型Excel文件

    上周我参加了dataisbeautiful subreddit上的Dataviz Battle,我们不得不从TSA声明数据集创建可视化.我喜欢这种比赛,因为大多数时候你最终都会学习很多有用的东西. 这 ...

  9. node 读取多个文件、合并多个文件、读写多个文件

    一.读取文件 1.找文件中匹配的内容 let fs = require('fs') let content = fs.readFileSync('/Users/**/desktop/Test.txt' ...

随机推荐

  1. dedecms5.7的文章详情页页面标题加载指定txt文本的随机关键字

    dedecms5.7的文章详情页加载指定txt文本的随机关键字 1 实现代码如下 {dede:name runphp='yes'} $file_path = "../test.txt&quo ...

  2. CefSharp F12打开DevTools查看console js和c#方法互相调用

    转载地址: https://www.cnblogs.com/lonelyxmas/p/11010018.html winform嵌入chrome浏览器,修改项目属性 生成 平台为x86 1.nuget ...

  3. python——Tkinter图形化界面及threading多线程

    Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.Tk和Tkinter可以在大多数的Unix平台下使用,同样可以应用在Windows和Macinto ...

  4. Windows 下MongoDB复制集配置

    1.下载服务.https://www.mongodb.com/   点击products 下拉第二列MongoDB server  选择 4.0.6 2.下载下来后 有限管理员运行 一路安装,可以不用 ...

  5. Redis事务控制

    Redis事务控制 1.Redis事务控制的相关命令汇总 命令名 作用 MULTI 表示开始收集命令,后面所有命令都不是马上执行,而是加入到一个队列中. EXEC 执行MULTI后面命令队列中的所有命 ...

  6. Windows下硬盘存储情况可视化工具--WinDirStat

    WinDirStat是一款免费的用于Windows下硬盘空间可视化工具. 下载地址:https://windirstat.en.softonic.com/ 界面如图所示: 可以轻易看出硬盘空间使用情况 ...

  7. STM32芯片命名规则

  8. Shel脚本-初步入门之《04》

    Shel脚本-初步入门-04 脚本语言的种类 4.脚本语言的种类 4.1 Shell 脚本语言的种类 Shell 脚本语言是弱类型语言(无须定义变量的类型即可使用),在 Unix/Linux 中主要有 ...

  9. JAVAWEB复习笔记-day02

    1.CSS样式优先级 优先级:由上到下,由外到内.优先级越来越高 2.css选择器 html标签选择器 class选择器(.) id选择器(#) 3.优先级 style属性>id选择器>c ...

  10. centos7-cockpit

    yum install cockpit* -y systemctl start cockpit.service systemctl enable cockpit.service 修改默认端口9090 ...