# JSON 데이터 EXCEL 파일 변환



JSON 배열 데이터를 보내면 시트 하나짜리 엑셀(XLSX) 파일로 돌려줍니다. 응답은 JSON이 아닌 XLSX 파일입니다.



인증: Authorization: Bearer $APICK_API_KEY

본문 있는 REST 요청: multipart/form-data. GET 본문 및 MCP JSON-RPC 규격은 해당 명세를 따릅니다.

인증키는 서버에 보관하세요. 모든 예제는 정적 자료입니다.



## POST /rest/json_to_excel 응답 필드

## API 요청: POST /rest/json_to_excel



### 입력

- `data_list` (array, 필수): 변환할 데이터 목록. 객체 배열 또는 2차원 배열 (2차원 배열은 모든 행의 열 개수가 같아야 함)

- `sheet_name` (string, 선택): 시트 이름. 생략하면 서버 기본 이름을 사용합니다. 문자열로 보내며, 생략하면 서버 기본값이 적용되거나 해당 조건이 해제됩니다.

- `data_list[0][0]` (string, 조건부): 엑셀로 변환할 2차원 배열의 첫 행·첫 셀 값입니다. 모든 행의 열 개수가 같아야 하며, 첫 행은 보통 제목으로 사용됩니다.

- `data_list[0][컬럼명]` (string, 조건부): 객체 배열의 셀. 모든 행에 같은 컬럼 이름을 사용하는 것을 권장합니다. 숫자처럼 보이는 문자열도 그대로 보존됩니다.

- `__apick_type[data_list][0][컬럼명]` (string, 선택): 셀 타입 지정. 생략하면 string. number·boolean은 해당 값을, null·빈 array·빈 object는 빈 폼 값을 함께 보냅니다. 숫자 이름의 객체 열은 __apick_type[data_list][0]=object로 행 타입도 지정하세요. 비어 있지 않은 컨테이너는 타입과 하위 필드만 보냅니다. 가능한 값은 6가지입니다. string = 문자열 셀로 전송하는 값입니다. 숫자·날짜처럼 보여도 문자 그대로 저장됩니다. number = 숫자 셀로 전송하는 값입니다. 앞자리 0·천 단위 구분은 사라집니다. boolean = TRUE/FALSE 셀 값으로 전송하는 값입니다. 문자열 "true"와 다릅니다. null = 빈 셀(null)로 전송하는 값입니다. 빈 문자열과 구분됩니다. array = 배열(목록) 셀로 전송하는 값입니다. 하위 항목을 여러 개 가질 수 있습니다. object = 객체(구조) 셀로 전송하는 값입니다. 하위 필드를 이름으로 가집니다. 허용값: string, number, boolean, null, array, object



### 응답 명세

```json

{
  "type": "string",
  "format": "binary"
}

```

### curl

```curl

curl --fail-with-body --request POST 'https://apick.app/rest/json_to_excel' \
  --header "Authorization: Bearer $APICK_API_KEY" \
  --form-string '__apick_type[data_list]=array' \
  --form-string '__apick_type[data_list][0]=object' \
  --form-string 'data_list[0][상품명]=사과' \
  --form-string '__apick_type[data_list][0][수량]=number' \
  --form-string 'data_list[0][수량]=3' \
  --form-string '__apick_type[data_list][0][단가]=number' \
  --form-string 'data_list[0][단가]=1200' \
  --form-string '__apick_type[data_list][1]=object' \
  --form-string 'data_list[1][상품명]=배' \
  --form-string '__apick_type[data_list][1][수량]=number' \
  --form-string 'data_list[1][수량]=2' \
  --form-string '__apick_type[data_list][1][단가]=number' \
  --form-string 'data_list[1][단가]=2500' \
  --form-string 'sheet_name=주문목록' \
  --dump-header response.headers --output result.xlsx
# response.headers의 Content-Type을 확인한 뒤 파일을 사용하세요.

```

### Node.js (서버 ESM)

```javascript

const form = new FormData();
form.append("__apick_type[data_list]", "array");
form.append("__apick_type[data_list][0]", "object");
form.append("data_list[0][상품명]", "사과");
form.append("__apick_type[data_list][0][수량]", "number");
form.append("data_list[0][수량]", "3");
form.append("__apick_type[data_list][0][단가]", "number");
form.append("data_list[0][단가]", "1200");
form.append("__apick_type[data_list][1]", "object");
form.append("data_list[1][상품명]", "배");
form.append("__apick_type[data_list][1][수량]", "number");
form.append("data_list[1][수량]", "2");
form.append("__apick_type[data_list][1][단가]", "number");
form.append("data_list[1][단가]", "2500");
form.append("sheet_name", "주문목록");
const response = await fetch("https://apick.app/rest/json_to_excel", {
  method: "POST",
  headers: { Authorization: "Bearer " + process.env.APICK_API_KEY },
  body: form,
  signal: AbortSignal.timeout(120_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
if ((response.headers.get("content-type") || "").includes("json")) {
  throw new Error(JSON.stringify(await response.json()));
}
const { writeFile } = await import("node:fs/promises");
await writeFile("result.xlsx", new Uint8Array(await response.arrayBuffer()));

```

