from __future__ import annotations import logging from pathlib import Path from django.conf import settings from openpyxl import Workbook from review_agent.models import ExportedSummaryFile, FileSummaryBatch logger = logging.getLogger("review_agent.file_summary.export_excel") def _exports_dir(batch: FileSummaryBatch) -> Path: root = Path(batch.work_dir) if batch.work_dir else Path(settings.MEDIA_ROOT) / "file_summary" / batch.batch_no export_dir = root / "exports" export_dir.mkdir(parents=True, exist_ok=True) return export_dir def generate_excel_export(batch: FileSummaryBatch) -> ExportedSummaryFile: logger.info("Excel export generation started", extra={"batch_id": batch.pk}) workbook = Workbook() summary = workbook.active summary.title = "汇总信息" summary.append(["批次号", batch.batch_no]) summary.append(["产品名称", batch.product_name or "-"]) summary.append(["文件总数", batch.total_files]) summary.append(["统计成功", batch.success_files]) summary.append(["统计失败", batch.failed_files]) summary.append(["不支持", batch.unsupported_files]) summary.append(["不确定", batch.uncertain_files]) summary.append(["总页数", batch.total_pages]) detail = workbook.create_sheet("文件明细") detail.append(["序号", "目录层级", "文件名", "类型", "页数", "路径", "状态", "重试次数", "异常说明"]) for item in batch.items.order_by("file_index"): detail.append( [ item.file_index, item.directory_level, item.file_name, item.file_type, item.page_count, item.relative_path, item.statistics_status, item.retry_count, item.error_message, ] ) path = _exports_dir(batch) / f"{batch.batch_no}-summary.xlsx" workbook.save(path) exported = ExportedSummaryFile.objects.create( batch=batch, export_type=ExportedSummaryFile.ExportType.EXCEL, file_name=path.name, storage_path=str(path), ) logger.info( "Excel export generation finished", extra={"batch_id": batch.pk, "export_id": exported.pk, "path": str(path)}, ) return exported