导出分工点
This commit is contained in:
@@ -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文件生成完成")
|
||||
|
||||
Reference in New Issue
Block a user