결과 엑셀 A~C 열 너비 자동 조절
콘텐츠 길이에 맞춰 열 너비를 계산해서 적용한다. 한글은 ASCII 폭의 약 2배로 가중치를 두고, 최소 10 · 최대 60 으로 클램프해 너무 좁거나 넓지 않게 한다. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -816,9 +816,30 @@ def upload_file(
|
|||||||
df_out = pd.DataFrame(excel_rows, columns=["상품코드[필수]", "가용수량", "불용수량"])
|
df_out = pd.DataFrame(excel_rows, columns=["상품코드[필수]", "가용수량", "불용수량"])
|
||||||
|
|
||||||
# 엑셀 파일 쓰기 (1행 헤더, 2행부터 데이터 — pandas to_excel 기본 동작)
|
# 엑셀 파일 쓰기 (1행 헤더, 2행부터 데이터 — pandas to_excel 기본 동작)
|
||||||
|
# 작성 직후 A~C 열 너비를 콘텐츠 길이에 맞춰 자동 조절한다.
|
||||||
|
# (한글은 ASCII보다 폭이 약 2배이므로 가중치 적용)
|
||||||
|
def _excel_display_len(value) -> int:
|
||||||
|
s = "" if value is None else str(value)
|
||||||
|
width = 0
|
||||||
|
for ch in s:
|
||||||
|
width += 2 if ord(ch) > 127 else 1
|
||||||
|
return width
|
||||||
|
|
||||||
excel_io = io.BytesIO()
|
excel_io = io.BytesIO()
|
||||||
with pd.ExcelWriter(excel_io, engine='openpyxl') as writer:
|
with pd.ExcelWriter(excel_io, engine='openpyxl') as writer:
|
||||||
df_out.to_excel(writer, index=False, sheet_name="발주")
|
df_out.to_excel(writer, index=False, sheet_name="발주")
|
||||||
|
worksheet = writer.sheets["발주"]
|
||||||
|
from openpyxl.utils import get_column_letter
|
||||||
|
for col_idx, col_name in enumerate(df_out.columns, start=1):
|
||||||
|
header_w = _excel_display_len(col_name)
|
||||||
|
data_w = max(
|
||||||
|
(_excel_display_len(v) for v in df_out[col_name].values),
|
||||||
|
default=0,
|
||||||
|
)
|
||||||
|
# 최소 10, 최대 60 으로 클램프 + 여백 2
|
||||||
|
worksheet.column_dimensions[get_column_letter(col_idx)].width = (
|
||||||
|
min(60, max(10, max(header_w, data_w) + 2))
|
||||||
|
)
|
||||||
excel_io.seek(0)
|
excel_io.seek(0)
|
||||||
|
|
||||||
# 6. 다운로드 파일명: "MM월 DD일 (요일)_발주_(낱개 상품 출고).xls"
|
# 6. 다운로드 파일명: "MM월 DD일 (요일)_발주_(낱개 상품 출고).xls"
|
||||||
|
|||||||
Reference in New Issue
Block a user