node读取excel

//生成sql‘


const mysqlx = require("@mysql/xdevapi");

let xlsx = require('node-xlsx');
let sheets = xlsx.parse('G:\\data.xlsx');

item_data();


async function item_data()
{
   sheets.forEach(function(sheet)
  {
    let data = sheet.data;

    //截取有效数字
    data = data.slice(0, 1);

    //去除undefined
    for (let i = data.length - 1; i >= 0; i--) {
      if (data[i][0] === undefined) {
        data.splice(i, 1);
      }
    }

    console.log(data.length);

    data.map(p =>
    {
      data = "'" + p.join("', '") + "'";
      let names = ['name', 'sex', 'age', 'complain', 'fever', 'temperate', 'cough', 'expectoration', 'pharyngalgia', 'dry_pharynx', 'myalgia', 'tired', 'weak', 'chest', 'short_of_breath', 'diarrhea', 'dyspnea', 'headache', 'diabetes', 'coronary', 'hypertesion', 'chronic_obstructive_pulmonary_disease', 'hepatopathy_history', 'nephroma_history', 'tuberculosis_history', 'disease_time', 'visit_time', 'time_space', 'diagnosis_time', 'wuhan_live_history', 'patient_community_live_history', 'wuhan_people_contach_history', 'patient_community_respiratory_symptoms', 'cluster_onset', 'virus_patient_contact_history', 'no_contact_history', 'incubation_period', 'double_lungs', 'one_lungs', 'lesions_location', 'ct_no_exception', 'pleural_effussion', 'real_change', 'spot_like_shadow', 'class_milling', 'shadow_of_infiltration', 'cable_shadow', 'checkout_date', 'WBC', 'RBC', 'HB_or_HGB', 'PLT', 'NEUT_OR_N', 'percentage_NEUT_OR_N', 'LY', 'percentage_LY', 'M_OR_MONO', 'PERCENTAGE_M_OR_MONO', 'E', 'PERCENTAGE_E', 'B', 'PERCENTAGE_B', 'CRP', 'ESR', 'PCT', 'CK_MB', 'oxygen_concentration', 'oxygen_number', 'PH', 'PaO2', 'SaO2', 'PCO2', 'Lac', 'GPT_OR_ALT', 'GOT_OR_AST', 'LDH', 'severity_of_disease', 'remark', 'photo_logging', 'mutiple'];

      str_name = names.join(",");

      const sql = `insert into dicom.pest_data2(${str_name}) values(${data}) ;`;
      console.log(sql);
    })
  })
};


async function insertData(data)
{
  data = "'" + data.join("', '") + "'";

  const session = await mysqlx.getSession
  ({
    user: 'root',
    password: '123456',
    host: 'localhost',
    port: '33060'
  });

  let names = ['name', 'sex', 'age', 'complain', 'fever', 'temperate', 'cough', 'expectoration', 'pharyngalgia', 'dry_pharynx', 'myalgia', 'tired', 'weak', 'chest', 'short_of_breath', 'diarrhea', 'dyspnea', 'headache', 'diabetes', 'coronary', 'hypertesion', 'chronic_obstructive_pulmonary_disease', 'hepatopathy_history', 'nephroma_history', 'tuberculosis_history', 'disease_time', 'visit_time', 'time_space', 'diagnosis_time', 'wuhan_live_history', 'patient_community_live_history', 'wuhan_people_contach_history', 'patient_community_respiratory_symptoms', 'cluster_onset', 'virus_patient_contact_history', 'no_contact_history', 'incubation_period', 'double_lungs', 'one_lungs', 'lesions_location', 'ct_no_exception', 'pleural_effussion', 'real_change', 'spot_like_shadow', 'class_milling', 'shadow_of_infiltration', 'cable_shadow', 'checkout_date', 'WBC', 'RBC', 'HB_or_HGB', 'PLT', 'NEUT_OR_N', 'percentage_NEUT_OR_N', 'LY', 'percentage_LY', 'M_OR_MONO', 'PERCENTAGE_M_OR_MONO', 'E', 'PERCENTAGE_E', 'B', 'PERCENTAGE_B', 'CRP', 'ESR', 'PCT', 'CK_MB', 'oxygen_concentration', 'oxygen_number', 'PH', 'PaO2', 'SaO2', 'PCO2', 'Lac', 'GPT_OR_ALT', 'GOT_OR_AST', 'LDH', 'severity_of_disease', 'remark', 'photo_logging', 'mutiple'];

  str_name = names.join(",");

  const sql = `insert into dicom.pest_data2(${str_name}) values(${data})`;

  console.log(sql);

  await session.sql(sql).execute(r => console.log(r)).catch(e=>console.log(e));

  session.close();

  return 1;
}

