5154

Good Luck To You!

js如何导入Excel数据到数据库?详细步骤与方法解析

在JavaScript中导入Excel数据并将其存入数据库是一个常见的需求,尤其在数据批量处理、表单提交或数据分析场景中,整个过程通常涉及三个核心步骤:读取Excel文件、解析数据、将数据存入数据库,以下是详细的实现方法和代码示例。

准备工作

  1. 环境依赖

    • 前端:若在前端处理,需使用FileReader API读取本地文件,配合第三方库解析Excel(如SheetJS)。
    • 后端:若在后端处理,需使用Node.js环境,并安装exceljsmulter(文件上传)和数据库驱动(如mysql2pg等)。
    • 数据库:确保目标数据库(如MySQL、PostgreSQL、MongoDB等)已创建并配置好连接。
  2. 安装必要库

    • 前端(通过CDN引入):
      <script src="https://cdn.jsdelivr.net/npm/xlsx@0.18.5/dist/xlsx.full.min.js"></script>
    • 后端(通过npm安装):
      npm install exceljs multer mysql2

前端实现:读取Excel并解析

前端直接处理用户上传的Excel文件,适合小规模数据或无需后端介入的场景。

js怎么导入excel数据库

  1. 文件选择与读取
    <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>
  2. 数据格式说明
    XLSX.utils.sheet_to_json()会将Excel行转换为JSON对象,默认以第一行作为键名。
    | 姓名 | 年龄 | 邮箱 |
    |------|------|--------------|
    | 张三 | 25 | zhang@example.com |
    解析结果为:[{ 姓名: '张三', 年龄: 25, 邮箱: 'zhang@example.com' }]

后端实现:接收数据并存入数据库

后端更适合处理敏感数据或大规模导入,以下是Node.js + Express + MySQL的示例。

  1. 配置服务器与文件上传

    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'
    };
  2. 处理文件上传与数据导入

    js怎么导入excel数据库

    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'));
  3. 数据库表结构示例

    CREATE TABLE users (
      id INT AUTO_INCREMENT PRIMARY KEY,
      name VARCHAR(50),
      age INT,
      email VARCHAR(100)
    );

常见问题与优化

  1. 大数据量处理

    • 若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])
        );
      }
  2. 数据校验
    在存入数据库前,需校验数据格式(如年龄是否为数字、邮箱是否符合规范),避免非法数据导致错误。

    js怎么导入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);

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.7.3

Copyright Your WebSite.Some Rights Reserved.