直接拷贝本文,npm i xlsx fastify,简单起一个服务,浏览器访问http://localhost:3000 即可
import Fastify from 'fastify';
import * as XLSX from 'xlsx/xlsx.mjs';
import * as fs from 'fs';
import { Readable } from 'stream';
import * as cpexcel from 'xlsx/dist/cpexcel.full.mjs';
XLSX.set_fs(fs);
XLSX.stream.set_readable(Readable);
XLSX.set_cptable(cpexcel);
const fastify = Fastify({ logger: true, });
fastify.get('/', function (request, reply) {
// 读取Excel文件 const workbook = XLSX.readFile('./excel.xlsx');
// 假设我们只读取第一个工作表 const sheetName = workbook.SheetNames[0];
const worksheet = workbook.Sheets[sheetName];
// 将工作表转换为JSON对象(数组形式),不指定header,因为文件没有标题行 const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
// 拿到一级 function transformData(jsonData) { let result = {}; for (let item of jsonData) { let [province, a, city, b, county] = item; // 使用 slice 确保只解构前三个元素 // 检查省是否已经存在 if (!result[province]) { result[province] = { value: province, label: province, children: [], }; } let provinceObj = result[province]; // 检查市是否已经存在 let cityObj = provinceObj.children.find(child => child.value === city); if (!cityObj) { provinceObj.children.push({ value: city, label: city, children: [], }); cityObj = provinceObj.children[provinceObj.children.length - 1]; // 获取新添加的市对象 } // 检查县是否已经存在 let countyObj = cityObj.children.find(child => child.value === county); if (!countyObj) { cityObj.children.push({ value: county, label: county, // children: [], // 县下面没有更细分的层级(在这个简化版本中) }); } } // 将结果转换为数组 let finalResult = Object.values(result); return finalResult; }
// 假设 jsonData 是已经定义好的数据数组 // const jsonData = [ // ["Province1", "City1", "County1"], // ["Province1", "City1", "County2"], // ["Province1", "City2", "County3"], // // ... 其他数据 // ]; // const list = transformData(jsonData); const list = transformData(jsonData); // 输出每一列的数据 reply.send(list); });
fastify.listen({ port: 3000 }, function (err, address) { if (err) { fastify.log.error(err); process.exit(1); } });