0%

nodejs读取Excel生成SQL文件

需求背景

拿到一份Excel文件,里面存有数万条数据,想要导入到数据库中到一张表中。

文件和表结构并不完全匹配,数据正确性也无法保证。

因为数量实在太大,不排除有错误情况,还希望导入操作可逆。

所以,生成包含insert语句的SQL文件比较好。

为什么选择nodejs

以上需求比较简单,当然也希望开发环境搭建越简单越好。另外也想进一步学习nodejs编程,遂采用了本文的方案。

实现步骤

如何读取Excel文件

应该说nodejs的生态已经相当完整了,简单搜索了一下,选项还是很多的。因为不涉及导出Excel文件,就挑了据说评价最高的一个:js-xlsx,以下都简称xlsx。

简单介绍js-xlsx

这个库实现了Excel文件的读写功能。这里只介绍相关的读取流程。

读取Excel 文件

xlsx读取文件需要fs模块的辅助,本文中,xlsx读取的是fs模块读取到到文件缓存内容。

1
2
3
var buf = fs.readFileSync("./excelfiles/big.xlsx");
// 读取excel文档,存放在workbook中
var workbook = XLSX.read(buf, { type: 'buffer' });

读取到到内容处理

上一步读取到的workbook,对应一个Excel文件,其中存在和Excel文件对应的工作簿单元格。这里需要注意:单元格的行号是从1开始的。

1
2
3
4
5
6
// 得到excel工作簿数组
var sheetNames = workbook.SheetNames;
// 得到中第一个工作簿
var worksheet = workbook.Sheets[sheetNames[0]];
// 得到第一个工作簿中B3单元格
var cellB3=worksheet['B3'];

单元格cell并不是简单的值,而是一个对象,因为需求简单,我们只取其中的v(value)属性即可。

1
let tempStr = cellB3.v;

获取总行数

因为我们需要依次处理工作簿中的行数据,所以需要知道其中的总行数。当然如果只是一次性的操作,这个行数可以查看Excel文件后指定。

1
2
3
4
5
6
7
// 读取该工作簿的范围,返回一个由起止单元格名称组成的字符串(如'A1:B20')
var rangeStr = worksheet['!ref'];
var patt1 = /\d+/g;
// 解析该字符串,分别得到起止行的行号
var lineArr = rangeStr.match(patt1);
let lineStart = lineArr[0];
var lineEnd = lineArr[1];

遍历行,拼接字符串

了解前面的方法后,就是简单的逐行遍历,拼接字符串过程了。这里不赘述了。详情参见项目

因为数据表中主键是通过系统程序生成的随机字符串,并不能做到严格的不重复,而且系统程序是java写的。所以觉得没有必要采用javascript再重写一份,所以找了一个现成的包替代,实际效果未经检测。

实际效果

得到的Excel文件中包含8万余条数据,18M。通过本项目项目程序导出后的文本文件达到31M。

参考

Node读写Excel文件探究实践