fix: keep temp image files until workbook save

This commit is contained in:
Mayorz 2026-03-04 16:09:58 +08:00
parent 0ce33a601f
commit bfe3f168a2

View File

@ -2,9 +2,9 @@
from __future__ import annotations from __future__ import annotations
import argparse import argparse
import io
import re import re
import ssl import ssl
import tempfile
import urllib.error import urllib.error
import urllib.parse import urllib.parse
import urllib.request import urllib.request
@ -251,7 +251,7 @@ def resize_image(image: XLImage, max_width: int, max_height: int) -> None:
image.height = int(height * scale) image.height = int(height * scale)
def process_sheet(sheet, args: argparse.Namespace, ssl_context) -> list[RowResult]: def process_sheet(sheet, args: argparse.Namespace, ssl_context, temp_files: list[Path]) -> list[RowResult]:
results: list[RowResult] = [] results: list[RowResult] = []
header_row = args.header_row header_row = args.header_row
@ -282,9 +282,12 @@ def process_sheet(sheet, args: argparse.Namespace, ssl_context) -> list[RowResul
try: try:
payload, extension = download_image(url, args.timeout, ssl_context) payload, extension = download_image(url, args.timeout, ssl_context)
image_buffer = io.BytesIO(payload) with tempfile.NamedTemporaryFile(delete=False, suffix=extension) as temp_file:
image_buffer.name = f"row_{row}{extension}" temp_file.write(payload)
image = XLImage(image_buffer) temp_path = Path(temp_file.name)
temp_files.append(temp_path)
image = XLImage(str(temp_path))
resize_image(image, args.max_width, args.max_height) resize_image(image, args.max_width, args.max_height)
anchor = f"{image_column_letter}{row}" anchor = f"{image_column_letter}{row}"
@ -321,14 +324,19 @@ def main() -> int:
workbook = load_workbook(input_path) workbook = load_workbook(input_path)
sheets = choose_sheets(workbook, args.sheet) sheets = choose_sheets(workbook, args.sheet)
temp_files: list[Path] = []
all_results: list[tuple[str, RowResult]] = [] all_results: list[tuple[str, RowResult]] = []
for sheet in sheets: for sheet in sheets:
sheet_results = process_sheet(sheet, args, ssl_context) sheet_results = process_sheet(sheet, args, ssl_context, temp_files)
all_results.extend((sheet.title, item) for item in sheet_results) all_results.extend((sheet.title, item) for item in sheet_results)
output_path.parent.mkdir(parents=True, exist_ok=True) output_path.parent.mkdir(parents=True, exist_ok=True)
workbook.save(output_path) try:
workbook.save(output_path)
finally:
for file_path in temp_files:
file_path.unlink(missing_ok=True)
success_count = sum(1 for _, item in all_results if item.status == "ok") success_count = sum(1 for _, item in all_results if item.status == "ok")
fail_count = sum(1 for _, item in all_results if item.status == "failed") fail_count = sum(1 for _, item in all_results if item.status == "failed")