### python

```python

import os
import requests
parts = [
    ("__apick_type[data_list]", (None, "array")),
    ("__apick_type[data_list][0]", (None, "object")),
    ("data_list[0][상품명]", (None, "사과")),
    ("__apick_type[data_list][0][수량]", (None, "number")),
    ("data_list[0][수량]", (None, "3")),
    ("__apick_type[data_list][0][단가]", (None, "number")),
    ("data_list[0][단가]", (None, "1200")),
    ("__apick_type[data_list][1]", (None, "object")),
    ("data_list[1][상품명]", (None, "배")),
    ("__apick_type[data_list][1][수량]", (None, "number")),
    ("data_list[1][수량]", (None, "2")),
    ("__apick_type[data_list][1][단가]", (None, "number")),
    ("data_list[1][단가]", (None, "2500")),
    ("sheet_name", (None, "주문목록")),
]
response = requests.request("POST", "https://apick.app/rest/json_to_excel",
    headers={"Authorization": "Bearer " + os.environ["APICK_API_KEY"]},
    files=parts,
    timeout=(10, 120), stream=True)
response.raise_for_status()
if "json" in response.headers.get("Content-Type", ""):
    raise RuntimeError(response.json())
with open("result.xlsx", "wb") as output:
    for chunk in response.iter_content(65536):
        output.write(chunk)

```

### php

```php

<?php
$headers = ["Authorization: Bearer " . getenv("APICK_API_KEY")];
$form = [
    '__apick_type[data_list]' => 'array',
    '__apick_type[data_list][0]' => 'object',
    'data_list[0][상품명]' => '사과',
    '__apick_type[data_list][0][수량]' => 'number',
    'data_list[0][수량]' => '3',
    '__apick_type[data_list][0][단가]' => 'number',
    'data_list[0][단가]' => '1200',
    '__apick_type[data_list][1]' => 'object',
    'data_list[1][상품명]' => '배',
    '__apick_type[data_list][1][수량]' => 'number',
    'data_list[1][수량]' => '2',
    '__apick_type[data_list][1][단가]' => 'number',
    'data_list[1][단가]' => '2500',
    'sheet_name' => '주문목록',
];
$curl = curl_init('https://apick.app/rest/json_to_excel');
curl_setopt_array($curl, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_POSTFIELDS => $form,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 120,
]);
$body = curl_exec($curl);
if ($body === false) { throw new RuntimeException(curl_error($curl)); }
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$type = curl_getinfo($curl, CURLINFO_CONTENT_TYPE) ?: "";
curl_close($curl);
if ($status >= 400) { throw new RuntimeException($body); }
if (strpos($type, "json") !== false) { throw new RuntimeException($body); }
file_put_contents('result.xlsx', $body);

```

## 사용 예시 1. 주문 목록을 엑셀로

객체 배열을 보내면 첫 행에 컬럼 이름이, 그 아래에 값이 채워집니다. 숫자 값에는 숫자 셀 표시가 함께 붙습니다.

```bash

curl --fail-with-body --request POST 'https://apick.app/rest/json_to_excel' \
  --header "Authorization: Bearer $APICK_API_KEY" \
  --form-string '__apick_type[data_list]=array' \
  --form-string '__apick_type[data_list][0]=object' \
  --form-string 'data_list[0][상품명]=사과' \
  --form-string '__apick_type[data_list][0][수량]=number' \
  --form-string 'data_list[0][수량]=3' \
  --form-string '__apick_type[data_list][0][단가]=number' \
  --form-string 'data_list[0][단가]=1200' \
  --form-string '__apick_type[data_list][1]=object' \
  --form-string 'data_list[1][상품명]=배' \
  --form-string '__apick_type[data_list][1][수량]=number' \
  --form-string 'data_list[1][수량]=2' \
  --form-string '__apick_type[data_list][1][단가]=number' \
  --form-string 'data_list[1][단가]=2500' \
  --form-string 'sheet_name=주문목록' \
  --dump-header response.headers --output result.xlsx
# response.headers의 Content-Type을 확인한 뒤 파일을 사용하세요.

```

- 응답 `Content-Type`이 XLSX이면 `output.xlsx`로 저장합니다.

- 응답 헤더 `cost`는 셀 수(컬럼 이름 행 포함) × 셀당 요금입니다.

## 사용 예시 2. 수량을 문자 셀로 저장

상품 코드처럼 앞자리 0을 지켜야 하는 값은 숫자 셀 표시를 빼고 문자로 보냅니다.