<think>嗯,用户想在Node-RED中读取Excel文件的数据,我得先想想有哪些方法。之前好像有看到过相关的节点或者模块。记得在引用里提到过node-xlsx,可能是一个办法。另外,用户提供的引用[2]里有一个Node.js脚本,用到了node-xlsx来解析Excel文件,所以可能需要用Function节点来执行类似的代码。 首先,用户可能需要安装一些节点模块。比如node-red-contrib-xlsx或者node-red-node-base64,但不确定哪个更合适。或者直接使用Function节点,自己写代码来处理。根据引用[2]的例子,安装node-xlsx模块可能是关键。不过Node-RED中可能需要先安装这个模块,或者在设置里添加。 然后,用户需要读取Excel文件,可能需要使用File节点读取文件内容,然后传递给Function节点进行解析。或者使用注入节点触发读取流程。需要考虑Excel文件的路径是否正确,如何处理多个工作表,以及数据转换的格式。 另外,用户可能需要将解析后的数据转换成JSON或者其他格式,方便后续处理。比如在引用[2]中,数据被处理成对象并写入文件,但在Node-RED中可能需要输出到msg.payload,传递给其他节点。 还要注意错误处理,比如文件不存在或者格式错误的情况,是否需要在Function节点中添加try-catch块。同时,处理大量数据时,性能问题也要考虑,可能需要分块处理或者使用流的方式。 最后,用户可能需要将数据可视化,比如用折线图显示,如引用[3]中的例子,或者存储到数据库。不过当前问题主要是读取Excel,所以先解决这部分。 总结步骤应该是:安装必要的节点或模块,读取Excel文件,解析内容,处理数据,输出结果。需要详细说明每个步骤的具体操作,包括代码示例和配置。</think>### 在Node-RED中读取Excel文件数据的实现步骤 #### 1. 安装必要依赖 需通过节点管理安装以下两个模块: - **node-red-node-base64**:用于处理二进制文件[^4] - **node-red-contrib-xlsx**:专门解析Excel文件的节点 安装方法:在Node-RED界面右上角菜单 > 节点管理 > 搜索安装 #### 2. 构建基础流程 流程结构建议: ``` [inject节点] → [file in节点] → [xlsx节点] → [debug节点] ``` #### 3. 详细配置说明 **File in节点配置**: - 设置`文件名`为Excel文件绝对路径(如`C:/data.xlsx`) - 输出选择`二进制缓冲区` **XLSX节点配置**: ```json { "operation": "parse", "output": "rows", "options": { "header": 1, //是否包含表头 "blankrows": false //跳过空行 } } ``` #### 4. 示例代码扩展(进阶处理) 如需自定义处理逻辑,可在Function节点中使用以下代码: ```javascript const xlsx = require('xlsx'); const fs = require('fs'); try { const buffer = msg.payload; const workbook = xlsx.read(buffer, {type: 'buffer'}); // 处理第一个工作表 const sheet = workbook.Sheets[workbook.SheetNames[0]]; const jsonData = xlsx.utils.sheet_to_json(sheet); msg.payload = { headers: Object.keys(jsonData[0]), rows: jsonData.map(row => Object.values(row)) }; return msg; } catch(e) { node.error("解析错误:" + e.message); } ``` #### 5. 数据处理建议 - 日期字段转换:使用`moment`库格式化时间戳 - 空值处理:添加`if(typeof row[3] !== 'undefined')`条件判断 - 大数据处理:通过`streams`模式分块读取(需安装`xlsx-stream-reader`) #### 6. 输出验证 调试窗口应显示结构化数据: ```json { "headers": ["时间", "温度", "湿度"], "rows": [ ["2023-08-01", 25.6, 58], ["2023-08-02", 26.1, 57] ] } ``` #### 7. 性能优化建议 - 10MB以上文件建议启用`stream: true`选项 - 使用`node-red-contrib-fs-ops`节点实现分块读取 - 添加`catch`节点处理文件读取异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值