在JavaScript中导入Excel数据并将其存入数据库是一个常见的需求,尤其在数据批量处理、表单提交或数据分析场景中,整个过程通常涉及三个核心步骤:读取Excel文件、解析数据、将数据存入数据库,以下是详细的实现方法和代码示例。
准备工作
-
环境依赖
- 前端:若在前端处理,需使用
FileReader
API读取本地文件,配合第三方库解析Excel(如SheetJS
)。 - 后端:若在后端处理,需使用Node.js环境,并安装
exceljs
、multer
(文件上传)和数据库驱动(如mysql2
、pg
等)。 - 数据库:确保目标数据库(如MySQL、PostgreSQL、MongoDB等)已创建并配置好连接。
- 前端:若在前端处理,需使用
-
安装必要库
- 前端(通过CDN引入):
<script src="https://cdn.jsdelivr.net/npm/xlsx@0.18.5/dist/xlsx.full.min.js"></script>
- 后端(通过npm安装):
npm install exceljs multer mysql2
- 前端(通过CDN引入):
前端实现:读取Excel并解析
前端直接处理用户上传的Excel文件,适合小规模数据或无需后端介入的场景。
- 文件选择与读取
<input type="file" id="excelFile" accept=".xlsx,.xls" /> <script> document.getElementById('excelFile').addEventListener('change', function(e) { const file = e.target.files[0]; const reader = new FileReader(); reader.onload = function(event) { const data = new Uint8Array(event.target.result); const workbook = XLSX.read(data, { type: 'array' }); const firstSheetName = workbook.SheetNames[0]; const worksheet = workbook.Sheets[firstSheetName]; const jsonData = XLSX.utils.sheet_to_json(worksheet); console.log('解析后的数据:', jsonData); // 调用函数将数据发送到后端或直接处理 sendDataToServer(jsonData); }; reader.readAsArrayBuffer(file); }); </script>
- 数据格式说明
XLSX.utils.sheet_to_json()
会将Excel行转换为JSON对象,默认以第一行作为键名。
| 姓名 | 年龄 | 邮箱 |
|------|------|--------------|
| 张三 | 25 | zhang@example.com |
解析结果为:[{ 姓名: '张三', 年龄: 25, 邮箱: 'zhang@example.com' }]
。
后端实现:接收数据并存入数据库
后端更适合处理敏感数据或大规模导入,以下是Node.js + Express + MySQL的示例。
-
配置服务器与文件上传
const express = require('express'); const multer = require('multer'); const ExcelJS = require('exceljs'); const mysql = require('mysql2/promise'); const app = express(); const upload = multer({ dest: 'uploads/' }); // 临时存储上传文件 // 数据库连接配置 const dbConfig = { host: 'localhost', user: 'root', password: 'password', database: 'test_db' };
-
处理文件上传与数据导入
app.post('/upload-excel', upload.single('excelFile'), async (req, res) => { try { const workbook = new ExcelJS.Workbook(); await workbook.xlsx.readFile(req.file.path); const worksheet = workbook.getWorksheet(1); const data = []; // 跳过表头,从第二行开始读取 for (let row = 2; row <= worksheet.rowCount; row++) { const rowData = { name: worksheet.getCell(row, 1).text, age: parseInt(worksheet.getCell(row, 2).text), email: worksheet.getCell(row, 3).text }; data.push(rowData); } // 存入数据库 const connection = await mysql.createConnection(dbConfig); for (const item of data) { await connection.execute( 'INSERT INTO users (name, age, email) VALUES (?, ?, ?)', [item.name, item.age, item.email] ); } await connection.end(); res.json({ message: '数据导入成功', count: data.length }); } catch (error) { res.status(500).json({ error: error.message }); } }); app.listen(3000, () => console.log('服务器运行在 http://localhost:3000'));
-
数据库表结构示例
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT, email VARCHAR(100) );
常见问题与优化
-
大数据量处理
- 若Excel数据量较大(如万行以上),建议分批插入数据库,避免内存溢出:
const batchSize = 1000; for (let i = 0; i < data.length; i += batchSize) { const batch = data.slice(i, i + batchSize); await connection.batch( 'INSERT INTO users (name, age, email) VALUES (?, ?, ?)', batch.map(item => [item.name, item.age, item.email]) ); }
- 若Excel数据量较大(如万行以上),建议分批插入数据库,避免内存溢出:
-
数据校验
在存入数据库前,需校验数据格式(如年龄是否为数字、邮箱是否符合规范),避免非法数据导致错误。
相关问答FAQs
Q1: 如何处理Excel中的日期格式?
A: Excel中的日期在解析时可能被转换为数字(如ExcelJS的getCell(row, col).value
返回的是时间戳),需手动转换:
const dateValue = worksheet.getCell(row, 1).value; const date = new Date((dateValue - 25569) * 86400 * 1000); // Excel日期转JS日期
Q2: 如何支持.xls和.xlsx两种格式?
A: 前端使用SheetJS
时,XLSX.read
会自动识别格式;后端使用exceljs
时,需根据文件扩展名选择解析方法:
const fileType = req.file.originalname.split('.').pop(); const workbook = fileType === 'xls' ? await new ExcelJS.Workbook().read(req.file.buffer, { type: 'buffer' }) : await new ExcelJS.Workbook().xlsx.readFile(req.file.path);