diff --git a/app/services/export_excel.py b/app/services/export_excel.py index 7da5b53..20718e2 100644 --- a/app/services/export_excel.py +++ b/app/services/export_excel.py @@ -173,9 +173,12 @@ class ExportExcelService: if level_data.NYID not in nyid_level_map: nyid_level_map[level_data.NYID] = level_data - # 7. 合并数据 - all_settlement_records = [] + # 7. 合并数据并按 work_site 分组 + work_site_records = {} # work_site -> [records] for section in sections: + # 获取工点名称 + work_site = section.work_site or "未知工点" + checkpoints = section_checkpoint_map.get(section.section_id, []) for checkpoint in checkpoints: checkpoint.burial_date = TimeUtils.string_to_date_string(checkpoint.burial_date) @@ -209,33 +212,46 @@ class ExportExcelService: merged_record = self.merge_settlement_with_related_data( db, settlement, section, checkpoint, level_data ) - all_settlement_records.append(merged_record) - if not all_settlement_records: + # 按 work_site 分组 + if work_site not in work_site_records: + work_site_records[work_site] = [] + work_site_records[work_site].append(merged_record) + + if not work_site_records: logger.warning("未能合并任何数据记录") raise DataNotFoundException("未能合并任何数据记录") - logger.info(f"共找到 {len(all_settlement_records)} 条沉降数据记录") + logger.info(f"共找到 {len(work_site_records)} 个工点,共 {sum(len(records) for records in work_site_records.values())} 条沉降数据记录") - # 转换为DataFrame - df = pd.DataFrame(all_settlement_records) - - # 导出到Excel文件 + # 导出到Excel文件(按 work_site 分工作簿) with pd.ExcelWriter(file_path, engine='openpyxl') as writer: - df.to_excel(writer, index=False, sheet_name='沉降数据') + for work_site, records in work_site_records.items(): + # 将工作表名称转换为有效字符(Excel工作表名称不能包含:/、\、?、*、[、]等) + safe_work_site = work_site.replace('/', '_').replace('\\', '_').replace('?', '_').replace('*', '_').replace('[', '_').replace(']', '_') + if len(safe_work_site) > 31: # Excel工作表名称最大长度限制 + safe_work_site = safe_work_site[:28] + "..." - # 自动调整列宽 - worksheet = writer.sheets['沉降数据'] - for column in worksheet.columns: - max_length = 0 - column_letter = column[0].column_letter - for cell in column: - try: - if len(str(cell.value)) > max_length: - max_length = len(str(cell.value)) - except: - pass - adjusted_width = min(max_length + 2, 50) - worksheet.column_dimensions[column_letter].width = adjusted_width + logger.info(f"创建工作簿: {safe_work_site},记录数: {len(records)}") + + # 转换为DataFrame + df = pd.DataFrame(records) + + # 写入工作簿 + df.to_excel(writer, index=False, sheet_name=safe_work_site) + + # 自动调整列宽 + worksheet = writer.sheets[safe_work_site] + for column in worksheet.columns: + max_length = 0 + column_letter = column[0].column_letter + for cell in column: + try: + if len(str(cell.value)) > max_length: + max_length = len(str(cell.value)) + except: + pass + adjusted_width = min(max_length + 2, 50) + worksheet.column_dimensions[column_letter].width = adjusted_width logger.info("Excel文件生成完成")