puning-real-estate/json-to-xlsx.js
2026-01-18 14:22:28 +08:00

65 lines
2.0 KiB
JavaScript

import fs from 'fs/promises';
import ExcelJS from 'exceljs';
async function jsonToXlsx() {
try {
const jsonFilePath = './data.json';
const xlsxFilePath = './data.xlsx';
// Read and parse the JSON file
const jsonData = await fs.readFile(jsonFilePath, 'utf-8');
const records = JSON.parse(jsonData);
if (records.length === 0) {
console.log('data.json 文件为空,没有数据可转换为 XLSX。');
return;
}
// Create a new workbook and a worksheet
const workbook = new ExcelJS.Workbook();
const worksheet = workbook.addWorksheet('Data');
// Define columns based on the keys of the first record
const headers = Object.keys(records[0]);
worksheet.columns = headers.map(key => ({
header: key,
key: key,
width: key.includes('地址') || key.includes('链接') ? 40 : 20 // Make address and link columns wider
}));
// Add the records as rows
worksheet.addRows(records);
// Style the header
worksheet.getRow(1).eachCell(cell => {
cell.font = { bold: true };
cell.fill = {
type: 'pattern',
pattern:'solid',
fgColor:{argb:'FFDDDDDD'}
};
cell.alignment = { vertical: 'middle', horizontal: 'center' };
});
// Auto-filter on the header row
worksheet.autoFilter = {
from: 'A1',
to: {
row: 1,
column: headers.length
}
};
// Write to file
await workbook.xlsx.writeFile(xlsxFilePath);
console.log(`成功将 ${jsonFilePath} 转换为 ${xlsxFilePath}`);
console.log('XLSX 文件已创建,您现在可以在其中进行筛选和排序。');
} catch (error) {
console.error('转换 JSON 到 XLSX 时发生错误:', error.message);
}
}
jsonToXlsx();