需求背景
拿到一份Excel文件,里面存有数万条数据,想要导入到数据库中到一张表中。
文件和表结构并不完全匹配,数据正确性也无法保证。
因为数量实在太大,不排除有错误情况,还希望导入操作可逆。
所以,生成包含insert语句的SQL文件比较好。
为什么选择nodejs
以上需求比较简单,当然也希望开发环境搭建越简单越好。另外也想进一步学习nodejs编程,遂采用了本文的方案。
实现步骤
如何读取Excel文件
应该说nodejs的生态已经相当完整了,简单搜索了一下,选项还是很多的。因为不涉及导出Excel文件,就挑了据说评价最高的一个:js-xlsx,以下都简称xlsx。
简单介绍js-xlsx
这个库实现了Excel文件的读写功能。这里只介绍相关的读取流程。
读取Excel 文件
xlsx读取文件需要fs模块的辅助,本文中,xlsx读取的是fs模块读取到到文件缓存内容。
1 | var buf = fs.readFileSync("./excelfiles/big.xlsx"); |
读取到到内容处理
上一步读取到的workbook,对应一个Excel文件,其中存在和Excel文件对应的工作簿和单元格。这里需要注意:单元格的行号是从1开始的。
1 | // 得到excel工作簿数组 |
单元格cell并不是简单的值,而是一个对象,因为需求简单,我们只取其中的v(value)属性即可。
1 | let tempStr = cellB3.v; |
获取总行数
因为我们需要依次处理工作簿中的行数据,所以需要知道其中的总行数。当然如果只是一次性的操作,这个行数可以查看Excel文件后指定。
1 | // 读取该工作簿的范围,返回一个由起止单元格名称组成的字符串(如'A1:B20') |
遍历行,拼接字符串
了解前面的方法后,就是简单的逐行遍历,拼接字符串过程了。这里不赘述了。详情参见项目。
因为数据表中主键是通过系统程序生成的随机字符串,并不能做到严格的不重复,而且系统程序是java写的。所以觉得没有必要采用javascript再重写一份,所以找了一个现成的包替代,实际效果未经检测。
实际效果
得到的Excel文件中包含8万余条数据,18M。通过本项目项目程序导出后的文本文件达到31M。