```bash

curl --fail-with-body --request POST 'https://apick.app/rest/json_to_excel' \
  --header "Authorization: Bearer $APICK_API_KEY" \
  --form-string '__apick_type[data_list]=array' \
  --form-string '__apick_type[data_list][0]=object' \
  --form-string 'data_list[0][상품명]=사과' \
  --form-string '__apick_type[data_list][0][단가]=number' \
  --form-string 'data_list[0][단가]=1200' \
  --form-string '__apick_type[data_list][1]=object' \
  --form-string 'data_list[1][상품명]=배' \
  --form-string '__apick_type[data_list][1][단가]=number' \
  --form-string 'data_list[1][단가]=2500' \
  --form-string 'sheet_name=주문목록' \
  --form-string 'data_list[0][수량]=003' \
  --form-string 'data_list[1][수량]=002' \
  --dump-header response.headers --output result.xlsx
# response.headers의 Content-Type을 확인한 뒤 파일을 사용하세요.

```

- 숫자 셀 표시가 없는 값은 보낸 문자 그대로 저장됩니다.

## 사용 예시 3. 시트 이름 생략

시트 이름이 필요 없으면 빼고 보냅니다. 기본 시트 이름이 붙습니다.

```bash

curl --fail-with-body --request POST 'https://apick.app/rest/json_to_excel' \
  --header "Authorization: Bearer $APICK_API_KEY" \
  --form-string '__apick_type[data_list]=array' \
  --form-string '__apick_type[data_list][0]=object' \
  --form-string 'data_list[0][상품명]=사과' \
  --form-string '__apick_type[data_list][0][수량]=number' \
  --form-string 'data_list[0][수량]=3' \
  --form-string '__apick_type[data_list][0][단가]=number' \
  --form-string 'data_list[0][단가]=1200' \
  --form-string '__apick_type[data_list][1]=object' \
  --form-string 'data_list[1][상품명]=배' \
  --form-string '__apick_type[data_list][1][수량]=number' \
  --form-string 'data_list[1][수량]=2' \
  --form-string '__apick_type[data_list][1][단가]=number' \
  --form-string 'data_list[1][단가]=2500' \
  --dump-header response.headers --output result.xlsx
# response.headers의 Content-Type을 확인한 뒤 파일을 사용하세요.

```

- `data_list`가 비어 있거나 행이 객체·배열이 아니면 `입력 항목이 잘못됐습니다.`로 거절됩니다.

## 코드·오류

## 상세 기능·요금

이용 전 확인 주문·회원·정산 목록을 관리자에게 엑셀로 내려주거나, 조회 결과를 보고서용 파일로 저장할 때 사용합니다. data_list는 두 가지 모양을 받습니다. 형식설명 객체 배열[{"상품명":"사과","수량":3}, …]. 첫 행에 컬럼 이름이 들어가고 그 아래에 값이 채워집니다. 컬럼 목록과 순서는 항목이 가장 많은 행을 기준으로 정해지므로 모든 행에 같은 컬럼 이름을 쓰세요. 없는 컬럼은 빈 칸이 됩니다. 2차원 배열[["상품명","수량"],["사과",3]]. 보낸 그대로 행·열에 채워집니다. 모든 행의 칸 수가 같아야 하며 다르면 거절됩니다. 요금은 만들어진 셀 하나당 1P입니다. 객체 배열은 컬럼 이름 행도 셀 수에 들어갑니다(2행 × 3컬럼 객체 배열 = 3행 × 3열 = 9셀). 실패 응답은 과금되지 않습니다.

## 상세 요청

항목설정 메서드·주소POST https://apick.app/rest/json_to_excel 인증 헤더Authorization: Bearer 내 계정의 API 인증키 본문 형식application/json 또는 multipart/form-data form-data로 보낼 때는 셀마다 data_list[0][상품명]=사과처럼 경로를 이름으로 씁니다. 값은 기본적으로 문자 셀로 저장되며, 숫자 셀로 저장하려면 __apick_type[data_list][0][수량]=number를 함께 보내세요. 아래 JSON 예시를 그대로 쓰면 숫자 값에 이 표시가 자동으로 붙습니다. 요청 예시 form-data 전체 예제 보기

## 상세 응답

성공하면 XLSX 본문이 바로 옵니다. 내려받기 파일명은 output.xlsx입니다. 응답 헤더 필드타입설명 successinteger1이면 파일 생성에 성공한 것입니다. costinteger이번 요청에서 차감된 포인트입니다(셀 수 × 셀당 요금). msinteger처리 시간(밀리초)입니다. Content-Typestringapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet

## 상세 코드·정책

오류와 대처 실패하면 파일 대신 JSON이 옵니다. HTTP 상태와 Content-Type을 먼저 확인하고, JSON이면 data.error 문구를 기록하세요. 실패 응답의 api.cost는 0입니다. HTTPdata.error대처 400입력 항목이 잘못됐습니다.data_list가 비어 있지 않은 배열인지, 각 행이 객체 또는 배열인지, 2차원 배열의 칸 수가 모두 같은지 확인하세요. 424알 수 없는 이유로 실패했습니다.시트 이름은 엑셀 규칙(31자 이하, \ / ? * [ ] : 제외)에 맞추고 다시 요청하세요.

## 상세 예제

호출 예시 같은 요청을 JavaScript와 Python으로 옮긴 예시입니다. 키는 환경변수 APICK_API_KEY 에서 읽습니다. JavaScript 예시 form-data 전체 예제 보기 Python 예시 form-data 전체 예제 보기
