update generateXlsx.js

This commit is contained in:
秦秋旭 2026-01-22 16:50:16 +08:00
parent 06d90c19a2
commit 1db556f03b

View File

@ -106,30 +106,45 @@ function addSheet(workbook, sheetName, data) {
/** /**
* Generates a multi-sheet XLSX file from the nested real estate data. * Generates a multi-sheet XLSX file from the nested real estate data.
* @param {Array<Object>} data - The nested data from merged_data.json. * @param {Array<Object>} mergedData - The nested data from merged_data.json.
* @param {Array<Object>} companiesData - The data from companies.json.
* @param {string} filePath - The path to save the XLSX file. * @param {string} filePath - The path to save the XLSX file.
*/ */
async function generateXlsx(data, filePath) { async function generateXlsx(mergedData, companiesData, filePath) {
if (!data || data.length === 0) { if ((!mergedData || mergedData.length === 0) && (!companiesData || companiesData.length === 0)) {
console.log(`没有数据可生成 XLSX 文件 (${filePath})。`); console.log(`没有数据可生成 XLSX 文件 (${filePath})。`);
return; return;
} }
console.log('正在将数据处理成多个工作表...');
const { projects, licenses, buildings } = flattenData(data);
console.log(`- 项目: ${projects.length}`);
console.log(`- 许可证: ${licenses.length}`);
console.log(`- 楼幢: ${buildings.length}`);
const workbook = new ExcelJS.Workbook(); const workbook = new ExcelJS.Workbook();
workbook.creator = 'Gemini Assistant'; workbook.creator = 'Gemini Assistant';
workbook.created = new Date(); workbook.created = new Date();
workbook.modified = new Date(); workbook.modified = new Date();
console.log('正在创建 Excel 工作表...'); console.log('正在创建 Excel 工作表...');
addSheet(workbook, '项目', projects);
addSheet(workbook, '预售许可证', licenses); if (mergedData && mergedData.length > 0) {
addSheet(workbook, '楼幢', buildings); console.log('正在将项目和许可证数据处理成多个工作表...');
const { projects, licenses, buildings } = flattenData(mergedData);
console.log(`- 项目: ${projects.length}`);
console.log(`- 许可证: ${licenses.length}`);
console.log(`- 楼幢: ${buildings.length}`);
addSheet(workbook, '项目', projects);
addSheet(workbook, '预售许可证', licenses);
addSheet(workbook, '楼幢', buildings);
} else {
console.log('- 注意: merged_data.json 没有数据,跳过项目和许可证工作表创建。');
}
if (companiesData && companiesData.length > 0) {
console.log('正在添加公司数据工作表...');
console.log(`- 企业: ${companiesData.length}`);
addSheet(workbook, '企业', companiesData);
} else {
console.log('- 注意: companies.json 没有数据,跳过企业工作表创建。');
}
await workbook.xlsx.writeFile(filePath); await workbook.xlsx.writeFile(filePath);
console.log(`✅ 成功生成多工作表 Excel 文件: ${filePath}`); console.log(`✅ 成功生成多工作表 Excel 文件: ${filePath}`);
@ -140,23 +155,41 @@ async function generateXlsx(data, filePath) {
*/ */
async function run() { async function run() {
console.log('🚀 开始生成 Excel 分析文件...'); console.log('🚀 开始生成 Excel 分析文件...');
const dataPath = path.join(process.cwd(), 'data', 'merged_data.json'); const mergedDataPath = path.join(process.cwd(), 'data', 'merged_data.json');
const companiesDataPath = path.join(process.cwd(), 'data', 'companies.json');
const outputPath = path.join(process.cwd(), '普宁房产数据分析.xlsx'); const outputPath = path.join(process.cwd(), '普宁房产数据分析.xlsx');
let mergedData = [];
let companiesData = [];
try { try {
await fs.access(dataPath); await fs.access(mergedDataPath);
console.log(`读取数据源: ${dataPath}`); console.log(`读取数据源: ${mergedDataPath}`);
const jsonData = JSON.parse(await fs.readFile(dataPath, 'utf-8')); mergedData = JSON.parse(await fs.readFile(mergedDataPath, 'utf-8'));
await generateXlsx(jsonData, outputPath);
} catch (error) { } catch (error) {
if (error.code === 'ENOENT') { if (error.code === 'ENOENT') {
console.error(`❌ 错误: 未找到数据文件 '${path.basename(dataPath)}'。`); console.log(`- 注意: 未找到数据文件 '${path.basename(mergedDataPath)}'。`);
console.error('请先运行 `npm start` 来生成完整的数据文件。');
} else { } else {
console.error('❌ 生成 XLSX 文件时发生错误:', error); console.error(`❌ 读取 ${path.basename(mergedDataPath)} 时发生错误:`, error.message);
process.exit(1);
} }
process.exit(1);
} }
try {
await fs.access(companiesDataPath);
console.log(`读取数据源: ${companiesDataPath}`);
companiesData = JSON.parse(await fs.readFile(companiesDataPath, 'utf-8'));
} catch (error) {
if (error.code === 'ENOENT') {
console.log(`- 注意: 未找到数据文件 '${path.basename(companiesDataPath)}'。`);
} else {
console.error(`❌ 读取 ${path.basename(companiesDataPath)} 时发生错误:`, error.message);
process.exit(1);
}
}
// Pass both datasets to generateXlsx
await generateXlsx(mergedData, companiesData, outputPath);
} }
run(); run();