You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js实现Excel上传、MySQL插入及文件下载问题求助

Excel上传、数据入库与下载功能实现指导

嗨,恭喜你已经搞定了文件上传的问题!接下来咱们一步步解决Excel数据入库和文件下载的功能,新手也能轻松跟上:

一、处理Excel数据插入MySQL

1. 安装Excel解析依赖

首先在你的Node项目里安装xlsx库,这是Node生态里处理Excel最常用的工具之一:

npm install xlsx

2. 解析上传的Excel文件

在你的getDetails函数顶部先引入xlsx:

const XLSX = require('xlsx');

然后在文件上传成功的回调里,加入读取和解析Excel的逻辑:

sampleFile.mv(__dirname+'/Myuploads/Details/'+uploadFileName, function(err) {
    if (err) {
        res.status(500).send(err);
    } else {
        // 读取上传的Excel文件
        const workbook = XLSX.readFile(__dirname+'/Myuploads/Details/'+uploadFileName);
        // 获取Excel里的第一个工作表(如果有多个表,可根据SheetNames调整)
        const worksheet = workbook.Sheets[workbook.SheetNames[0]];
        // 把工作表转成JSON格式,header:1表示用第一行作为字段名
        const excelData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
        
        // 接下来写插入数据库的逻辑
    }
});

3. 安全批量插入数据库(避免SQL注入)

你原来的SQL字符串拼接方式有严重的SQL注入风险,一定要改用参数化查询。如果Excel里有多行数据,我们可以做批量插入:

// 跳过Excel表头(如果你的第一行是字段名的话)
const dataToInsert = excelData.slice(1).map(row => {
    // 这里根据你的Excel列对应数据库字段调整,比如row[0]是Excel第一列的值
    return [row[0], row[1], row[2]]; // 示例:对应数据库的三个字段
});

// 批量插入的SQL语句,用?作为占位符
const insertQuery = "INSERT INTO details (column1, column2, column3) VALUES ?";
connection.query(insertQuery, [dataToInsert], function(err, result) {
    if (!err){
        const response = [
            {'result' : 'success'},
            {'msg': `成功插入${result.affectedRows}条数据`}
        ];
        res.setHeader('Content-Type', 'application/json');
        res.status(200).send(JSON.stringify(response));
    } else {
        res.status(400).send(err);
    }
});

注意:把column1, column2, column3换成你实际的数据库字段名,row[0], row[1]对应Excel里的列位置,根据你的表格结构调整。

二、实现上传文件的下载功能

1. 后端添加下载接口

在你的Node服务里新增一个接口,用来根据文件名返回服务器上的文件:

function downloadFile(req, res) {
    const fileName = req.query.fileName;
    const filePath = __dirname+'/Myuploads/Details/'+fileName;
    
    // 设置响应头,告诉浏览器这是下载文件
    res.setHeader('Content-Disposition', `attachment; filename="${fileName}"`);
    res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    
    // 读取文件并返回给前端
    res.sendFile(filePath, (err) => {
        if (err) {
            res.status(404).send('文件不存在');
        }
    });
}

记得在路由里注册这个接口,比如:

app.get('/downloadFile', downloadFile);

2. 前端添加下载触发逻辑

在你的Angular控制器里,添加下载按钮的点击事件:

$scope.downloadExcel = function(fileName) {
    // 构造下载链接,跳转到后端接口
    window.location.href = Data.baseNodeService + "downloadFile?fileName=" + encodeURIComponent(fileName);
};

然后在页面上添加对应的按钮:

<button ng-click="downloadExcel(uploadedFileName)">下载上传的Excel</button>

这里的uploadedFileName需要是你上传成功后保存的文件名,比如可以在上传成功的回调里把它存在$scope中。

三、额外注意事项

  • 文件路径安全:要对下载接口的文件名做校验,确保用户只能访问指定目录下的文件,防止目录遍历攻击。
  • 格式兼容:xlsx库支持大部分Excel格式(.xlsx、.xls等),但如果有特殊格式(比如带宏的.xlsm)可能需要额外处理。
  • 错误处理:在解析Excel和插入数据库的过程中,添加更多错误捕获逻辑,比如Excel为空、数据格式不符合要求等,返回更友好的错误提示。

内容的提问来源于stack exchange,提问作者TB.M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:14:45