style(malaysia): 입출고 엑셀 헤더 서식 + 열너비 자동
- A1~C1 파랑 배경/흰색 굵은글씨/가운데 정렬 - A~C 열너비 내용 길이 자동(한글 폭 2배 보정, 8~50 clamp) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -335,11 +335,14 @@ async def movements_export(request: Request) -> StreamingResponse:
|
||||
item_names = st.item_name_map()
|
||||
|
||||
from openpyxl import Workbook # noqa: WPS433
|
||||
from openpyxl.styles import Alignment, Font, PatternFill # noqa: WPS433
|
||||
from openpyxl.utils import get_column_letter # noqa: WPS433
|
||||
|
||||
wb = Workbook()
|
||||
ws = wb.active
|
||||
ws.title = f"{mtype}_{mdate}"
|
||||
ws.append(["사방넷코드", "수량", "이름"])
|
||||
header = ["사방넷코드", "수량", "이름"]
|
||||
ws.append(header)
|
||||
for code in sorted(totals.keys()):
|
||||
qty = totals[code]
|
||||
if qty == 0:
|
||||
@@ -350,6 +353,26 @@ async def movements_export(request: Request) -> StreamingResponse:
|
||||
names.get(code) or item_names.get(code) or code,
|
||||
])
|
||||
|
||||
# 제목행(A1~C1): 파랑 배경 + 흰색 굵은글씨 + 가운데 정렬
|
||||
fill = PatternFill(start_color="FF4472C4", end_color="FF4472C4", fill_type="solid")
|
||||
font = Font(color="FFFFFFFF", bold=True)
|
||||
center = Alignment(horizontal="center", vertical="center")
|
||||
for col in range(1, len(header) + 1):
|
||||
cell = ws.cell(row=1, column=col)
|
||||
cell.fill = fill
|
||||
cell.font = font
|
||||
cell.alignment = center
|
||||
|
||||
# 열너비 자동(내용 길이 기준, 한글 폭 보정). 최소 8 ~ 최대 50.
|
||||
for col in range(1, len(header) + 1):
|
||||
letter = get_column_letter(col)
|
||||
longest = 0
|
||||
for cell in ws[letter]:
|
||||
v = "" if cell.value is None else str(cell.value)
|
||||
width = sum(2 if ord(ch) > 0x1100 else 1 for ch in v)
|
||||
longest = max(longest, width)
|
||||
ws.column_dimensions[letter].width = max(8, min(50, longest + 2))
|
||||
|
||||
buf = io.BytesIO()
|
||||
wb.save(buf)
|
||||
buf.seek(0)
|
||||
|
||||
Reference in New Issue
Block a user