엑셀(.xlsx·.xls)이나 CSV 파일을 JSON으로 변환하고 그 자리에서 편집해요. 드래그앤드롭·파일 선택, 시트 선택, 객체 배열 또는 2차원 배열, 실시간 JSON 유효성 검사와 정렬·최소화까지. 파일은 브라우저에서만 처리돼 서버로 전송되지 않는 무료 온라인 변환·편집기.
엑셀 파일(.xlsx·.xls)과 CSV는 둘 다 표 모양이지만 저장 방식이 달라요. .xlsx는 시트·셀·서식이 든 XML 묶음이고, CSV는 쉼표로 칸을 나눈 순수 텍스트예요. 이 변환기는 오픈소스 SheetJS 라이브러리로 파일을 읽어 시트마다 셀 값을 꺼낸 뒤, 선택한 형식대로 JSON 문자열을 만들어요. JSON은 국제 표준 ECMA-404와 IETF RFC 8259로 정의된 형식이라 키와 문자열은 반드시 큰따옴표로 감싸고, 마지막 항목 뒤에 쉼표를 붙이거나 주석을 넣으면 안 돼요. 편집기의 유효성 검사는 이 규칙대로 JSON.parse를 돌려 결과를 알려줘요.
객체 배열은 첫 행을 키(헤더)로 쓰고 둘째 행부터 한 행을 객체 하나로 만들어요. 이름·나이·입사일 세 열에 두 사람이 있는 표라면 [{"이름":"홍길동","나이":30,"입사일":46308},{"이름":"김영희","나이":null,"입사일":45658}] 처럼 나와요. 비어 있는 셀은 null로 채워 모든 객체가 같은 키를 갖게 하고, 완전히 비어 있는 행은 건너뛰어요. 헤더가 같은 열이 두 개면 두 번째 키 뒤에 _1이 붙어 "나이"와 "나이_1"이 되고, 헤더 셀이 비어 있으면 __EMPTY라는 키가 돼요. 2차원 배열은 헤더 구분 없이 첫 행부터 셀을 그대로 [["이름","나이","입사일"],["홍길동",30,46308]] 형태로 담고, 행 끝의 빈 셀은 생략해 행마다 길이가 다를 수 있어요.
위 예시에서 입사일이 2026-10-13이 아니라 46308로 나온 이유는 엑셀이 날짜를 숫자로 저장하기 때문이에요. 엑셀의 1900 날짜 체계는 1899년 12월 30일을 0으로 두고 하루에 1씩 더한 일련번호로 날짜를 표현해요. 2025년 1월 1일은 45658, 2026년 10월 13일은 46308이에요. 화면에 2026-10-13으로 보이는 건 표시 서식일 뿐이라 변환하면 원래 값인 숫자가 나와요. 받는 쪽에서 날짜로 되돌리려면 자바스크립트는 new Date(Date.UTC(1899, 11, 30) + n × 86400000), 파이썬은 datetime(1899, 12, 30) + timedelta(days=n)으로 계산하면 돼요. 처음부터 문자열로 받고 싶다면 엑셀에서 TEXT(A2, "yyyy-mm-dd") 수식으로 열을 하나 만들거나 열 서식을 텍스트로 바꾼 뒤 다시 입력하세요. 1900년 3월 1일 이전 날짜는 엑셀이 존재하지 않는 1900년 2월 29일을 인정하는 호환 버그 때문에 하루가 어긋나지만 실무 데이터에서는 거의 만나지 않아요.
다른 값도 엑셀이 저장한 원래 값대로 나와요. 15%로 보이는 셀은 0.15, 7.5%는 0.075이고, ₩1,000처럼 통화 서식이 붙은 셀은 1000이에요. 수식 셀은 수식이 아니라 마지막으로 계산된 값이 들어가요(=A2+B2 → 3). 병합된 셀은 왼쪽 위 칸에만 값이 있고 나머지 칸은 null이라, 부서 이름을 세로로 병합한 표는 두 번째 사람부터 "부서":null이 돼요. 01012345678처럼 0으로 시작하는 번호를 숫자 서식으로 입력했다면 엑셀이 이미 1012345678로 저장해 두었기 때문에 JSON에서도 0이 없어요. 하이픈을 넣거나(010-1234-5678) 셀을 텍스트 서식으로 바꾸고 입력하면 문자열로 그대로 보존돼요.
아주 큰 정수는 정밀도를 잃어요. JSON 자체는 자릿수 제한이 없지만 브라우저와 대부분의 언어가 숫자를 IEEE 754 배정밀도로 다루기 때문에 9,007,199,254,740,991(2⁵³ − 1)을 넘는 정수는 끝자리가 바뀌어요. 예를 들어 12345678901234567890은 12345678901234567000으로, 9999999999999999는 10000000000000000으로 나와요. 16자리 카드번호, 계좌번호, 주문번호처럼 숫자처럼 생겼지만 계산하지 않는 값은 엑셀에서 텍스트 서식으로 두어야 해요. 13자리 주민등록번호는 2⁵³보다 작아 숫자로도 깨지지 않지만 앞자리 0이 사라질 수 있으니 역시 텍스트가 안전해요.
CSV는 RFC 4180 규칙대로 읽어요. 쉼표가 칸을 나누고, 값 안에 쉼표나 줄바꿈이 있으면 큰따옴표로 감싸고, 값 안의 큰따옴표는 두 번 써요. "안녕, 반가워"처럼 따옴표로 감싼 값은 쉼표가 들어 있어도 한 칸으로 읽혀요. 엑셀의 기본 ‘CSV(쉼표로 분리)’ 저장은 윈도우 한국어 환경에서 UTF-8이 아닌 코드페이지를 쓰기 때문에 한글이 깨져 보일 수 있어요. 그럴 때는 엑셀의 다른 이름으로 저장에서 ‘CSV UTF-8(쉼표로 분리)’을 고르거나 .xlsx 그대로 올리세요. 구글 시트는 파일 → 다운로드 → Microsoft Excel(.xlsx)로 받으면 시트 여러 개가 그대로 유지돼요.
변환된 JSON은 편집기에서 바로 고칠 수 있고, 글자를 바꿀 때마다 유효성을 다시 검사해요. 가장 흔한 오류 두 가지는 마지막 항목 뒤의 쉼표와 작은따옴표예요. {"a": 1, "b": 2,} 처럼 끝에 쉼표가 남으면 “Expected double-quoted property name” 오류가 닫는 괄호 위치(이 경우 4행 1열)에 표시되고, {'a': 1} 처럼 작은따옴표를 쓰면 “Expected property name or '}'” 오류가 1행 2열에 표시돼요. 유효한 동안에만 다운로드·정렬·최소화 버튼이 켜지고, 복사와 다운로드는 항상 편집기에 있는 현재 내용을 써요. 정렬은 들여쓰기 2칸, 최소화는 공백을 모두 지운 한 줄이라 전송 용량을 줄일 때는 최소화가 유리해요.
올릴 수 있는 파일은 20MB까지예요. 브라우저 탭이 멈추지 않게 둔 한도라, 그보다 큰 파일은 시트를 나누거나 필요한 열만 남겨서 올리세요. 파일은 서버로 전송되지 않고 자바스크립트가 브라우저 안에서 읽기 때문에 네트워크를 끊어도 동작하고, 회사 자료나 개인정보가 든 표를 변환할 때도 외부로 나가지 않아요. 결과는 API 요청 본문 테스트, 번역 사전이나 설정 파일 생성, mongoimport --jsonArray 같은 데이터베이스 적재에 그대로 쓸 수 있어요. 헤더가 두 줄이거나 제목 행이 위에 있는 표는 첫 행이 키로 잡혀 엉뚱한 결과가 나오니 엑셀에서 헤더 한 줄만 남기고 올리는 게 가장 간단해요.
아니요. 모든 변환은 브라우저 안에서만 이뤄져요. 파일은 어디에도 업로드되지 않고, 인터넷 연결이 끊겨도 동작해요. 그래서 사내 자료나 개인정보가 담긴 표도 외부로 내보내지 않고 변환할 수 있어요.
엑셀 .xlsx·.xls와 .csv를 20MB까지 지원해요. 여러 시트가 있는 엑셀은 시트를 골라 변환할 수 있고, 출력은 첫 행을 키로 쓰는 객체 배열 또는 2차원 배열 중에서 선택할 수 있어요. 구글 시트는 .xlsx로 내려받아 올리세요.
객체 배열은 첫 행을 키(헤더)로 삼아 [{"이름":"홍길동","나이":30}] 형태로 만들고 빈 셀은 null로 채워요. 2차원 배열은 헤더 구분 없이 셀을 그대로 [["이름","나이"],["홍길동",30]] 로 담아요. API 입력이나 데이터베이스 적재에는 객체 배열이, 원본 표 구조 보존에는 2차원 배열이 편해요.
엑셀이 날짜를 1899년 12월 30일 기준 경과 일수로 저장하기 때문이에요. 46308은 2026년 10월 13일, 45658은 2025년 1월 1일이에요. 자바스크립트는 new Date(Date.UTC(1899, 11, 30) + n × 86400000), 파이썬은 datetime(1899, 12, 30) + timedelta(days=n)으로 되돌릴 수 있어요. 문자열로 받고 싶으면 엑셀에서 TEXT(A2, "yyyy-mm-dd") 열을 만들어 올리세요.
엑셀이 숫자 서식 셀의 앞자리 0을 저장하지 않기 때문에 01012345678은 이미 1012345678로 들어 있어요. 엑셀에서 셀 서식을 텍스트로 바꾼 뒤 다시 입력하거나 하이픈(010-1234-5678)을 넣으면 문자열로 보존돼요. 주민등록번호·계좌번호·카드번호도 같은 이유로 텍스트 서식이 안전해요.
엑셀의 기본 CSV 저장이 UTF-8이 아닌 윈도우 코드페이지로 글자를 기록하기 때문이에요. 다른 이름으로 저장에서 ‘CSV UTF-8(쉼표로 분리)’을 고르거나, .xlsx 파일을 그대로 올리면 깨지지 않아요.
엑셀이 저장한 원래 값이 그렇기 때문이에요. 15%는 0.15, ₩1,000은 1000이고, 수식 셀은 마지막으로 계산된 결과값만 들어가요. 100을 곱한 퍼센트 값이 필요하면 엑셀에서 열을 하나 더 만들거나 JSON을 받은 쪽에서 변환하세요.
객체 배열은 무조건 첫 행을 키로 쓰기 때문에 제목 행이 키가 되고 실제 헤더는 데이터로 들어가요. 엑셀에서 헤더 한 줄만 맨 위에 남기고 올리는 게 가장 간단하고, 구조를 그대로 보고 싶다면 2차원 배열로 변환한 뒤 필요한 행을 골라 쓰세요.
편집기의 내용이 유효한 JSON이 아닐 때는 다운로드·정렬·최소화가 꺼져요. 편집기 아래에 오류 사유와 행·열 위치가 표시되니 그 자리를 확인하세요. 마지막 항목 뒤의 쉼표, 작은따옴표, 닫히지 않은 괄호가 가장 흔한 원인이에요.
브라우저가 숫자를 배정밀도 부동소수점으로 다뤄서 9,007,199,254,740,991을 넘는 정수는 정확히 표현되지 않아요. 12345678901234567890은 12345678901234567000으로 나와요. 계산하지 않는 식별 번호는 엑셀에서 텍스트 서식으로 두면 문자열로 그대로 나와요.