출고 엑셀을 택배 업로드 양식으로 옮길 때 자주 틀리는 곳은 이런 데입니다. 품목코드나 우편번호 앞의 0이 사라지고, 날짜가 양식과 다른 모양으로 들어가고, 수량이 0이거나 우편번호가 빈 행이 그대로 넘어갑니다. 열 이름이 서로 달라 복사하고 순서를 바꾸다가 엉뚱한 열을 옮기기도 합니다. 이런 행을 업로드한 뒤에 발견하면 다시 찾아 고쳐야 합니다.
이 글은 그런 행을 업로드 전에 걸러 내는 작은 변환 도구를 AI 코딩 도구로 만들고 합성 파일로 시험한 기록입니다. 파일을 불러와 열을 짝짓고, 규칙에 맞지 않는 행은 원본 행 번호와 사유를 붙여 따로 빼고, 정상 행만 새 XLSX로 내려받습니다. 파일 내용은 서버로 보내지 않고 브라우저 안에서만 처리합니다. 출고 양식 변환 데모에서 합성 파일로 직접 시험할 수 있습니다. 합성 데이터만 썼고, 결과 열 7개는 이 데모를 위해 정한 것이라 특정 택배사나 물류 회사의 양식이 아닙니다.

먼저 결과를 요약합니다.
- 기본 합성 예시 5행은 정상 3행, 오류 2행으로 나뉘었습니다. 수량
0인 행과 우편번호가 빈 행이 빠졌고, 품목코드000184와 우편번호04524의 앞 0은 결과 파일에 그대로 남았습니다. - 경계 사례를 모은 합성 XLSX 9행은 정상 3행, 오류 6행이었습니다. 없는 날짜, 소수·음수 수량, 4자리 우편번호, 빈 필수값을 모두 잡았습니다.
- 못 잡는 것도 있습니다. 원본에서 이미 0이 빠져
184가 된 품목코드는 그대로 통과하고, 수량에는 위쪽 한도가 없어100000도 통과합니다. 주소와 우편번호가 실제로 있는지도 확인하지 않습니다.
오류로 잡는 규칙
아래 표는 데모의 변환 코드(convert.js)에 들어 있는 판정 규칙입니다. 가운데 열의 예는 합성 시험 파일에서 실제로 걸린 값입니다. 한 행에 틀린 곳이 여러 개면 사유를 모두 적고, 하나라도 틀리면 그 행은 결과 파일에서 빠집니다.
| 항목 | 통과 조건 | 합성 파일에서 걸린 예 | 주의할 점 |
|---|---|---|---|
| 파일 | XLSX 또는 CSV, 5MB 이하. 첫 번째 시트만 읽고 첫 행을 열 이름으로 씀 | 열 이름이 겹친 CSV는 불러오기 단계에서 거부 | 열 이름이 비어 있어도 거부. 맨 위에 합계 행이 있거나 머리글이 두 줄인 표는 그 줄을 지우고 넣어야 함 |
| 열 짝짓기 | 결과 7개 항목마다 원본 열을 하나씩 지정. 한 원본 열은 한 번만 | 품목코드와 품목명에 같은 열을 지정하거나 주소를 비우면 변환을 막음 | 미리 정해 둔 열 이름(예 출고 날짜·상품 코드)이면 자동으로 골라 두지만, 고른 열의 내용이 맞는지는 판단하지 않음 |
| 출고일 | 글자가 정확히 YYYY-MM-DD 모양이고 달력에 있는 날짜 | 2026-02-30, 2026-13-01 오류. 윤일 2028-02-29는 통과 | 2026/09/29처럼 모양이 다르면 바꿔 주지 않고 오류로 뺌 |
| 수량 | 1 이상의 정수 | 0, 1.5, -2 오류 | 쉼표가 든 1,000, 0으로 시작하는 012도 오류. 위쪽 한도는 없어 100000은 통과 |
| 우편번호 | 숫자 정확히 5자리 | 빈칸, 1234, ABCDE, 12A45 오류 | 실제로 있는 우편번호인지는 확인하지 않음 |
| 품목코드·품목명·수령인·주소 | 빈칸이 아닐 것(공백만 있어도 빈칸) | 품목명·수령인이 빈 행은 오류 2개, 날짜·품목코드·우편번호·주소가 모두 틀린 행은 오류 4개 | 품목코드 자릿수는 보지 않아 앞 0이 빠진 184도 통과 |
| 빈 행 | 건너뜀 | 빈 4행 다음의 오류를 원본 엑셀 행 번호 5로 표시 | 빈 행이 있어도 뒤 행의 번호가 밀리지 않음 |
| 내려받기 | 정상 행은 XLSX, 오류 행은 CSV(원본 행·품목코드·사유) | 기본 예시에서 정상 3행 XLSX와 오류 2행 CSV | 결과 XLSX는 수량까지 7개 열을 모두 글자 칸으로 씀. 오류 CSV는 = + - @로 시작하는 값 앞에 '를 붙여 수식으로 읽히지 않게 함 |
합성 파일로 돌려 본 결과
기본 예시의 첫 행은 2026-09-29 / 000184 / 노트 A5 / 12 / 김하늘 / 04524 / 서울시 중구 세종대로 1입니다. 정상으로 처리했고 품목코드와 우편번호의 앞 0을 글자로 유지했습니다. 5개 데이터 행 가운데 3개가 정상, 2개가 오류였습니다. 원본 4행은 수량이 0, 원본 5행은 우편번호가 빈 값이어서 빠졌습니다.
경계 사례를 모은 합성 XLSX(mixed-cases.xlsx)는 한 줄씩 이렇게 판정했습니다. 이름과 주소는 모두 가상 값입니다.
| 원본 행 | 넣은 값 | 판정 |
|---|---|---|
| 2 | 출고일 2028-02-29(윤일), 품목코드 000001, 우편번호 00001 | 정상. 앞 0 유지 |
| 3 | 출고일 2026-02-30 | 오류(출고일) |
| 4 | 빈 행 | 건너뜀 |
| 5 | 수량 1.5 | 오류(수량) |
| 6 | 수량 -2 | 오류(수량) |
| 7 | 우편번호 1234 | 오류(우편번호) |
| 8 | 품목명·수령인 빈칸 | 오류 2개 |
| 9 | 품목명 메모지, 대형, 주소 가상시 테스트로 7, 2층 | 정상. 쉼표 든 값 유지 |
| 10 | 출고일 2026-13-01, 품목코드 빈칸, 우편번호 ABCDE, 주소 빈칸 | 오류 4개 |
| 11 | 수량 100000 | 정상(수량 한도 없음) |
열 순서와 이름을 바꾼 CSV(배송지·받는사람·우편·개수·제품 이름·코드·날짜 순서)는 자동으로 짝지어지지 않은 열을 손으로 고른 뒤 돌렸습니다. 3행 중 정상 2행, 오류 1행(우편번호 12A45)이었습니다. 쉼표가 든 주소 가상시 쉼표로 1, 2층과 000009·00009의 앞 0도 그대로 남았습니다. 열 이름이 겹친 CSV는 불러오기 단계에서 거부했습니다. 이 숫자는 합성 파일을 돌린 결과이며 실제 출고 데이터의 오류율을 뜻하지 않습니다.
앞자리 0이 사라지는 경우
이 도구는 셀 값을 글자로 읽고 결과 XLSX에도 글자 칸으로 씁니다. 그래서 원본에 글자로 들어 있던 000184와 04524는 결과 파일을 다시 열어도 그대로입니다. CSV도 글자 그대로 읽어 000009와 00009가 남았습니다.
원본에서 이미 숫자 칸으로 저장돼 0이 빠졌다면 되살리지 못합니다. 이때 두 열의 결과가 다릅니다. 우편번호는 5자리 규칙이 있어 4524처럼 4자리가 되면 오류로 잡힙니다. 품목코드는 자릿수 규칙이 없어 184가 그대로 통과합니다. 품목코드 자릿수가 정해진 업무라면 그 규칙을 따로 더해야 합니다. XLSX는 셀에 보이는 글자를 읽기 때문에 숫자 칸에 표시 서식이 걸려 있으면 결과가 달라질 수 있는데, 이 경우는 시험하지 않았습니다.
파일 넣고 결과 받기
- 합성 예시로 시작을 누르거나 합성 XLSX 예시 내려받기로 파일을 받아 다시 올립니다. 자기 파일을 시험할 때는 개인·고객 정보를 지운 복사본을 쓰세요.
- 일곱 개 결과 항목의 원본 열을 확인하고 필요한 짝을 바꿉니다.
- 변환 실행을 누릅니다. 전체·정상·오류 행 수와 행별 판정이 나타납니다.
- 정상 행 XLSX 받기와 오류 목록 CSV 받기로 결과를 나눠 확인합니다.
실제 양식에 쓰기 전에 맞춰 볼 것
이 데모의 결과 열과 규칙은 고정돼 있어 자기 양식에 그대로 쓰기는 어렵습니다. 비슷한 변환을 직접 만들거나 맡길 때 먼저 확인할 것을 정리했습니다.
- 올릴 곳의 빈 업로드 템플릿에서 열 이름, 필수값, 날짜 모양, 자료형을 확인합니다. 수량을 숫자 칸으로 받아야 하는지도 봅니다. 이 데모는 수량도 글자 칸으로 씁니다.
- 원본 엑셀의 머리글 위치와 합계 행을 봅니다. 맨 아래 합계 행은 이 데모가 따로 알아보지 않고 데이터 행으로 읽습니다.
- 품목코드와 우편번호 열이 원본에서 글자 칸인지 확인합니다.
- 낱개·박스 같은 수량 단위, 비고란 문구처럼 업무마다 다른 규칙과, 원본에 없는 필수값(거래처·주소 등)을 어디서 가져올지 정합니다. 이 데모에는 이런 규칙이 없습니다.
- 실제 템플릿으로 기대 결과 파일을 만들어 한 칸씩 비교하고, 실제 업로드 화면이 그 파일을 받아들이는지까지 확인합니다.
- 개인정보가 든 실제 파일은 시험에 쓸 최소 범위부터 정합니다.
자동 시험 8건과 내려받은 파일 확인
합성 데이터에 대한 자동 시험 8건이 통과했습니다. 2026년 10월 8일 이 글을 고치면서 다시 돌려도 8건 모두 통과했습니다. 시험 내용은 정상·오류 행 분리, 앞 0 유지, 중복·누락 짝짓기 차단, 잘못된 날짜·수량 거부, XLSX를 쓴 뒤 다시 읽기, 위 경계 사례 XLSX, 열 순서를 바꾼 CSV, 열 이름이 겹친 CSV 거부입니다.
제작 중에는 기본 예시를 돌려 내려받은 결과 XLSX를 다시 열어 정상 3행과 000184·04524를 확인했고, 오류 CSV에서 오류 2행(원본 4행 수량, 5행 우편번호)을 확인했습니다. 위 이미지는 기본 예시 시험 화면입니다. 2026년 9월 29일 공개한 뒤에는 공개 데모 페이지에서 기본 예시 5행 중 정상 3행·오류 2행, 경계 사례 XLSX 9행 중 정상 3행·오류 6행을 다시 확인했고, 빈 행 뒤의 오류는 원본 행 번호 5로 나왔습니다.
이 변환기가 못 하는 것
결과 열과 검증 규칙은 이 데모를 위해 정한 것이며 바꿀 수 없습니다. 실제 회사의 서식이나 택배사별 규칙이 아닙니다. 첫 번째 시트, 첫 행 머리글, 5MB 이하의 XLSX·CSV만 다룹니다. 중복 출고, 주소 유효성, 물류 시스템 연동, 매크로, 대량 파일 처리 성능은 검증하지 않았습니다. 천 단위 쉼표나 날짜 표시 서식이 걸린 엑셀 숫자 칸도 시험하지 않았습니다.
만든 계기와 AI 사용
이 데모는 위시켓에 올라온 공개 ‘엑셀 출고 데이터 업로드 양식 자동 변환’ 공고의 제목에서 출발한 독립 실험입니다. 의뢰받거나 계약·납품한 작업이 아닙니다.
데모 코드와 자동 시험, 화면 확인과 처음 글 초안은 AI 코딩 도구(Codex) 작업으로 만들었습니다. 2026년 10월 개정본은 Claude가 저장소의 코드·시험 파일·제작 기록과 대조해 다시 썼습니다. 변환 기능 자체는 AI 모델을 부르지 않는 규칙 기반 JavaScript이고, 엑셀 읽기·쓰기에는 SheetJS CE 0.18.5 브라우저 번들을 씁니다. 2026년 10월 8일 J. Kim이 이 개정본을 읽고 승인했습니다.
이 사이트의 다른 도구와 데모는 Tools 페이지에 모아 두었습니다.



