导出分工点

This commit is contained in:
lhx
2025-11-08 17:30:35 +08:00
parent 9f71f3a073
commit 47eb275056

View File

@@ -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文件生成完成")