导出分工点
This commit is contained in:
@@ -173,9 +173,12 @@ class ExportExcelService:
|
|||||||
if level_data.NYID not in nyid_level_map:
|
if level_data.NYID not in nyid_level_map:
|
||||||
nyid_level_map[level_data.NYID] = level_data
|
nyid_level_map[level_data.NYID] = level_data
|
||||||
|
|
||||||
# 7. 合并数据
|
# 7. 合并数据并按 work_site 分组
|
||||||
all_settlement_records = []
|
work_site_records = {} # work_site -> [records]
|
||||||
for section in sections:
|
for section in sections:
|
||||||
|
# 获取工点名称
|
||||||
|
work_site = section.work_site or "未知工点"
|
||||||
|
|
||||||
checkpoints = section_checkpoint_map.get(section.section_id, [])
|
checkpoints = section_checkpoint_map.get(section.section_id, [])
|
||||||
for checkpoint in checkpoints:
|
for checkpoint in checkpoints:
|
||||||
checkpoint.burial_date = TimeUtils.string_to_date_string(checkpoint.burial_date)
|
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(
|
merged_record = self.merge_settlement_with_related_data(
|
||||||
db, settlement, section, checkpoint, level_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("未能合并任何数据记录")
|
logger.warning("未能合并任何数据记录")
|
||||||
raise DataNotFoundException("未能合并任何数据记录")
|
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
|
# 导出到Excel文件(按 work_site 分工作簿)
|
||||||
df = pd.DataFrame(all_settlement_records)
|
|
||||||
|
|
||||||
# 导出到Excel文件
|
|
||||||
with pd.ExcelWriter(file_path, engine='openpyxl') as writer:
|
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] + "..."
|
||||||
|
|
||||||
# 自动调整列宽
|
logger.info(f"创建工作簿: {safe_work_site},记录数: {len(records)}")
|
||||||
worksheet = writer.sheets['沉降数据']
|
|
||||||
for column in worksheet.columns:
|
# 转换为DataFrame
|
||||||
max_length = 0
|
df = pd.DataFrame(records)
|
||||||
column_letter = column[0].column_letter
|
|
||||||
for cell in column:
|
# 写入工作簿
|
||||||
try:
|
df.to_excel(writer, index=False, sheet_name=safe_work_site)
|
||||||
if len(str(cell.value)) > max_length:
|
|
||||||
max_length = len(str(cell.value))
|
# 自动调整列宽
|
||||||
except:
|
worksheet = writer.sheets[safe_work_site]
|
||||||
pass
|
for column in worksheet.columns:
|
||||||
adjusted_width = min(max_length + 2, 50)
|
max_length = 0
|
||||||
worksheet.column_dimensions[column_letter].width = adjusted_width
|
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文件生成完成")
|
logger.info("Excel文件生成完成")
|
||||||
|
|||||||
Reference in New Issue
Block a user