Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
xlsx — CVE-2023-30533 및 CVE-2024-22363 수정 사항이 포함된 SheetJS xlsx 0.18.5 포크 | Kitploit
도구/GitHubGitHub/weareu/xlsx
General Purpose UtilitiesEncryption/Decryption ToolsData RecoveryUtilities & Frameworks
GitHubweareu/xlsx

xlsx

CVE-2023-30533 및 CVE-2024-22363 수정 사항이 포함된 SheetJS xlsx 0.18.5 포크

저장소 보기
6개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

SheetJS

SheetJS Community Edition은 거의 모든 복잡한 스프레드시트에서 유용한 데이터를 추출하고, 레거시 및 최신 소프트웨어 모두에서 작동하는 새 스프레드시트를 생성하기 위한 실전 검증된 오픈소스 솔루션을 제공합니다.

SheetJS Pro는 데이터 처리 그 이상의 솔루션을 제공합니다: 복잡한 템플릿을 쉽게 편집하고, 스타일링으로 내면의 피카소를 꺼내며, 이미지/그래프/피벗 테이블이 있는 사용자 지정 시트를 만들고, 수식 표현식을 평가하고 계산을 웹 앱으로 포팅하며, 일반적인 스프레드시트 작업을 자동화하는 등 훨씬 더 많은 기능을 제공합니다!

License Build Status Snyk Vulnerabilities npm Downloads Analytics

브라우저 테스트 및 지원 매트릭스

Build Status

지원되는 파일 형식

포맷 지원 circo 그래프

그래프 범례

목차

목차 표시를 위해 펼치기
  • 시작하기
    • 설치
    • 사용법
    • SheetJS의 철학
    • JS 생태계 데모
  • 데이터 획득 및 추출
    • 통합 문서 파싱
    • JSON 및 JS 데이터 처리
    • HTML 테이블 처리
  • 데이터 처리
    • 통합 문서 구조 수정
    • 셀 값 수정
    • 기타 워크시트 / 통합 문서 / 셀 속성 수정
  • 데이터 패키징 및 배포
    • 통합 문서 쓰기
    • 쓰기 예제
    • 스트리밍 쓰기
    • JSON 및 JS 데이터 생성
    • HTML 테이블 생성
    • 단일 워크시트 스냅샷 생성
  • 인터페이스
    • 파싱 함수
    • 쓰기 함수
    • 유틸리티
  • 공통 스프레드시트 형식
    • 일반 구조
    • 셀 객체
      • 데이터 유형
      • 날짜
    • 시트 객체
      • 워크시트 객체
      • 차트시트 객체
      • 매크로시트 객체
      • 대화상자시트 객체
    • 통합 문서 객체
      • 통합 문서 파일 속성
    • 통합 문서 수준 특성
      • 정의된 이름
      • 통합 문서 보기
      • 기타 통합 문서 속성
    • 문서 기능

시작하기

설치

독립형 브라우저 스크립트

완전한 브라우저 독립형 빌드는 dist/xlsx.full.min.js에 저장되며 script 태그를 사용하여 페이지에 직접 추가할 수 있습니다:```html

root@kitploit:~
<details>
  <summary><b>CDN 가용성</b> (클릭하여 표시)</summary>

|    CDN     | URL                                        |
|-----------:|:-------------------------------------------|
|    `unpkg` | <https://unpkg.com/xlsx/>                  |
| `jsDelivr` | <https://jsdelivr.com/package/npm/xlsx>    |
|    `CDNjs` | <https://cdnjs.com/libraries/xlsx>         |

예를 들어, `unpkg`는 최신 버전을 다음 URL에서 제공합니다:```html
<script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script>
브라우저 빌드 (클릭하여 표시)

완전한 단일 파일 버전은 dist/xlsx.full.min.js로 생성됩니다.

dist/xlsx.core.min.js는 코드페이지 라이브러리를 생략합니다(XLS 인코딩 미지원).

dist/xlsx.mini.min.js에서 더 슬림한 빌드가 생성됩니다. 전체 빌드와 비교하면:

  • 코드페이지 라이브러리 생략(XLS 인코딩 미지원)
  • XLSB / XLS / Lotus 1-2-3 / SpreadsheetML 2003 / Numbers 미지원
  • node 스트림 유틸리티 제거됨

bower 사용:```bash $ bower install js-xlsx

root@kitploit:~
**ECMAScript 모듈**

ECMAScript 모듈 빌드는 `xlsx.mjs`에 저장되며
`type=module`을 사용하는 `script` 태그로 페이지에 직접 추가할 수 있습니다:```html
<script type="module">
import { read, writeFileXLSX } from "./xlsx.mjs";

/* load the codepage support library for extended support with older formats  */
import { set_cptable } from "./xlsx.mjs";
import * as cptable from './dist/cpexcel.full.mjs';
set_cptable(cptable);
</script>

npm 패키지는 module 매개변수와 함께 모듈을 노출하며, Angular 및 기타 프로젝트에서 지원됩니다:```ts import { read, writeFileXLSX } from "xlsx";

/* load the codepage support library for extended support with older formats */ import { set_cptable } from "xlsx"; import * as cptable from 'xlsx/dist/cpexcel.full.mjs'; set_cptable(cptable);

root@kitploit:~
**Deno**

`xlsx.mjs`는 Deno에서 가져올 수 있습니다. `unpkg`에서 사용할 수 있습니다:```ts
// @deno-types="https://unpkg.com/xlsx/types/index.d.ts"
import * as XLSX from 'https://unpkg.com/xlsx/xlsx.mjs';

/* load the codepage support library for extended support with older formats  */
import * as cptable from 'https://unpkg.com/xlsx/dist/cpexcel.full.mjs';
XLSX.set_cptable(cptable);

NodeJS

npm으로:```bash $ npm install xlsx

root@kitploit:~
기본적으로, 모듈은 `require`를 지원합니다:```js
var XLSX = require("xlsx");

이 모듈은 import와 함께 사용할 수 있도록 xlsx.mjs도 제공합니다:```js import * as XLSX from 'xlsx/xlsx.mjs';

/* load 'fs' for readFile and writeFile support */ import * as fs from 'fs'; XLSX.set_fs(fs);

/* load 'stream' for stream support */ import { Readable } from 'stream'; XLSX.stream.set_readable(Readable);

/* load the codepage support library for extended support with older formats */ import * as cpexcel from 'xlsx/dist/cpexcel.full.mjs'; XLSX.set_cptable(cpexcel);

root@kitploit:~
**Photoshop 및 InDesign**

`dist/xlsx.extendscript.js`는 Photoshop 및 InDesign용 ExtendScript 빌드이며,
`npm` 패키지에 포함되어 있습니다.  `#include` 지시문으로
직접 참조할 수 있습니다:```extendscript
#include "xlsx.extendscript.js"
Internet Explorer 및 ECMAScript 3 호환성 (클릭하여 표시)

JavaScript 엔진과의 광범위한 호환성을 위해 라이브러리는 ECMAScript 3 언어 방언과 Array#forEach와 같은 일부 ES5 기능을 사용하여 작성되었습니다. 오래된 브라우저에서는 누락된 기능을 제공하는 shim이 필요합니다.

shim을 사용하려면 xlsx.js를 로드하는 script 태그 앞에 shim을 추가하십시오:```html

root@kitploit:~
이 스크립트는 Internet Explorer 6~9 버전에서 파일을 로드하고 저장하기 위한
`IE_LoadFile` 및 `IE_SaveFile`도 포함합니다.  `xlsx.extendscript.js` 스크립트는
Photoshop 및 기타 Adobe 제품에 적합한 형식으로 이 shim을 번들로 제공합니다.

</details>

### 사용법

스프레드시트와 데이터를 다루는 대부분의 시나리오는 5가지 부분으로 나눌 수 있습니다:

1) **데이터 획득**:  데이터는 어디에나 저장될 수 있습니다: 로컬 또는 원격 파일,
   데이터베이스, HTML TABLE, 또는 웹 브라우저에서 프로그래밍 방식으로 생성된 데이터까지 포함합니다.

2) **데이터 추출**:  스프레드시트 파일의 경우 원시 바이트를 파싱하여
   셀 데이터를 읽는 작업이 포함됩니다. 일반적인 JS 데이터의 경우 데이터를 재구성하는 작업이 포함됩니다.

3) **데이터 처리**:  요약 통계 생성부터 데이터 레코드 정리까지,
   이 단계가 문제의 핵심입니다.

4) **데이터 패키징**:  새 스프레드시트를 만들거나 `JSON.stringify`로 직렬화하거나
   XML을 작성하거나 UI 도구용으로 데이터를 단순히 평탄화하는 작업이 포함될 수 있습니다.

5) **데이터 배포**:  스프레드시트 파일은 서버에 업로드하거나 로컬에 저장할 수
   있습니다.  데이터는 HTML TABLE 또는 데이터 그리드 형태로 사용자에게 표시될 수 있습니다.

일반적인 문제로는 HTML 테이블에 저장된 데이터에서 유효한 스프레드시트
내보내기를 생성하는 것이 있습니다.  이 예제에서는 페이지의 HTML TABLE을 스크래핑하고,
보고서 날짜가 포함된 행을 맨 아래에 추가한 다음, 새 파일을 생성하여
로컬에 다운로드합니다. `XLSX.writeFile`은 데이터 패키징과 로컬 다운로드
시도를 처리합니다:```js
// Acquire Data (reference to the HTML table)
var table_elt = document.getElementById("my-table-id");

// Extract Data (create a workbook object from the table)
var workbook = XLSX.utils.table_to_book(table_elt);

// Process Data (add a new row)
var ws = workbook.Sheets["Sheet1"];
XLSX.utils.sheet_add_aoa(ws, [["Created "+new Date().toISOString()]], {origin:-1});

// Package and Release Data (`writeFile` tries to write and save an XLSB file)
XLSX.writeFile(workbook, "Report.xlsb");
도구 다운로드
  • 수식
  • 행 및 열 속성
  • 숫자 형식
  • 하이퍼링크
  • 셀 주석
  • 시트 표시 여부
  • VBA 및 매크로
  • 파싱 옵션
    • 입력 유형
    • 파일 유형 추측
  • 쓰기 옵션
    • 지원되는 출력 형식
    • 출력 유형
  • 유틸리티 함수
    • 배열의 배열 입력
    • 객체 배열 입력
    • HTML 테이블 입력
    • 수식 출력
    • 구분 기호로 분리된 출력
      • UTF-16 유니코드 텍스트
    • HTML 출력
    • JSON
  • 파일 형식
  • 테스트
    • Node
    • 브라우저
    • 테스트된 환경
    • 테스트 파일
  • 기여
    • OSX/Linux
    • Windows
    • 테스트
  • 라이선스
  • 참고 자료
  • 이 라이브러리는 스프레드시트 파일에서 유용한 데이터를 추출하는(read / readFile) 함수와 데이터에서 새 스프레드시트 파일을 생성하는(write / writeFile) 함수로 2단계와 4단계를 단순화하려고 합니다. table_to_book과 같은 추가 유틸리티 함수는 HTML 테이블과 같은 다른 일반적인 데이터 소스에서도 작동합니다.

    이 문서와 다양한 데모 프로젝트는 1단계와 5단계에 대한 여러 일반적인 시나리오와 접근 방식을 다룹니다.

    유틸리티 함수는 3단계를 돕습니다.

    "데이터 가져오기 및 추출"은 일반적인 데이터 가져오기 시나리오에 대한 솔루션을 설명합니다.

    "데이터 패키징 및 릴리스"는 일반적인 데이터 내보내기 시나리오에 대한 솔루션을 설명합니다.

    "데이터 처리"는 일반적인 통합 문서 처리 및 조작 시나리오에 대한 솔루션을 설명합니다.

    "유틸리티 함수"는 JSON 배열 및 기타 일반적인 JS 구조를 워크시트 객체로 변환하는 유틸리티 함수에 대해 자세히 설명합니다.

    SheetJS의 선

    데이터 처리는 어떤 워크플로우에도 맞아야 한다

    이 라이브러리는 별도의 수명 주기를 강요하지 않습니다. 어떤 프레임워크로 구축된 웹사이트와 앱에도 잘 맞습니다. 순수 JS 데이터 객체는 Web Workers 및 향후 API와 잘 어울립니다.

    JavaScript는 데이터 처리를 위한 강력한 언어입니다

    "Common Spreadsheet Format"은 통합 문서의 핵심 개념을 단순한 객체로 표현한 것입니다. 라이브러리의 다양한 함수는 이 객체로 작업하기 위한 저수준 도구를 제공합니다.

    친숙한 JS 처리를 위해, 워크시트의 일부를 배열의 배열(Array of Arrays)로/로부터 변환하는 유틸리티 함수가 있습니다. 다음 예제는 강력한 JS 배열 메서드와 네트워크 요청 라이브러리를 결합하여 데이터를 다운로드하고, 원하는 정보를 선택한 다음, 워크북 파일을 생성합니다:

    JSON 엔드포인트에서 데이터를 가져와 워크북 생성 (클릭하여 표시)

    목표는 미국 대통령 이름과 생일이 담긴 XLSB 워크북을 생성하는 것입니다.

    데이터 가져오기

    원본 데이터

    https://theunitedstates.io/congress-legislators/executive.json에는 원하는 데이터가 있습니다. 예를 들어, John Adams:```js { "id": { /* (data omitted) / }, "name": { "first": "John", // <-- first name "last": "Adams" // <-- last name }, "bio": { "birthday": "1735-10-19", // <-- birthday "gender": "M" }, "terms": [ { "type": "viceprez", / (other fields omitted) / }, { "type": "viceprez", / (other fields omitted) / }, { "type": "prez", / (other fields omitted) */ } // <-- look for "prez" ] }

    root@kitploit:~
    _Filtering for Presidents_
    
    데이터셋에는 대통령이었던 적이 없는 부통령 Aaron Burr가 포함되어 있습니다!
    
    `Array#filter`는 원하는 행만 포함된 새 배열을 생성합니다. 대통령은
    `type`이 `"prez"`로 설정된 임기를 최소 한 번 이상 수행했습니다. 특정 행에
    `"prez"` 임기가 하나 이상 있는지 확인하려면, `Array#some`이라는 또 다른 네이티브 JS 함수를 사용합니다.
    전체 필터는 다음과 같습니다:```js
    const prez = raw_data.filter(row => row.terms.some(term => term.type === "prez"));
    

    데이터 정렬하기

    이 예제에서 이름은 이름과 성을 결합한 값 (row.name.first + " " + row.name.last)이 되고 생일은 하위 필드인 row.bio.birthday입니다. Array#map을 사용하면 데이터셋을 한 번의 호출로 가공할 수 있습니다:```js const rows = prez.map(row => ({ name: row.name.first + " " + row.name.last, birthday: row.bio.birthday }));

    root@kitploit:~
    결과는 중첩이 없는 "단순한" 객체들의 배열입니다:```js
    [
      { name: "George Washington", birthday: "1732-02-22" },
      { name: "John Adams", birthday: "1735-10-19" },
      // ... one row per President
    ]
    

    데이터 추출

    정제된 데이터셋을 사용하면 XLSX.utils.json_to_sheet가 워크시트를 생성합니다:```js const worksheet = XLSX.utils.json_to_sheet(rows);

    root@kitploit:~
    `XLSX.utils.book_new`은 새 통합 문서를 만들고 `XLSX.utils.book_append_sheet`는 워크시트를 통합 문서에 추가합니다. 새 워크시트의 이름은 "Dates"가 됩니다:```js
    const workbook = XLSX.utils.book_new();
    XLSX.utils.book_append_sheet(workbook, worksheet, "Dates");
    

    데이터 처리

    헤더 수정

    기본적으로 json_to_sheet는 헤더 행이 있는 워크시트를 생성합니다. 이 경우, 헤더는 JS 객체 키에서 가져옵니다: "name" 및 "birthday".

    헤더는 A1 및 B1 셀에 있습니다. XLSX.utils.sheet_add_aoa는 A1 셀부터 시작하여 기존 워크시트에 텍스트 값을 쓸 수 있습니다:```js XLSX.utils.sheet_add_aoa(worksheet, [["Name", "Birthday"]], { origin: "A1" });

    root@kitploit:~
    _열 너비 수정_
    
    일부 이름은 기본 열 너비보다 깁니다.  열 너비는
    [`"!cols"` 워크시트 속성 설정](#row-and-column-properties)으로 지정합니다.
    
    다음 줄은 A 열의 너비를 약 10자로 설정합니다:```js
    worksheet["!cols"] = [ { wch: 10 } ]; // set column A width to 10 characters
    

    rows에 대한 Array#reduce 호출 한 번으로 최대 너비를 계산할 수 있습니다:```js const max_width = rows.reduce((w, r) => Math.max(w, r.name.length), 10); worksheet["!cols"] = [ { wch: max_width } ];

    root@kitploit:~
    참고: 시작 지점이 파일이나 HTML 테이블인 경우, `XLSX.utils.sheet_to_json`은 JS 객체 배열을 생성합니다.
    
    **패키지 및 릴리스 데이터**
    
    `XLSX.writeFile`은 스프레드시트 파일을 생성하고 시스템에 쓰기를 시도합니다.
    브라우저에서는 사용자에게 파일 다운로드를 요청하는 프롬프트를 표시하려고 합니다.  NodeJS에서는 로컬 디렉터리에 씁니다.```js
    XLSX.writeFile(workbook, "Presidents.xlsx");
    

    전체 예제```js // Uncomment the next line for use in NodeJS: // const XLSX = require("xlsx"), axios = require("axios");

    (async() => { /* fetch JSON data and parse */ const url = "https://theunitedstates.io/congress-legislators/executive.json"; const raw_data = (await axios(url, {responseType: "json"})).data;

    /* filter for the Presidents */ const prez = raw_data.filter(row => row.terms.some(term => term.type === "prez"));

    /* flatten objects */ const rows = prez.map(row => ({ name: row.name.first + " " + row.name.last, birthday: row.bio.birthday }));

    /* generate worksheet and workbook */ const worksheet = XLSX.utils.json_to_sheet(rows); const workbook = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(workbook, worksheet, "Dates");

    /* fix headers */ XLSX.utils.sheet_add_aoa(worksheet, [["Name", "Birthday"]], { origin: "A1" });

    /* calculate column width */ const max_width = rows.reduce((w, r) => Math.max(w, r.name.length), 10); worksheet["!cols"] = [ { wch: max_width } ];

    /* create an XLSX file and try to save to Presidents.xlsx */ XLSX.writeFile(workbook, "Presidents.xlsx"); })();

    root@kitploit:~
    웹 브라우저에서 사용하려면, 스니펫이 `snippet.js`에 저장되어 있다고 가정할 때, `axios` 및 `xlsx` 독립 실행형 빌드를 포함하려면 script 태그를 사용해야 합니다:```html
    <script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script src="snippet.js"></script>
    

    파일 형식은 구현 세부 사항입니다

    파서는 일반적인 스프레드시트 파일 형식을 폭넓게 다루어 "HTML로 저장된 XLS" 파일뿐만 아니라 실제 XLS 또는 XLSX 파일도 작동하도록 보장합니다.

    작성기는 데이터 생태계와의 광범위한 호환성을 위해 다양한 일반적인 출력 형식을 지원합니다.

    가능한 한 데이터 처리 코드는 관련된 특정 파일 형식에 대해 신경 쓸 필요가 없어야 합니다.

    JS 생태계 데모

    demos 디렉터리에는 다음을 위한 샘플 프로젝트가 포함되어 있습니다:

    프레임워크 및 API

    • angularjs
    • angular and ionic
    • knockout
    • meteor
    • react and react-native
    • vue 2.x and weex
    • XMLHttpRequest and fetch
    • nodejs server
    • databases and key/value stores
    • typed arrays and math

    번들러 및 도구

    • browserify
    • fusebox
    • parcel
    • requirejs
    • rollup
    • systemjs
    • typescript
    • webpack 2.x

    플랫폼 및 통합

    • deno
    • electron application
    • nw.js application
    • Chrome / Chromium extensions
    • Download a Google Sheet locally
    • Adobe ExtendScript
    • Headless Browsers
    • canvas-datagrid
    • x-spreadsheet
    • react-data-grid
    • vue3-table-light
    • Swift JSC and other engines
    • "serverless" functions
    • internet explorer

    다른 예제는 showcase에 포함되어 있습니다.

    https://sheetjs.com/demos/modify.html는 파일 읽기, 수정 및 쓰기의 완전한 예제를 보여줍니다.

    https://github.com/SheetJS/sheetjs/blob/HEAD/bin/xlsx.njs는 node 설치에 포함된 명령줄 도구로, 스프레드시트 파일을 읽고 내용을 다양한 형식으로 내보냅니다.

    데이터 획득 및 추출

    워크북 파싱

    API

    스프레드시트 바이트에서 데이터 추출```js var workbook = XLSX.read(data, opts);

    root@kitploit:~
    `read` 메서드는 JS 문자열,
    "binary string", NodeJS 버퍼 또는 형식화 배열(`Uint8Array` 또는 `ArrayBuffer`)에 저장된 스프레드시트 바이트에서 데이터를 추출할 수 있습니다.
    
    
    _로컬 파일에서 스프레드시트 바이트를 읽고 데이터를 추출_```js
    var workbook = XLSX.readFile(filename, opts);
    

    readFile 메서드는 제공된 경로의 스프레드시트 파일을 읽으려고 시도합니다. 브라우저는 일반적으로 이러한 방식으로 파일 읽기를 허용하지 않으며(보안 위험으로 간주됨), 이러한 방식으로 파일을 읽으려고 하면 오류가 발생합니다.

    두 번째 opts 인자는 선택 사항입니다. "파싱 옵션" 지원되는 속성과 동작을 다룹니다.

    예제

    다음은 몇 가지 일반적인 시나리오입니다(각 부제목을 클릭하면 코드를 볼 수 있습니다):

    NodeJS 서버의 로컬 파일 (클릭하여 표시)

    readFile은 내부적으로 fs.readFileSync를 사용합니다:```js var XLSX = require("xlsx");

    var workbook = XLSX.readFile("test.xlsx");

    root@kitploit:~
    Node ESM에서는 `readFile` 헬퍼가 활성화되지 않습니다. 대신 `fs.readFileSync`
    를 사용하여 파일 데이터를 `Buffer`로 읽은 후 `XLSX.read`와 함께 사용해야 합니다:```js
    import { readFileSync } from "fs";
    import { read } from "xlsx/xlsx.mjs";
    
    const buf = readFileSync("test.xlsx");
    /* buf is a Buffer */
    const workbook = read(buf);
    
    Deno 애플리케이션의 로컬 파일 (클릭하여 표시)

    readFile은 내부적으로 Deno.readFileSync를 사용합니다:```js // @deno-types="https://deno.land/x/sheetjs/types/index.d.ts" import * as XLSX from 'https://deno.land/x/sheetjs/xlsx.mjs'

    const workbook = XLSX.readFile("test.xlsx");

    root@kitploit:~
    파일을 읽는 애플리케이션은 `--allow-read` 플래그를 지정하여 호출해야 합니다.
    [`deno` 데모](https://github.com/weareu/xlsx/blob/HEAD/demos/deno/)에 더 많은 예제가 있습니다.
    
    </details>
    
    <details>
      <summary><b>웹 페이지에서 사용자가 제출한 파일("드래그 앤 드롭")</b> (클릭하여 표시)</summary>
    
    Chrome 76+를 대상으로 하는 최신 웹사이트의 경우 `File#arrayBuffer`가 권장됩니다:```js
    // XLSX is a global from the standalone script
    
    async function handleDropAsync(e) {
      e.stopPropagation(); e.preventDefault();
      const f = e.dataTransfer.files[0];
      /* f is a File */
      const data = await f.arrayBuffer();
      /* data is an ArrayBuffer */
      const workbook = XLSX.read(data);
    
      /* DO SOMETHING WITH workbook HERE */
    }
    drop_dom_element.addEventListener("drop", handleDropAsync, false);
    

    최대 호환성을 위해 FileReader API를 사용해야 합니다:```js function handleDrop(e) { e.stopPropagation(); e.preventDefault(); var f = e.dataTransfer.files[0]; /* f is a File / var reader = new FileReader(); reader.onload = function(e) { var data = e.target.result; / reader.readAsArrayBuffer(file) -> data will be an ArrayBuffer */ var workbook = XLSX.read(data);

    root@kitploit:~
    /* DO SOMETHING WITH workbook HERE */
    

    }; reader.readAsArrayBuffer(f); } drop_dom_element.addEventListener("drop", handleDrop, false);

    root@kitploit:~
    <https://oss.sheetjs.com/sheetjs/>는 FileReader 기법을 보여줍니다.
    
    </details>
    
    <details>
      <summary><b>HTML INPUT 요소가 포함된 사용자 제출 파일</b> (클릭하여 표시)</summary>
    
    `type="file"` 속성을 가진 HTML INPUT 요소로 시작합니다:```html
    <input type="file" id="input_dom_element">
    

    Chrome 76+을 대상으로 하는 최신 웹사이트의 경우 Blob#arrayBuffer를 권장합니다:```js // XLSX is a global from the standalone script

    async function handleFileAsync(e) { const file = e.target.files[0]; const data = await file.arrayBuffer(); /* data is an ArrayBuffer */ const workbook = XLSX.read(data);

    /* DO SOMETHING WITH workbook HERE */ } input_dom_element.addEventListener("change", handleFileAsync, false);

    root@kitploit:~
    더 광범위한 지원(IE10+ 포함)을 위해서는 `FileReader` 접근 방식이 권장됩니다:```js
    function handleFile(e) {
      var file = e.target.files[0];
      var reader = new FileReader();
      reader.onload = function(e) {
        var data = e.target.result;
        /* reader.readAsArrayBuffer(file) -> data will be an ArrayBuffer */
        var workbook = XLSX.read(e.target.result);
    
        /* DO SOMETHING WITH workbook HERE */
      };
      reader.readAsArrayBuffer(file);
    }
    input_dom_element.addEventListener("change", handleFile, false);
    

    oldie 데모는 IE 호환 폴백 시나리오를 보여줍니다.

    웹 브라우저에서 파일 가져오기("Ajax") (클릭하여 표시)

    Chrome 42+를 대상으로 하는 최신 웹사이트에서는 fetch가 권장됩니다:```js // XLSX is a global from the standalone script

    (async() => { const url = "http://oss.sheetjs.com/test_files/formula_stress_test.xlsx"; const data = await (await fetch(url)).arrayBuffer(); /* data is an ArrayBuffer */ const workbook = XLSX.read(data);

    /* DO SOMETHING WITH workbook HERE */ })();

    root@kitploit:~
    더 광범위한 지원을 위해 `XMLHttpRequest` 접근 방식을 권장합니다:```js
    var url = "http://oss.sheetjs.com/test_files/formula_stress_test.xlsx";
    
    /* set up async GET request */
    var req = new XMLHttpRequest();
    req.open("GET", url, true);
    req.responseType = "arraybuffer";
    
    req.onload = function(e) {
      var workbook = XLSX.read(req.response);
    
      /* DO SOMETHING WITH workbook HERE */
    };
    
    req.send();
    

    xhr 데모에는 더 자세한 논의와 추가 예제가 포함되어 있습니다.

    http://oss.sheetjs.com/sheetjs/ajax.html은(는) IE6+를 위한 폴백 접근 방식을 보여줍니다.

    PhotoShop 또는 InDesign 플러그인의 로컬 파일 (표시하려면 클릭)

    readFile는 Photoshop 및 기타 ExtendScript 대상에서 File 로직을 래핑합니다. 지정된 경로는 절대 경로여야 합니다.```js #include "xlsx.extendscript.js"

    /* Read test.xlsx from the Documents folder */ var workbook = XLSX.readFile(Folder.myDocuments + "/test.xlsx");

    root@kitploit:~
    The [`extendscript` demo](https://github.com/weareu/xlsx/blob/HEAD/demos/extendscript/) includes a more complex example.
    
    </details>
    
    <details>
      <summary><b>Electron 앱의 로컬 파일</b> (클릭하여 표시)</summary>
    
    `readFile`은(는) 렌더러 프로세스에서 사용할 수 있습니다:```js
    /* From the renderer process */
    var XLSX = require("xlsx");
    
    var workbook = XLSX.readFile(path);
    

    Electron API는 시간이 지남에 따라 변경되었습니다. electron 데모는 완전한 예제를 보여주며 필요한 버전별 설정을 자세히 설명합니다.

    React Native 모바일 앱의 로컬 파일 (클릭하여 표시)

    react 데모에는 샘플 React Native 앱이 포함되어 있습니다.

    React Native는 파일 시스템에서 파일을 읽는 방법을 제공하지 않으므로 타사 라이브러리를 사용해야 합니다. 다음 라이브러리들이 테스트되었습니다:

    • react-native-file-access

    base64 인코딩은 base64 타입과 호환되는 문자열을 반환합니다:```js import XLSX from "xlsx"; import { FileSystem } from "react-native-file-access";

    const b64 = await FileSystem.readFile(path, "base64"); /* b64 is a base64 string */ const workbook = XLSX.read(b64, {type: "base64"});

    root@kitploit:~
    - [`react-native-fs`](https://npm.im/react-native-fs)
    
    `ascii` 인코딩은 `binary` 타입과 호환되는 바이너리 문자열을 반환합니다.```js
    import XLSX from "xlsx";
    import { readFile } from "react-native-fs";
    
    const bstr = await readFile(path, "ascii");
    /* bstr is a binary string */
    const workbook = XLSX.read(bstr, {type: "binary"});
    
    NodeJS 서버 파일 업로드 (펼치려면 클릭)

    read는 NodeJS 버퍼를 허용할 수 있습니다. readFile은(는) formidable과 같은 HTTP POST 요청 본문 파서가 생성한 파일을 읽을 수 있습니다:```js const XLSX = require("xlsx"); const http = require("http"); const formidable = require("formidable");

    const server = http.createServer((req, res) => { const form = new formidable.IncomingForm(); form.parse(req, (err, fields, files) => { /* grab the first file */ const f = Object.entries(files)[0][1]; const path = f.filepath; const workbook = XLSX.readFile(path);

    root@kitploit:~
    /* DO SOMETHING WITH workbook HERE */
    

    }); }).listen(process.env.PORT || 7262);

    root@kitploit:~
    [`server` 데모](https://github.com/weareu/xlsx/blob/HEAD/demos/server)에는 더 고급 예제가 있습니다.
    
    </details>
    
    <details>
      <summary><b>NodeJS 프로세스에서 파일 다운로드</b> (클릭하여 표시)</summary>
    
    Node 17.5 및 18.0은 fetch를 기본 지원합니다:```js
    const XLSX = require("xlsx");
    
    const data = await (await fetch(url)).arrayBuffer();
    /* data is an ArrayBuffer */
    const workbook = XLSX.read(data);
    

    더 넓은 호환성을 위해 서드파티 모듈을 권장합니다.

    request는 Buffers를 생성하려면 null 인코딩이 필요합니다:```js var XLSX = require("xlsx"); var request = require("request");

    request({url: url, encoding: null}, function(err, resp, body) { var workbook = XLSX.read(body);

    /* DO SOMETHING WITH workbook HERE */ });

    root@kitploit:~
    [`axios`](https://npm.im/axios) 브라우저와 NodeJS에서 동일한 방식으로 작동합니다:```js
    const XLSX = require("xlsx");
    const axios = require("axios");
    
    (async() => {
      const res = await axios.get(url, {responseType: "arraybuffer"});
      /* res.data is a Buffer */
      const workbook = XLSX.read(res.data);
    
      /* DO SOMETHING WITH workbook HERE */
    })();
    
    Electron 앱에서 파일 다운로드 (표시하려면 클릭)

    메인 프로세스의 net 모듈은 외부 리소스에 HTTP/HTTPS 요청을 보낼 수 있습니다. 응답은 Buffer.concat을 사용하여 수동으로 연결해야 합니다:```js const XLSX = require("xlsx"); const { net } = require("electron");

    const req = net.request(url); req.on("response", (res) => { const bufs = []; // this array will collect all of the buffers res.on("data", (chunk) => { bufs.push(chunk); }); res.on("end", () => { const workbook = XLSX.read(Buffer.concat(bufs));

    root@kitploit:~
    /* DO SOMETHING WITH workbook HERE */
    

    }); }); req.end();

    root@kitploit:~
    </details>
    
    <details>
      <summary><b>NodeJS의 Readable Streams</b> (클릭하여 표시)</summary>
    
    Readable Streams를 다룰 때 가장 쉬운 방법은 스트림을 버퍼링하고
    마지막에 전체를 처리하는 것입니다:```js
    var fs = require("fs");
    var XLSX = require("xlsx");
    
    function process_RS(stream, cb) {
      var buffers = [];
      stream.on("data", function(data) { buffers.push(data); });
      stream.on("end", function() {
        var buffer = Buffer.concat(buffers);
        var workbook = XLSX.read(buffer, {type:"buffer"});
    
        /* DO SOMETHING WITH workbook IN THE CALLBACK */
        cb(workbook);
      });
    }
    
    브라우저의 ReadableStream (클릭하여 표시)

    ReadableStream을 다룰 때 가장 쉬운 방법은 스트림을 버퍼링한 다음 마지막에 전체를 처리하는 것입니다:```js // XLSX is a global from the standalone script

    async function process_RS(stream) { /* collect data */ const buffers = []; const reader = stream.getReader(); for(;;) { const res = await reader.read(); if(res.value) buffers.push(res.value); if(res.done) break; }

    /* concat */ const out = new Uint8Array(buffers.reduce((acc, v) => acc + v.length, 0));

    let off = 0; for(const u8 of arr) { out.set(u8, off); off += u8.length; }

    return out; }

    const data = await process_RS(stream); /* data is Uint8Array */ const workbook = XLSX.read(data);

    root@kitploit:~
    </details>
    
    더 자세한 예제는 [포함된 데모](https://github.com/weareu/xlsx/blob/HEAD/demos/)에서 다룹니다.
    
    ### JSON 및 JS 데이터 처리
    
    JSON 및 JS 데이터는 일반적으로 단일 워크시트를 나타냅니다.  이 섹션에서는
    워크북을 생성하기 위한 몇 가지 유틸리티 함수를 사용합니다.
    
    _새 Workbook 만들기_```js
    var workbook = XLSX.utils.book_new();
    

    book_new 유틸리티 함수는 워크시트가 없는 빈 통합 문서를 만듭니다.

    스프레드시트 소프트웨어는 일반적으로 워크시트를 하나 이상 요구하며 사용자 인터페이스에서 이 요구 사항을 적용합니다. 이 라이브러리는 쓰기 시점에 이 요구 사항을 적용하여 빈 통합 문서가 쓰기 함수에 전달되면 오류를 발생시킵니다.

    API

    JS 값 배열들의 배열로 워크시트 만들기```js var worksheet = XLSX.utils.aoa_to_sheet(aoa, opts);

    root@kitploit:~
    `aoa_to_sheet` 유틸리티 함수는 "배열의 배열"을 행 우선 순서로 탐색하여 워크시트 객체를 생성합니다. 다음 스니펫은 셀 `A1`이 문자열 `A1`로 설정되고, 셀 `B1`이 `B1`로 설정되는 식으로 시트를 생성합니다:```js
    var worksheet = XLSX.utils.aoa_to_sheet([
      ["A1", "B1", "C1"],
      ["A2", "B2", "C2"],
      ["A3", "B3", "C3"]
    ]);
    

    "Array of Arrays 입력"은 함수와 선택적 opts 인수에 대해 더 자세히 설명합니다.

    JS 객체 배열에서 워크시트 만들기```js var worksheet = XLSX.utils.json_to_sheet(jsa, opts);

    root@kitploit:~
    `json_to_sheet` 유틸리티 함수는 JS 객체 배열을 순서대로 순회하며 워크시트 객체를 생성합니다. 기본적으로 헤더 행과 배열의 객체마다 한 행씩 생성합니다. 선택적 `opts` 인수에는 열 순서와 헤더 출력을 제어하는 설정이 있습니다.
    
    ["객체 배열 입력"](#array-of-arrays-input)은 이 함수와 선택적 `opts` 인수에 대해 자세히 설명합니다.
    
    **예제**
    
    ["SheetJS의 정수"](#the-zen-of-sheetjs)에는 "JSON 엔드포인트에서 데이터를 가져와 워크북 생성"에 대한 자세한 예제가 포함되어 있습니다.
    
    [`x-spreadsheet`](https://github.com/myliang/x-spreadsheet)는 웹 브라우저에서 구조화된 데이터를 미리 보고 수정할 수 있는 대화형 데이터 그리드입니다. [`xspreadsheet` 데모](https://github.com/weareu/xlsx/blob/HEAD/demos/xspreadsheet)에는 x-spreadsheet 데이터 객체를 워크북으로 변환하는 `xtos` 함수가 포함된 샘플 스크립트가 있습니다. <https://oss.sheetjs.com/sheetjs/x-spreadsheet>는 라이브 데모입니다.
    
    <details>
      <summary><b>데이터베이스 쿼리(SQL 또는 no-SQL)의 레코드</b> (클릭하여 표시)</summary>
    
    [`database` 데모](https://github.com/weareu/xlsx/blob/HEAD/demos/database/)에는 데이터베이스 및 쿼리 결과 작업 예제가 포함되어 있습니다.
    
    </details>
    
    
    <details>
      <summary><b>TensorFlow.js를 사용한 수치 계산</b> (클릭하여 표시)</summary>
    
    [`@tensorflow/tfjs`](https://github.com/weareu/xlsx/blob/HEAD/@tensorflow/tfjs) 및 기타 라이브러리는 데이터가 단순 배열 형태로 제공되기를 기대하며, 이는 각 열이 데이터 벡터인 워크시트에 적합합니다. 이는 대부분의 사람들이 각 행을 벡터로 사용하는 스프레드시트 사용 방식의 전치입니다.
    
    `tfjs`에서 데이터를 가져올 때 반환된 데이터 포인트는 형식화 배열에 저장됩니다. 배열의 배열은 루프로 구성할 수 있습니다. `Array#unshift`는 변환 전에 제목 행을 앞에 추가할 수 있습니다:```js
    const XLSX = require("xlsx");
    const tf = require('@tensorflow/tfjs');
    
    /* suppose xs and ys are vectors (1D tensors) -> tfarr will be a typed array */
    const tfdata = tf.stack([xs, ys]).transpose();
    const shape = tfdata.shape;
    const tfarr = tfdata.dataSync();
    
    /* construct the array of arrays */
    const aoa = [];
    for(let j = 0; j < shape[0]; ++j) {
      aoa[j] = [];
      for(let i = 0; i < shape[1]; ++i) aoa[j][i] = tfarr[j * shape[1] + i];
    }
    /* add headers to the top */
    aoa.unshift(["x", "y"]);
    
    /* generate worksheet */
    const worksheet = XLSX.utils.aoa_to_sheet(aoa);
    

    array 데모는 완전한 예제를 보여줍니다.

    HTML 테이블 처리

    API

    페이지에서 HTML TABLE을 스크래핑하여 워크시트 생성```js var worksheet = XLSX.utils.table_to_sheet(dom_element, opts);

    root@kitploit:~
    `table_to_sheet` 유틸리티 함수는 DOM TABLE 요소를 받아 행을 반복하여 워크시트를 생성합니다.  `opts` 인자는 선택 사항입니다.
    ["HTML 테이블 입력"](#html-table-input)에서 함수에 대해 더 자세히 설명합니다.
    
    
    
    _페이지에서 HTML TABLE을 스크래핑하여 워크북 생성_```js
    var workbook = XLSX.utils.table_to_book(dom_element, opts);
    

    table_to_book 유틸리티 함수는 table_to_sheet와 동일한 로직을 따릅니다. 워크시트를 생성한 후, 빈 워크북을 만들어 스프레드시트를 추가합니다.

    options 인자는 table_to_sheet와 동일한 옵션을 지원하며, 워크시트 이름을 제어하는 sheet 속성이 추가됩니다. 속성이 없거나 옵션이 지정되지 않으면 기본 이름 Sheet1이 사용됩니다.

    예제

    몇 가지 일반적인 시나리오는 다음과 같습니다 (각 하위 제목을 클릭하면 코드를 볼 수 있습니다):

    웹페이지의 HTML TABLE 요소 (클릭하여 표시)```html
    SheetJS
    1234567
    root@kitploit:~
    웹 페이지의 여러 테이블은 각각 개별 워크시트로 변환할 수 있습니다:```js
    /* create new workbook */
    var workbook = XLSX.utils.book_new();
    
    /* convert table "table1" to worksheet named "Sheet1" */
    var sheet1 = XLSX.utils.table_to_sheet(document.getElementById("table1"));
    XLSX.utils.book_append_sheet(workbook, sheet1, "Sheet1");
    
    /* convert table "table2" to worksheet named "Sheet2" */
    var sheet2 = XLSX.utils.table_to_sheet(document.getElementById("table2"));
    XLSX.utils.book_append_sheet(workbook, sheet2, "Sheet2");
    
    /* workbook now has 2 worksheets */
    

    또는, HTML 코드를 추출하고 파싱할 수 있습니다:```js var htmlstr = document.getElementById("tableau").outerHTML; var workbook = XLSX.read(htmlstr, {type:"string"});

    root@kitploit:~
    </details>
    
    <details>
      <summary><b>Chrome/Chromium 확장 프로그램</b> (표시하려면 클릭)</summary>
    
    [`chrome` 데모](https://github.com/weareu/xlsx/blob/HEAD/demos/chrome/)는 완전한 예제를 보여주며 필요한 권한과
    기타 설정을 자세히 설명합니다.
    
    확장 프로그램에서는 콘텐츠 스크립트에서 워크북을 생성한 후
    그 객체를 확장 프로그램으로 다시 전달하는 것이 권장됩니다:```js
    /* in the worker script */
    chrome.runtime.onMessage.addListener(function(msg, sender, cb) {
      /* pass a message like { sheetjs: true } from the extension to scrape */
      if(!msg || !msg.sheetjs) return;
      /* create a new workbook */
      var workbook = XLSX.utils.book_new();
      /* loop through each table element */
      var tables = document.getElementsByTagName("table")
      for(var i = 0; i < tables.length; ++i) {
        var worksheet = XLSX.utils.table_to_sheet(tables[i]);
        XLSX.utils.book_append_sheet(workbook, worksheet, "Table" + i);
      }
      /* pass back to the extension */
      return cb(workbook);
    });
    
    Headless Chrome을 사용한 서버 측 HTML 테이블 (클릭하여 표시)

    headless 데모에는 HTML 파일을 XLSB 워크북으로 변환하는 완전한 데모가 포함되어 있습니다. 핵심 아이디어는 페이지에 스크립트를 추가하고, 페이지 컨텍스트에서 테이블을 파싱하고, base64 워크북을 생성한 후 추가 처리를 위해 다시 보내는 것입니다:```js const XLSX = require("xlsx"); const { readFileSync } = require("fs"), puppeteer = require("puppeteer");

    const url = https://sheetjs.com/demos/table;

    /* get the standalone build source (node_modules/xlsx/dist/xlsx.full.min.js) */ const lib = readFileSync(require.resolve("xlsx/dist/xlsx.full.min.js"), "utf8");

    (async() => { /* start browser and go to web page */ const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto(url, {waitUntil: "networkidle2"});

    /* inject library */ await page.addScriptTag({content: lib});

    /* this function s5s will be called by the script below, receiving the Base64-encoded file */ await page.exposeFunction("s5s", async(b64) => { const workbook = XLSX.read(b64, {type: "base64" });

    root@kitploit:~
    /* DO SOMETHING WITH workbook HERE */
    

    });

    /* generate XLSB file in webpage context and send back result / await page.addScriptTag({content: ` / call table_to_book on first table */ var workbook = XLSX.utils.table_to_book(document.querySelector("TABLE"));

    root@kitploit:~
    /* generate XLSX file */
    var b64 = XLSX.write(workbook, {type: "base64", bookType: "xlsb"});
    
    /* call "s5s" hook exposed from the node process */
    window.s5s(b64);
    

    `});

    /* cleanup */ await browser.close(); })();

    root@kitploit:~
    </details>
    
    <details>
      <summary><b>Headless WebKit을 사용한 서버 측 HTML 테이블</b> (클릭하여 표시)</summary>
    
    [`headless` 데모](https://github.com/weareu/xlsx/blob/HEAD/demos/headless/)는 HTML 파일을 XLSB 통합 문서로 변환하는 완전한
    데모를 포함하며, [PhantomJS](https://phantomjs.org/)를 사용합니다. 핵심 아이디어는
    페이지에 스크립트를 추가하고, 페이지 컨텍스트에서 테이블을 파싱하고, `binary`
    통합 문서를 생성한 다음 추가 처리를 위해 다시 보내는 것입니다:```js
    var XLSX = require('xlsx');
    var page = require('webpage').create();
    
    /* this code will be run in the page */
    var code = [ "function(){",
      /* call table_to_book on first table */
      "var wb = XLSX.utils.table_to_book(document.body.getElementsByTagName('table')[0]);",
    
      /* generate XLSB file and return binary string */
      "return XLSX.write(wb, {type: 'binary', bookType: 'xlsb'});",
    "}" ].join("");
    
    page.open('https://sheetjs.com/demos/table', function() {
      /* Load the browser script from the UNPKG CDN */
      page.includeJs("https://unpkg.com/xlsx/dist/xlsx.full.min.js", function() {
        /* The code will return an XLSB file encoded as binary string */
        var bin = page.evaluateJavaScript(code);
    
        var workbook = XLSX.read(bin, {type: "binary"});
        /* DO SOMETHING WITH workbook HERE */
    
        phantom.exit();
      });
    });
    
    브라우저 없이 NodeJS HTML 테이블 (클릭하여 표시)

    NodeJS에는 DOM 구현이 포함되어 있지 않으며 Puppeteer는 무거운 Chromium 빌드를 필요로 합니다. jsdom은 가벼운 대안입니다:```js const XLSX = require("xlsx"); const { readFileSync } = require("fs"); const { JSDOM } = require("jsdom");

    /* obtain HTML string. This example reads from test.html / const html_str = fs.readFileSync("test.html", "utf8"); / get first TABLE element / const doc = new JSDOM(html_str).window.document.querySelector("table"); / generate workbook */ const workbook = XLSX.utils.table_to_book(doc);

    root@kitploit:~
    </details>
    
    ## 데이터 처리
    
    ["공통 스프레드시트 형식"](#common-spreadsheet-format)은 워크북의 핵심 개념을 단순한 객체로
    표현한 것입니다.  유틸리티 함수는 객체 표현과 함께 작동하며
    일반적인 사용 사례를 처리하기 위한 것입니다.
    
    ### 워크북 구조 수정
    
    **API**
    
    _워크북에 워크시트 추가_```js
    XLSX.utils.book_append_sheet(workbook, worksheet, sheet_name);
    

    book_append_sheet 유틸리티 함수는 워크시트를 통합 문서에 추가합니다. 세 번째 인수는 원하는 워크시트 이름을 지정합니다. 여러 워크시트는 함수를 여러 번 호출하여 통합 문서에 추가할 수 있습니다. 워크시트 이름이 통합 문서에서 이미 사용 중인 경우 오류가 발생합니다.

    워크시트를 통합 문서에 추가하고 고유한 이름 찾기```js var new_name = XLSX.utils.book_append_sheet(workbook, worksheet, name, true);

    root@kitploit:~
    네 번째 인수가 `true`이면 함수는 지정된
    워크시트 이름으로 시작합니다.  워크북에 해당 시트 이름이 이미 있으면 새 워크시트 이름은
    이름의 어간을 찾아 카운터를 증가시켜 선택합니다:```js
    XLSX.utils.book_append_sheet(workbook, sheetA, "Sheet2", true); // Sheet2
    XLSX.utils.book_append_sheet(workbook, sheetB, "Sheet2", true); // Sheet3
    XLSX.utils.book_append_sheet(workbook, sheetC, "Sheet2", true); // Sheet4
    XLSX.utils.book_append_sheet(workbook, sheetD, "Sheet2", true); // Sheet5
    

    탭 순서대로 워크시트 이름을 나열합니다```js var wsnames = workbook.SheetNames;

    root@kitploit:~
    The `SheetNames` 속성은 workbook 객체의 워크시트 이름을 "탭 순서"대로 나열한 목록입니다. API 함수는 이 배열을 참조합니다.
    
    _워크시트를 제자리에서 교체하기_```js
    workbook.Sheets[sheet_name] = new_worksheet;
    

    워크북 객체의 Sheets 속성은 키가 이름이고 값이 워크시트 객체인 객체입니다. Sheets 객체의 속성에 다시 할당하면 나머지 워크시트 구조를 방해하지 않고 워크시트 객체를 변경할 수 있습니다.

    예제

    워크북에 새 워크시트 추가 (클릭하여 표시)

    이 예제는 XLSX.utils.aoa_to_sheet를 사용합니다.```js var ws_name = "SheetJS";

    /* Create worksheet */ var ws_data = [ [ "S", "h", "e", "e", "t", "J", "S" ], [ 1 , 2 , 3 , 4 , 5 ] ]; var ws = XLSX.utils.aoa_to_sheet(ws_data);

    /* Add the worksheet to the workbook */ XLSX.utils.book_append_sheet(wb, ws, ws_name);

    root@kitploit:~
    </details>
    
    ### 셀 값 수정
    
    **API**
    
    _워크시트에서 단일 셀 값을 수정합니다_```js
    XLSX.utils.sheet_add_aoa(worksheet, [[new_value]], { origin: address });
    

    워크시트에서 여러 셀 값 수정하기```js XLSX.utils.sheet_add_aoa(worksheet, aoa, opts);

    root@kitploit:~
    The `sheet_add_aoa` 유틸리티 함수는 워크시트의 셀 값을 수정합니다. 첫 번째 인자는 워크시트 객체입니다. 두 번째 인자는 값들의 배열의 배열입니다. 세 번째 인자의 `origin` 키는 셀이 기록될 위치를 제어합니다. 다음 스니펫은 `B3=1` 및 `E5="abc"`를 설정합니다:```js
    XLSX.utils.sheet_add_aoa(worksheet, [
      [1],                             // <-- Write 1 to cell B3
      ,                                // <-- Do nothing in row 4
      [/*B5*/, /*C5*/, /*D5*/, "abc"]  // <-- Write "abc" to cell E5
    ], { origin: "B3" });
    

    "Array of Arrays 입력"은 함수와 선택적 opts 인수에 대해 더 자세히 설명합니다.

    예제

    워크시트에 행 추가 (클릭하여 표시)

    특수 origin 값 -1은 sheet_add_aoa가 범위의 마지막 행 다음 행의 A열에서 시작하여 데이터를 추가하도록 지시합니다:```js XLSX.utils.sheet_add_aoa(worksheet, [ ["first row after data", 1], ["second row after data", 2] ], { origin: -1 });

    구문 분석 옵션

    내보내진 read 및 readFile 함수는 옵션 인수를 받습니다:

    • cellNF가 false이더라도 형식화된 텍스트가 생성되어 .w에 저장됩니다.
    • 경우에 따라 bookSheets가 false여도 시트가 구문 분석될 수 있습니다.
    • Excel은 CSV 및 기타 일반 텍스트의 값을 적극적으로 해석하려고 합니다. 이로 인해 놀라운 동작이 발생할 수 있습니다! raw 옵션은 값 구문 분석을 억제합니다.
    • bookSheets와 bookProps를 결합하면 두 정보 세트를 모두 얻을 수 있습니다.
    • bookDeps가 false이면 Deps는 빈 객체가 됩니다.
    • bookFiles 동작은 파일 유형에 따라 다릅니다:
      • ZIP 기반 형식의 경우 keys 배열 (ZIP 내 경로)
      • ZIP의 경우 files 해시 (경로를 파일을 나타내는 객체에 매핑)
      • CFB 컨테이너를 사용하는 형식의 경우 cfb 객체
    • JSON 객체 출력을 볼 때 sheetRows-1 행이 생성됩니다 (데이터를 구문 분석할 때 헤더 행이 하나의 행으로 계산되기 때문입니다)

    입력 유형

    문자열은 여러 방식으로 해석될 수 있습니다. read의 type 매개변수는 라이브러리에 데이터 인수를 어떻게 구문 분석할지 알려줍니다:

    파일 유형 추측

    구현 세부 사항 (클릭하여 표시)

    Excel 및 기타 스프레드시트 도구는 처음 몇 바이트를 읽고 다른 휴리스틱을 적용하여 파일 유형을 결정합니다. 이를 통해 파일 유형 punning이 가능합니다: .xls 확장자로 파일 이름을 바꾸면 컴퓨터가 Excel을 사용하여 파일을 열도록 지시하지만 Excel은 이를 처리하는 방법을 알고 있습니다. 이 라이브러리는 유사한 논리를 적용합니다:

    왜 임의의 텍스트 파일이 유효한가? (클릭하여 표시)

    Excel은 파일을 읽는 데 매우 공격적입니다. 표시 텍스트 파일 (문자가 ANSI 표시 문자뿐인 파일)에 XLS 확장자를 추가하면 Excel이 해당 파일을 잠재적인 CSV 또는 TSV 파일로 착각하게 만듭니다. 단 한 열뿐이더라도 말이죠! 이 라이브러리는 해당 동작을 재현하려고 합니다.

    가장 좋은 방법은 원하는 워크시트를 검증하여 예상된 행 또는 열 수를 갖추고 있는지 확인하는 것입니다. 범위를 추출하는 것은 매우 간단합니다:```js var range = XLSX.utils.decode_range(worksheet['!ref']); var ncols = range.e.c - range.s.c + 1, nrows = range.e.r - range.s.r + 1;

    root@kitploit:~
    </details>
    
    ## 쓰기 옵션
    
    내보내진 `write` 및 `writeFile` 함수는 옵션 인수를 받습니다:
    
    | 옵션 이름 |  기본값 | 설명                                         |
    | :---------- | -------: | :-------------------------------------------------- |
    |`type`       |          | 출력 데이터 인코딩 (아래 Output Type 참조)        |
    |`cellDates`  |  `false` | 날짜를 유형 `d`로 저장합니다 (기본은 `n`)            |
    |`bookSST`    |  `false` | 공유 문자열 테이블 생성 **                     |
    |`bookType`   | `"xlsx"` | 통합 문서 유형 (지원 형식은 아래 참조)  |
    |`sheet`      |     `""` | 단일 시트 형식에 대한 워크시트 이름 **       |
    |`compression`|  `false` | ZIP 기반 형식에 ZIP 압축 사용 **        |
    |`Props`      |          | 쓰기 시 통합 문서 속성 재정의 **        |
    |`themeXLSX`  |          | XLSX/XLSB/XLSM 작성 시 테마 XML 재정의 **   |
    |`ignoreEC`   |   `true` | "숫자를 텍스트로 처리" 오류 억제 **                 |
    |`numbers`    |          | NUMBERS 내보내기용 페이로드 **                 |
    
    - `bookSST`는 더 느리고 메모리를 더 많이 사용하지만 이전 버전의 iOS Numbers와
      더 나은 호환성을 가집니다.
    - 저장이 보장되는 것은 원시 데이터뿐입니다. 이 README에 설명되지 않은
      기능은 직렬화되지 않을 수 있습니다.
    - `cellDates`는 XLSX 출력에만 적용되며 타사 읽기 도구와 호환된다는 보장이 없습니다.
      Excel 자체는 일반적으로 유형 `d`인 셀을 쓰지 않으므로 Excel이 아닌 도구는
      날짜가 있는 데이터를 무시하거나 오류를 낼 수 있습니다.
    - `Props`는 통합 문서의 `Props` 필드를 반영하는 객체입니다.
      [Workbook File Properties](#workbook-file-properties) 섹션의 표를 참조하십시오.
    - 지정된 경우 `themeXLSX`의 문자열은 XLSX/XLSB/XLSM 파일의 기본 테마로 저장됩니다
      (ZIP의 `xl/theme/theme1.xml`에 저장).
    - 프로그램의 버그로 인해 "텍스트를 열로"와 같은 일부 기능은 오류 조건이 무시되는
      워크시트에서 Excel을 중단시킬 수 있습니다. 작성자는 기본적으로 오류를
      무시하도록 파일을 표시합니다. 이를 억제하려면 `ignoreEC`를 `false`로 설정하십시오.
    - 데이터 크기로 인해 NUMBERS 데이터는 기본적으로 포함되지 않습니다.
      포함된 `xlsx.zahl.js` 및 `xlsx.zahl.mjs` 스크립트에 데이터가 포함되어 있습니다.
    
    ### 지원되는 출력 형식
    
    타사 도구와의 광범위한 호환성을 위해 이 라이브러리는 많은 출력 형식을 지원합니다.
    특정 파일 형식은 `bookType` 옵션으로 제어됩니다:
    
    | `bookType` | 파일 확장자 | 컨테이너 | 시트 | 설명                     |
    | :--------- | -------: | :-------: | :----- |:------------------------------- |
    | `xlsx`     | `.xlsx`  |    ZIP    | multi  | Excel 2007+ XML 형식          |
    | `xlsm`     | `.xlsm`  |    ZIP    | multi  | Excel 2007+ 매크로 XML 형식    |
    | `xlsb`     | `.xlsb`  |    ZIP    | multi  | Excel 2007+ 이진 형식       |
    | `biff8`    | `.xls`   |    CFB    | multi  | Excel 97-2004 통합 문서 형식   |
    | `biff5`    | `.xls`   |    CFB    | multi  | Excel 5.0/95 통합 문서 형식    |
    | `biff4`    | `.xls`   |   none    | single | Excel 4.0 워크시트 형식      |
    | `biff3`    | `.xls`   |   none    | single | Excel 3.0 워크시트 형식      |
    | `biff2`    | `.xls`   |   none    | single | Excel 2.0 워크시트 형식      |
    | `xlml`     | `.xls`   |   none    | multi  | Excel 2003-2004 (SpreadsheetML) |
    | `numbers`  |`.numbers`|    ZIP    | single | Numbers 3.0+ 스프레드시트        |
    | `ods`      | `.ods`   |    ZIP    | multi  | OpenDocument 스프레드시트        |
    | `fods`     | `.fods`  |   none    | multi  | 플랫 OpenDocument 스프레드시트   |
    | `wk3`      | `.wk3`   |   none    | multi  | Lotus 통합 문서 (WK3)            |
    | `csv`      | `.csv`   |   none    | single | 쉼표로 구분된 값          |
    | `txt`      | `.txt`   |   none    | single | UTF-16 유니코드 텍스트 (TXT)       |
    | `sylk`     | `.sylk`  |   none    | single | 기호 링크 (SYLK)            |
    | `html`     | `.html`  |   none    | single | HTML 문서                   |
    | `dif`      | `.dif`   |   none    | single | 데이터 교환 형식 (DIF)   |
    | `dbf`      | `.dbf`   |   none    | single | dBASE II + VFP 확장 (DBF) |
    | `wk1`      | `.wk1`   |   none    | single | Lotus 워크시트 (WK1)           |
    | `rtf`      | `.rtf`   |   none    | single | 리치 텍스트 형식 (RTF)          |
    | `prn`      | `.prn`   |   none    | single | Lotus 형식 텍스트            |
    
    ---
    
    [Read more](https://github.com/weareu/xlsx)
    
    root@kitploit:~
    </details>
    
    
    ### 다른 워크시트 / 통합 문서 / 셀 속성 수정
    
    ["공통 스프레드시트 형식"](#common-spreadsheet-format) 섹션에서 객체 구조에 대해
    자세히 설명합니다.
    
    ## 데이터 패키징 및 릴리스
    
    ### 통합 문서 쓰기
    
    **API**
    
    _데이터에서 스프레드시트 바이트(파일) 생성_```js
    var data = XLSX.write(workbook, opts);
    

    write 메서드는 워크북의 데이터를 메모리 내의 파일로 패키징하려고 시도합니다. 기본적으로 XLSX 파일이 생성되지만, opts 인수의 bookType 속성으로 제어할 수 있습니다. type 옵션에 따라 데이터는 "binary string", JS string, Uint8Array 또는 Buffer로 저장될 수 있습니다.

    두 번째 opts 인수는 필수입니다. "쓰기 옵션"에서 지원되는 속성과 동작을 다룹니다.

    파일을 생성하고 저장을 시도합니다```js XLSX.writeFile(workbook, filename, opts);

    root@kitploit:~
    `writeFile` 메서드는 데이터를 패키징하고 새 파일 저장을 시도합니다. 내보내기 파일 형식은 `filename`의 확장자에 따라 결정됩니다(`SheetJS.xlsx`는 XLSX 내보내기를, `SheetJS.xlsb`는 XLSB 내보내기를 나타내는 식입니다).
    
    `writeFile` 메서드는 파일 저장을 시작하기 위해 플랫폼별 API를 사용합니다. NodeJS에서는 `fs.readFileSync`가 파일을 생성할 수 있습니다. 웹 브라우저에서는 HTML5 `download` 속성을 사용하여 다운로드를 시도하며, IE를 위한 폴백이 있습니다.
    
    _XLSX 파일 생성 및 저장 시도_```js
    XLSX.writeFileXLSX(workbook, filename, opts);
    

    The writeFile 메서드는 다양한 내보내기 함수를 포함합니다. 이는 개발자 경험에는 좋지만 현재 개발 도구를 사용한 트리 셰이킹에는 적합하지 않습니다. XLSX 내보내기만 필요한 경우 이 메서드는 다른 내보내기 함수를 참조하지 않습니다.

    두 번째 opts 인자는 선택 사항입니다. "작성 옵션"은 지원되는 속성과 동작을 설명합니다.

    예제

    NodeJS 서버의 로컬 파일 (클릭하여 표시)

    writeFile은 서버 환경에서 fs.writeFileSync를 사용합니다:```js var XLSX = require("xlsx");

    /* output format determined by filename */ XLSX.writeFile(workbook, "out.xlsb");

    root@kitploit:~
    Node ESM의 경우 `writeFile` 헬퍼는 활성화되어 있지 않습니다. 대신 `fs.writeFileSync`를
    사용하여 파일 데이터를 `Buffer`에 기록한 후 `XLSX.write`와 함께 사용해야 합니다:```js
    import { writeFileSync } from "fs";
    import { write } from "xlsx/xlsx.mjs";
    
    const buf = write(workbook, {type: "buffer", bookType: "xlsb"});
    /* buf is a Buffer */
    const workbook = writeFileSync("out.xlsb", buf);
    
    Deno 애플리케이션의 로컬 파일 (클릭하여 표시)

    writeFile는 내부적으로 Deno.writeFileSync를 사용합니다:```js // @deno-types="https://deno.land/x/sheetjs/types/index.d.ts" import * as XLSX from 'https://deno.land/x/sheetjs/xlsx.mjs'

    XLSX.writeFile(workbook, "test.xlsx");

    root@kitploit:~
    파일을 작성하는 애플리케이션은 `--allow-write` 플래그와 함께 호출되어야 합니다.  해당
    [`deno` 데모](https://github.com/weareu/xlsx/blob/HEAD/demos/deno/)에 더 많은 예제가 있습니다
    
    </details>
    
    <details>
      <summary><b>PhotoShop 또는 InDesign 플러그인의 로컬 파일</b> (클릭하여 표시)</summary>
    
    `writeFile`는 Photoshop 및 기타 ExtendScript 대상에서 `File` 로직을 래핑합니다.
    지정된 경로는 절대 경로여야 합니다:```js
    #include "xlsx.extendscript.js"
    
    /* output format determined by filename */
    XLSX.writeFile(workbook, "out.xlsx");
    /* at this point, out.xlsx is a file that you can distribute */
    

    extendscript 데모에는 더 복잡한 예제가 포함되어 있습니다.

    브라우저에서 사용자 컴퓨터로 파일 다운로드 (클릭하여 표시)

    XLSX.writeFile는 파일 저장을 트리거하는 몇 가지 기술을 래핑합니다:

    • URL 브라우저 API는 파일에 대한 객체 URL을 생성하며, 라이브러리는 링크를 생성하고 클릭을 강제하는 방식으로 이를 사용합니다. 현대 브라우저에서 지원됩니다.
    • msSaveBlob은 파일 저장을 트리거하기 위한 IE10+ API입니다.
    • IE_FileSave는 VBScript와 ActiveX를 사용하여 IE6+의 Windows XP 및 Windows 7에서 파일을 작성합니다. 이 shim은 포함된 HTML 페이지에 포함되어야 합니다.

    실제 파일이 다운로드되었는지 확인하는 표준 방법은 없습니다.```js /* output format determined by filename / XLSX.writeFile(workbook, "out.xlsb"); / at this point, out.xlsb will have been downloaded */

    root@kitploit:~
    </details>
    
    <details>
      <summary><b>레거시 브라우저에서 파일 다운로드</b> (클릭하여 표시)</summary>
    
    `XLSX.writeFile` 기법은 대부분의 최신 브라우저와 구형 IE에서도 작동합니다.
    훨씬 오래된 브라우저의 경우 래퍼 라이브러리에서 구현한 우회 방법이 있습니다.
    
    [`FileSaver.js`](https://github.com/eligrey/FileSaver.js/)는 `saveAs`를 구현합니다.
    참고: `XLSX.writeFile`은 사용 가능한 경우 `saveAs`를 자동으로 호출합니다.```js
    /* bookType can be any supported output type */
    var wopts = { bookType:"xlsx", bookSST:false, type:"array" };
    
    var wbout = XLSX.write(workbook,wopts);
    
    /* the saveAs call downloads a file on the local machine */
    saveAs(new Blob([wbout],{type:"application/octet-stream"}), "test.xlsx");
    

    Downloadify는 Flash SWF 버튼을 사용하여 로컬 파일을 생성하며, ActiveX를 사용할 수 없는 환경에 적합합니다:```js Downloadify.create(id,{ /* other options are required! read the downloadify docs for more info */ filename: "test.xlsx", data: function() { return XLSX.write(wb, {bookType:"xlsx", type:"base64"}); }, append: false, dataType: "base64" });

    root@kitploit:~
    [`oldie` 데모](https://github.com/weareu/xlsx/blob/HEAD/demos/oldie/)는 IE 호환 대체 시나리오를 보여줍니다.
    
    </details>
    
    <details>
      <summary><b>브라우저 파일 업로드 (ajax)</b> (클릭하여 표시)</summary>
    
    XHR을 사용하는 완전한 예제는 [XHR 데모](https://github.com/weareu/xlsx/blob/HEAD/demos/xhr/)에 포함되어 있으며, fetch 및
    래퍼 라이브러리에 대한 예제도 함께 있습니다. 이 예제는 서버가 Base64로 인코딩된
    파일을 처리할 수 있다고 가정합니다 (기본 nodejs 서버는 데모를 참조하세요):```js
    /* in this example, send a base64 string to the server */
    var wopts = { bookType:"xlsx", bookSST:false, type:"base64" };
    
    var wbout = XLSX.write(workbook,wopts);
    
    var req = new XMLHttpRequest();
    req.open("POST", "/upload", true);
    var formdata = new FormData();
    formdata.append("file", "test.xlsx"); // <-- server expects `file` to hold name
    formdata.append("data", wbout); // <-- `data` holds the base64-encoded data
    req.send(formdata);
    
    PhantomJS (Headless Webkit) 파일 생성 (클릭하여 표시)

    headless 데모에는 PhantomJS를 사용하여 HTML 파일을 XLSB 통합 문서로 변환하는 완전한 데모가 포함되어 있습니다. PhantomJS fs.write는 메인 프로세스에서 파일 쓰기를 지원하지만 NodeJS fs 모듈과는 다른 인터페이스를 가지고 있습니다:```js var XLSX = require('xlsx'); var fs = require('fs');

    /* generate a binary string / var bin = XLSX.write(workbook, { type:"binary", bookType: "xlsx" }); / write to file */ fs.write("test.xlsx", bin, "wb");

    root@kitploit:~
    참고: ["HTML 테이블 처리"](#processing-html-tables) 섹션은 "Headless WebKit"의 페이지에 있는 HTML 테이블에서 워크북을 생성하는 방법을 보여줍니다.
    
    </details>
    
    
    
    [포함된 데모](https://github.com/weareu/xlsx/blob/HEAD/demos/)는 모바일 앱 및 기타 특수 배포를 다룹니다.
    
    ### 쓰기 예제
    
    - <http://sheetjs.com/demos/table.html> HTML 테이블 내보내기
    - <http://sheetjs.com/demos/writexlsx.html> 간단한 파일 생성
    
    ### 스트리밍 쓰기
    
    스트리밍 쓰기 함수는 `XLSX.stream` 객체에서 사용할 수 있습니다.  일반 쓰기 함수와 동일한 인수를 사용하지만 NodeJS Readable Stream을 반환합니다.
    
    - `XLSX.stream.to_csv`는 `XLSX.utils.sheet_to_csv`의 스트리밍 버전입니다.
    - `XLSX.stream.to_html`는 `XLSX.utils.sheet_to_html`의 스트리밍 버전입니다.
    - `XLSX.stream.to_json`는 `XLSX.utils.sheet_to_json`의 스트리밍 버전입니다.
    
    <details>
      <summary><b>nodejs에서 CSV로 변환하고 파일로 쓰기</b> (클릭하여 표시)</summary>```js
    var output_file_name = "out.csv";
    var stream = XLSX.stream.to_csv(worksheet);
    stream.pipe(fs.createWriteStream(output_file_name));
    
    nodejs JSON 스트림을 화면에 쓰기 (클릭하여 표시)```js /* to_json returns an object-mode stream */ var stream = XLSX.stream.to_json(worksheet, {raw:true});

    /* the following stream converts JS objects to text via JSON.stringify */ var conv = new Transform({writableObjectMode:true}); conv._transform = function(obj, e, cb){ cb(null, JSON.stringify(obj) + "\n"); };

    stream.pipe(conv); conv.pipe(process.stdout);

    root@kitploit:~
    </details>
    
    <details>
      <summary><b>NUMBERS 파일 내보내기</b> (클릭하여 표시)</summary>
    
    NUMBERS 작성기에는 상당히 큰 기반이 필요합니다.  추가 `xlsx.zahl`
    스크립트가 지원을 제공합니다.  `xlsx.zahl.js`는 단독 실행 및 NodeJS
    사용을 위해 설계되었으며, `xlsx.zahl.mjs`는 ESM에 적합합니다.
    
    _브라우저_```html
    <meta charset="utf8">
    <script src="xlsx.full.min.js"></script>
    <script src="xlsx.zahl.js"></script>
    <script>
    var wb = XLSX.utils.book_new(); var ws = XLSX.utils.aoa_to_sheet([
      ["SheetJS", "<3","விரிதாள்"],
      [72,,"Arbeitsblätter"],
      [,62,"数据"],
      [true,false,],
    ]); XLSX.utils.book_append_sheet(wb, ws, "Sheet1");
    XLSX.writeFile(wb, "textport.numbers", {numbers: XLSX_ZAHL, compression: true});
    </script>
    

    Node```js var XLSX = require("./xlsx.flow"); var XLSX_ZAHL = require("./dist/xlsx.zahl"); var wb = XLSX.utils.book_new(); var ws = XLSX.utils.aoa_to_sheet([ ["SheetJS", "<3","விரிதாள்"], [72,,"Arbeitsblätter"], [,62,"数据"], [true,false,], ]); XLSX.utils.book_append_sheet(wb, ws, "Sheet1"); XLSX.writeFile(wb, "textport.numbers", {numbers: XLSX_ZAHL, compression: true});

    root@kitploit:~
    _Deno_```ts
    import * as XLSX from './xlsx.mjs';
    import XLSX_ZAHL from './dist/xlsx.zahl.mjs';
    
    var wb = XLSX.utils.book_new(); var ws = XLSX.utils.aoa_to_sheet([
      ["SheetJS", "<3","விரிதாள்"],
      [72,,"Arbeitsblätter"],
      [,62,"数据"],
      [true,false,],
    ]); XLSX.utils.book_append_sheet(wb, ws, "Sheet1");
    XLSX.writeFile(wb, "textports.numbers", {numbers: XLSX_ZAHL, compression: true});
    

    https://github.com/sheetjs/sheetaki는 쓰기 스트림을 nodejs 응답으로 파이프합니다.

    JSON 및 JS 데이터 생성

    JSON 및 JS 데이터는 일반적으로 단일 워크시트를 나타냅니다. 이 섹션의 유틸리티 함수는 단일 워크시트를 대상으로 합니다.

    "Common Spreadsheet Format" 섹션에서는 객체 구조를 자세히 설명합니다. workbook.SheetNames는 워크시트 이름의 순서가 있는 목록입니다. workbook.Sheets는 키가 시트 이름이고 값이 워크시트 객체인 객체입니다.

    "첫 번째 워크시트"는 workbook.Sheets[workbook.SheetNames[0]]에 저장됩니다.

    API

    워크시트에서 JS 객체 배열 생성```js var jsa = XLSX.utils.sheet_to_json(worksheet, opts);

    root@kitploit:~
    _워크시트에서 JS 값의 배열 배열 만들기_```js
    var aoa = XLSX.utils.sheet_to_json(worksheet, {...opts, header: 1});
    

    sheet_to_json 유틸리티 함수는 워크북을 행 우선(row-major) 순서로 탐색하여 객체 배열을 생성합니다. 두 번째 opts 인수는 값의 유형(JS 값 또는 형식화된 텍스트)을 포함한 여러 내보내기 결정을 제어합니다. "JSON" 섹션에서 이 인수에 대해 자세히 설명합니다.

    기본적으로 sheet_to_json은 첫 번째 행을 스캔하여 해당 값을 헤더로 사용합니다. header: 1 옵션을 사용하면 함수는 값의 배열로 이루어진 배열을 내보냅니다.

    예제

    x-spreadsheet는 웹 브라우저에서 구조화된 데이터를 미리 보고 수정하기 위한 대화형 데이터 그리드입니다. xspreadsheet 데모에는 워크북을 x-spreadsheet 데이터 객체로 변환하는 stox 함수가 포함된 샘플 스크립트가 있습니다. https://oss.sheetjs.com/sheetjs/x-spreadsheet는 라이브 데모입니다.

    React 데이터 그리드에서 데이터 미리 보기 (클릭하여 표시)

    react-data-grid는 react에 맞게 조정된 데이터 그리드입니다. 이 그리드는 데이터 객체로 이루어진 rows와 열을 설명하는 columns라는 두 가지 속성을 기대합니다. 데이터를 react 데이터 그리드 API에 맞게 가공하려면 값의 배열로 이루어진 배열에서 시작하는 것이 가장 쉽습니다.

    이 데모는 원격 파일을 가져와서 XLSX.read를 사용하여 추출하는 것으로 시작합니다:```js import { useEffect, useState } from "react"; import DataGrid from "react-data-grid"; import { read, utils } from "xlsx";

    const url = "https://oss.sheetjs.com/test_files/RkNumber.xls";

    export default function App() { const [columns, setColumns] = useState([]); const [rows, setRows] = useState([]); useEffect(() => {(async () => { const wb = read(await (await fetch(url)).arrayBuffer(), { WTF: 1 });

    root@kitploit:~
    /* use sheet_to_json with header: 1 to generate an array of arrays */
    const data = utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]], { header: 1 });
    
    /* see react-data-grid docs to understand the shape of the expected data */
    setColumns(data[0].map((r) => ({ key: r, name: r })));
    setRows(data.slice(1).map((r) => r.reduce((acc, x, i) => {
      acc[data[0][i]] = x;
      return acc;
    }, {})));
    

    })(); });

    return ; }

    root@kitploit:~
    </details>
    
    <details>
      <summary><b>VueJS 데이터 그리드에서 데이터 미리 보기</b> (클릭하여 표시)</summary>
    
    [`vue3-table-lite`](https://github.com/linmasahiro/vue3-table-lite)는 간단한
    VueJS 3 데이터 테이블입니다. [VueJS 데모](https://github.com/weareu/xlsx/blob/HEAD/demos/vue/modify/)에서 소개됩니다.
    
    </details>
    
    <details>
      <summary><b>데이터베이스 채우기 (SQL 또는 no-SQL)</b> (클릭하여 표시)</summary>
    
    [`database` 데모](https://github.com/weareu/xlsx/blob/HEAD/demos/database/)에는 데이터베이스 및 쿼리 결과를
    다루는 예제가 포함되어 있습니다.
    
    </details>
    
    <details>
      <summary><b>TensorFlow.js를 사용한 수치 계산</b> (클릭하여 표시)</summary>
    
    [`@tensorflow/tfjs`](https://github.com/weareu/xlsx/blob/HEAD/@tensorflow/tfjs) 및 기타 라이브러리는 단순한 배열의 데이터를
    기대하며, 각 열이 데이터 벡터인 워크시트에 적합합니다. 이는 대부분의 사람들이
    스프레드시트를 사용하는 방식(각 행이 벡터)의 전치입니다.
    
    단일 `Array#map`으로 `sheet_to_json` 내보내기에서 개별 이름이 지정된 행을 가져올 수 있습니다:```js
    const XLSX = require("xlsx");
    const tf = require('@tensorflow/tfjs');
    
    const key = "age"; // this is the field we want to pull
    const ages = XLSX.utils.sheet_to_json(worksheet).map(r => r[key]);
    const tf_data = tf.tensor1d(ages);
    

    모든 필드는 header: 1 옵션을 사용한 sheet_to_json 내보내기로 생성된 2D 텐서를 전치하여 한 번에 처리할 수 있습니다. 첫 번째 행에 헤더 레이블이 포함된 경우 슬라이스로 제거해야 합니다:```js const XLSX = require("xlsx"); const tf = require('@tensorflow/tfjs');

    /* array of arrays of the data starting on the second row / const aoa = XLSX.utils.sheet_to_json(worksheet, {header: 1}).slice(1); / dataset in the "correct orientation" / const tf_dataset = tf.tensor2d(aoa).transpose(); / pull out each dataset with a slice */ const tf_field0 = tf_dataset.slice([0,0], [1,tensor.shape[1]]).flatten(); const tf_field1 = tf_dataset.slice([1,0], [1,tensor.shape[1]]).flatten();

    root@kitploit:~
    [`array` 데모](https://github.com/weareu/xlsx/blob/HEAD/demos/array/)는 완전한 예제를 보여줍니다.
    
    </details>
    
    
    ### HTML 테이블 생성
    
    **API**
    
    _워크시트에서 HTML 테이블 생성_```js
    var html = XLSX.utils.sheet_to_html(worksheet);
    

    sheet_to_html 유틸리티 함수는 워크시트 데이터를 기반으로 HTML 코드를 생성합니다. 각 셀은 <TD> 요소에 매핑됩니다. 병합된 셀은 워크시트에서 colspan 및 rowspan 속성을 설정하여 직렬화됩니다.

    예제

    sheet_to_html 유틸리티 함수는 innerHTML을 설정하여 모든 DOM 요소에 추가할 수 있는 HTML 코드를 생성합니다:```js var container = document.getElementById("tavolo"); container.innerHTML = XLSX.utils.sheet_to_html(worksheet);

    root@kitploit:~
    `fetch`와 결합하면, 워크북에서 사이트를 구축하는 것은 간단합니다:
    
    <details>
      <summary><b>바닐라 JS + HTML로 워크북을 fetch하고 테이블 미리보기 생성하기</b> (클릭하여 표시)</summary>```html
    <body>
      <style>TABLE { border-collapse: collapse; } TD { border: 1px solid; }</style>
      <div id="tavolo"></div>
      <script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script>
      <script type="text/javascript">
    (async() => {
      /* fetch and parse workbook -- see the fetch example for details */
      const workbook = XLSX.read(await (await fetch("sheetjs.xlsx")).arrayBuffer());
    
      let output = [];
      /* loop through the worksheet names in order */
      workbook.SheetNames.forEach(name => {
    
        /* generate HTML from the corresponding worksheets */
        const worksheet = workbook.Sheets[name];
        const html = XLSX.utils.sheet_to_html(worksheet);
    
        /* add a header with the title name followed by the table */
        output.push(`<H3>${name}</H3>${html}`);
      });
      /* write to the DOM at the end */
      tavolo.innerHTML = output.join("\n");
    })();
      </script>
    </body>
    
    React 워크북 가져오기 및 HTML 테이블 미리보기 생성 (클릭하여 표시)

    일반적으로 React 친화적인 워크플로우를 사용하는 것이 권장되지만, dangerouslySetInnerHTML을 사용하여 HTML을 생성하고 React에서 사용할 수도 있습니다:```jsx function Tabeller(props) { /* the workbook object is the state */ const [workbook, setWorkbook] = React.useState(XLSX.utils.book_new());

    /* fetch and update the workbook with an effect / React.useEffect(() => { (async() => { / fetch and parse workbook -- see the fetch example for details */ const wb = XLSX.read(await (await fetch("sheetjs.xlsx")).arrayBuffer()); setWorkbook(wb); })(); });

    return workbook.SheetNames.map(name => (<>

    name

    <div dangerouslySetInnerHTML={{ /* this __html mantra is needed to set the inner HTML */ __html: XLSX.utils.sheet_to_html(workbook.Sheets[name]) }} /> </>)); }

    root@kitploit:~
    [`react` 데모](https://github.com/weareu/xlsx/blob/HEAD/demos/react)에는 더 많은 React 예제가 포함되어 있습니다.
    
    </details>
    
    <details>
      <summary><b>VueJS fetch 워크북 및 HTML 테이블 미리보기 생성</b> (클릭하여 표시)</summary>
    
    일반적으로 VueJS에 적합한 워크플로우를 사용하는 것이 권장되지만, `v-html` 디렉티브를 사용하여 HTML을 생성하고 VueJS에서 사용하는 것도 가능합니다:```jsx
    import { read, utils } from 'xlsx';
    import { reactive } from 'vue';
    
    const S5SComponent = {
      mounted() { (async() => {
        /* fetch and parse workbook -- see the fetch example for details */
        const workbook = read(await (await fetch("sheetjs.xlsx")).arrayBuffer());
        /* loop through the worksheet names in order */
        workbook.SheetNames.forEach(name => {
          /* generate HTML from the corresponding worksheets */
          const html = utils.sheet_to_html(workbook.Sheets[name]);
          /* add to state */
          this.wb.wb.push({ name, html });
        });
      })(); },
      /* this state mantra is required for array updates to work */
      setup() { return { wb: reactive({ wb: [] }) }; },
      template: `
      <div v-for="ws in wb.wb" :key="ws.name">
        <h3>{{ ws.name }}</h3>
        <div v-html="ws.html"></div>
      </div>`
    };
    

    vuejs 데모에는 더 많은 React 예제가 포함되어 있습니다.

    단일 워크시트 스냅샷 생성

    sheet_to_* 함수는 워크시트 객체를 받아들입니다.

    API

    단일 워크시트에서 CSV 생성```js var csv = XLSX.utils.sheet_to_csv(worksheet, opts);

    root@kitploit:~
    이 스냅샷은 "CSV UTF8 (`.csv`)" 출력 유형을 복제하도록 설계되었습니다.
    [구분자로 분리된 출력](#delimiter-separated-output)은
    함수와 선택적 `opts` 인수에 대해 더 자세히 설명합니다.
    
    _단일 워크시트에서 "Text" 생성_```js
    var txt = XLSX.utils.sheet_to_txt(worksheet, opts);
    

    이 스냅샷은 "UTF16 Text (.txt)" 출력 유형을 복제하도록 설계되었습니다. "구분자로 구분된 출력"에서는 기능과 선택적 opts 인수에 대해 자세히 설명합니다.

    단일 워크시트에서 수식 목록 생성```js var fmla = XLSX.utils.sheet_to_formulae(worksheet);

    root@kitploit:~
    이 스냅샷은 포함된 수식을 나타내는 항목 배열을 생성합니다.
    배열 수식은 `range=formula` 형식으로 렌더링되는 반면, 일반 셀은
    `cell=formula or value` 형식으로 렌더링됩니다. 문자열 리터럴에는
    Excel의 수식 입력 줄 표시와 동일하게 아포스트로피 `'`가 접두사로 붙습니다.
    
    ["수식 출력"](#formulae-output)에서 이 기능에 대해 자세히 설명합니다.
    
    ## 인터페이스
    
    `XLSX`는 브라우저에서 노출되는 변수이자 내보내진 node 변수입니다.
    
    `XLSX.version`은 라이브러리의 버전입니다(빌드 스크립트에 의해 추가됨).
    
    `XLSX.SSF`는 [포맷 라이브러리](https://git.io/ssf)의 내장 버전입니다.
    
    ### 구문 분석 함수
    
    `XLSX.read(data, read_opts)`는 `data`의 구문 분석을 시도합니다.
    
    `XLSX.readFile(filename, read_opts)`는 `filename`을 읽고 구문 분석을 시도합니다.
    
    구문 분석 옵션은 [구문 분석 옵션](#parsing-options) 섹션에서 설명합니다.
    
    ### 쓰기 함수
    
    `XLSX.write(wb, write_opts)`는 통합 문서 `wb`를 쓰려고 시도합니다.
    
    `XLSX.writeFile(wb, filename, write_opts)`는 `wb`를 `filename`에 쓰려고 시도합니다.
    브라우저 기반 환경에서는 클라이언트 측 다운로드를 강제로 시도합니다.
    
    `XLSX.writeFileAsync(wb, filename, o, cb)`는 `wb`를 `filename`에 쓰려고 시도합니다.
    `o`가 생략되면 쓰기 함수는 세 번째 인수를 콜백으로 사용합니다.
    
    `XLSX.stream`에는 스트리밍 쓰기 함수 집합이 포함되어 있습니다.
    
    쓰기 옵션은 [쓰기 옵션](#writing-options) 섹션에서 설명합니다.
    
    ### 유틸리티
    
    유틸리티는 `XLSX.utils` 객체에서 사용할 수 있으며
    [유틸리티 함수](#utility-functions) 섹션에서 설명합니다:
    
    **생성:**
    
    - `book_new`는 빈 통합 문서를 생성합니다
    - `book_append_sheet`는 통합 문서에 워크시트를 추가합니다
    
    **가져오기:**
    
    - `aoa_to_sheet`는 JS 데이터로 이루어진 배열의 배열을 워크시트로 변환합니다.
    - `json_to_sheet`는 JS 객체 배열을 워크시트로 변환합니다.
    - `table_to_sheet`는 DOM TABLE 요소를 워크시트로 변환합니다.
    - `sheet_add_aoa`는 JS 데이터로 이루어진 배열의 배열을 기존 워크시트에 추가합니다.
    - `sheet_add_json`은 JS 객체 배열을 기존 워크시트에 추가합니다.
    
    **내보내기:**
    
    - `sheet_to_json`은 워크시트 객체를 JSON 객체 배열로 변환합니다.
    - `sheet_to_csv`는 구분자로 구분된 값 출력을 생성합니다.
    - `sheet_to_txt`는 UTF16 형식 텍스트를 생성합니다.
    - `sheet_to_html`은 HTML 출력을 생성합니다.
    - `sheet_to_formulae`는 수식 목록(값 폴백 포함)을 생성합니다.
    
    **셀 및 셀 주소 조작:**
    
    - `format_cell`은 숫자 형식을 사용하여 셀의 텍스트 값을 생성합니다.
    - `encode_row / decode_row`는 0부터 시작하는 행과 1부터 시작하는 행 사이를 변환합니다.
    - `encode_col / decode_col`은 0부터 시작하는 열과 열 이름 사이를 변환합니다.
    - `encode_cell / decode_cell`은 셀 주소를 변환합니다.
    - `encode_range / decode_range`는 셀 범위를 변환합니다.
    
    ## 공통 스프레드시트 형식
    
    SheetJS는 공통 스프레드시트 형식(CSF)을 따릅니다:
    
    ### 일반 구조
    
    셀 주소 객체는 `{c:C, r:R}`로 저장되며, 여기서 `C`와 `R`은 각각 0부터 시작하는
    열 번호와 행 번호입니다. 예를 들어 셀 주소 `B5`는 객체 `{c:1, r:4}`로 표현됩니다.
    
    셀 범위 객체는 `{s:S, e:E}`로 저장되며, 여기서 `S`는 범위의 첫 번째 셀이고
    `E`는 범위의 마지막 셀입니다. 범위는 양 끝 셀을 포함합니다. 예를 들어
    범위 `A3:B7`은 객체 `{s:{c:0, r:2}, e:{c:1, r:6}}`로 표현됩니다.
    유틸리티 함수는 시트 범위를 행 우선 순서로 순회합니다:```js
    for(var R = range.s.r; R <= range.e.r; ++R) {
      for(var C = range.s.c; C <= range.e.c; ++C) {
        var cell_address = {c:C, r:R};
        /* if an A1-style address is needed, encode the address */
        var cell_ref = XLSX.utils.encode_cell(cell_address);
      }
    }
    

    셀 객체

    셀 객체는 키와 값이 다음 규칙을 따르는 일반 JS 객체입니다:

    키설명
    v원시 값 (자세한 내용은 데이터 형식 섹션 참조)
    w형식화된 텍스트 (해당하는 경우)
    t형식: b 불리언, e 오류, n 숫자, d 날짜, s 텍스트, z 스텁
    fA1 스타일 문자열로 인코딩된 셀 수식 (해당하는 경우)
    F배열 수식인 경우 둘러싸는 배열의 범위 (해당하는 경우)
    Dtrue인 경우 배열 수식이 동적임 (해당하는 경우)
    r서식 있는 텍스트 인코딩 (해당하는 경우)
    h서식 있는 텍스트의 HTML 렌더링 (해당하는 경우)
    c셀과 연결된 주석
    z셀과 연결된 숫자 형식 문자열 (요청된 경우)
    l셀 하이퍼링크 객체 (.Target은 링크, .Tooltip은 도구 설명)
    s셀의 스타일/테마 (해당하는 경우)

    내장 내보내기 유틸리티(예: CSV 내보내기)는 사용 가능한 경우 w 텍스트를 사용합니다. 값을 변경하려면 내보내기를 시도하기 전에 cell.w를 삭제(또는 undefined로 설정)해야 합니다. 유틸리티는 가능하면 숫자 형식(cell.z)과 원시 값에서 w 텍스트를 다시 생성합니다.

    실제 배열 수식은 배열 범위의 첫 번째 셀의 f 필드에 저장됩니다. 범위의 다른 셀은 f 필드를 생략합니다.

    데이터 형식

    원시 값은 v 값 속성에 저장되며 t 형식 속성에 따라 해석됩니다. 이 분리를 통해 숫자와 숫자 텍스트를 모두 표현할 수 있습니다. 유효한 셀 형식은 6가지입니다:

    형식설명
    b불리언: JS boolean으로 해석되는 값
    e오류: 값은 숫자 코드이고 w 속성은 일반적인 이름을 저장함 **
    n숫자: JS number인 값 **
    d날짜: JS Date 객체 또는 Date로 구문 분석될 문자열 **
    s텍스트: JS string으로 해석되고 텍스트로 기록되는 값 **
    z스텁: 데이터 처리 유틸리티가 무시하는 빈 스텁 셀 **
    오류 값 및 해석 (클릭하여 표시)
    값오류 의미
    0x00#NULL!
    0x07#DIV/0!
    0x0F#VALUE!
    0x17#REF!
    0x1D#NAME?
    0x24#NUM!
    0x2A#N/A
    0x2B#GETTING_DATA

    n 형식은 Number 형식입니다. 여기에는 Excel이 숫자로 저장하는 모든 형태의 데이터(예: 날짜/시간 및 불리언 필드)가 포함됩니다. Excel은 JS Number와 마찬가지로 IEEE754 부동 소수점 숫자에 맞는 데이터만 독점적으로 사용하므로 v 필드에는 원시 숫자가 저장됩니다. w 필드에는 형식화된 텍스트가 저장됩니다. 날짜는 기본적으로 숫자로 저장되며 XLSX.SSF.parse_date_code로 변환됩니다.

    d 형식은 Date 형식으로, cellDates 옵션이 전달된 경우에만 생성됩니다. JSON에는 자연스러운 Date 형식이 없으므로 파서는 일반적으로 date.toISOString()에서 얻을 수 있는 ISO 8601 날짜 문자열을 저장해야 합니다. 반면, 쓰기 도구와 내보내기 도구는 날짜 문자열과 JS Date 객체를 처리할 수 있어야 합니다. Excel은 시간대 수정자를 무시하고 모든 날짜를 현지 시간대로 처리한다는 점에 유의하세요. 라이브러리는 이 오류를 수정하지 않습니다.

    s 형식은 String 형식입니다. 값은 명시적으로 텍스트로 저장됩니다. Excel은 이러한 셀을 "숫자가 텍스트로 저장됨"으로 해석합니다. 생성된 Excel 파일은 해당 종류의 오류를 자동으로 억제하지만, 다른 형식에서는 오류가 발생할 수 있습니다.

    z 형식은 빈 스텁 셀을 나타냅니다. 값이 할당되지 않았지만 주석이나 기타 메타데이터를 보유한 셀의 경우 생성됩니다. 핵심 라이브러리의 데이터 처리 유틸리티 함수에서는 무시됩니다. 기본적으로 이러한 셀은 생성되지 않습니다; 파서의 sheetStubs 옵션을 true로 설정해야 합니다.

    날짜

    Excel 날짜 코드 세부 정보 (클릭하여 표시)

    기본적으로 Excel은 날짜 처리 방식을 지정하는 형식 코드와 함께 날짜를 숫자로 저장합니다. 예를 들어 19-Feb-17 날짜는 d-mmm-yy 숫자 형식으로 숫자 42785에 저장됩니다. SSF 모듈은 숫자 형식을 이해하고 적절한 변환을 수행합니다.

    XLSX는 데이터가 ISO 8601 날짜 문자열인 특수 날짜 형식 d도 지원합니다. 포맷터는 날짜를 다시 숫자로 변환합니다.

    모든 파서의 기본 동작은 숫자 셀을 생성하는 것입니다. cellDates를 true로 설정하면 생성기가 날짜를 저장하도록 강제합니다.

    시간대 및 날짜 (클릭하여 표시)

    Excel에는 보편 시간(universal time)에 대한 기본 개념이 없습니다. 모든 시간은 현지 시간대로 지정됩니다. Excel의 제한으로 인해 실제 절대 날짜를 지정할 수 없습니다.

    Excel을 따라, 이 라이브러리는 모든 날짜를 현지 시간대 기준으로 처리합니다.

    기준 연도: 1900 및 1904 (클릭하여 표시)

    Excel은 두 가지 기준 연도(1900년 1월 1일 및 1904년 1월 1일)를 지원합니다. 통합 문서의 기준 연도는 통합 문서의 wb.Workbook.WBProps.date1904 속성을 확인하여 결정할 수 있습니다:```js !!(((wb.Workbook||{}).WBProps||{}).date1904)

    root@kitploit:~
    </details>
    
    ### 시트 객체
    
    `!`로 시작하지 않는 각 키는 셀에 매핑됩니다(`A-1` 표기법 사용).
    
    `sheet[address]`는 지정된 주소의 셀 객체를 반환합니다.
    
    **특수 시트 키(`sheet[key]`로 접근 가능, 각각 `!`로 시작):**
    
    - `sheet['!ref']`: 시트 범위를 나타내는 A-1 기반 범위입니다. 시트를 다루는
      함수는 이 매개변수를 사용하여 범위를 결정해야 합니다. 범위 밖에 할당된
      셀은 처리되지 않습니다. 특히, 시트를 수동으로 작성할 때 범위 밖의 셀은
      포함되지 않습니다
    
      시트를 처리하는 함수는 `!ref` 필드의 존재 여부를 확인해야 합니다.
      `!ref`가 생략되었거나 유효한 범위가 아닌 경우, 함수는 시트를 빈 것으로
      취급하거나 범위를 추측할 수 있습니다. 이 라이브러리와 함께 제공되는 표준
      유틸리티는 시트를 빈 것으로 취급합니다(예: CSV 출력은 빈 문자열입니다).
    
      `sheetRows` 속성이 설정된 워크시트를 읽을 때, ref 매개변수는 제한된 범위를
      사용합니다. 원래 범위는 `ws['!fullref']`에 설정됩니다.
    
    - `sheet['!margins']`: 페이지 여백을 나타내는 객체입니다. 기본값은 Excel의
      "normal" 프리셋을 따릅니다. Excel에는 "wide" 및 "narrow" 프리셋도 있지만
      원시 측정값으로 저장됩니다. 주요 속성은 아래에 나열되어 있습니다:
    
    <details>
      <summary><b>페이지 여백 세부 정보</b> (클릭하여 표시)</summary>
    
    | 키       | 설명                   | "normal" | "wide" | "narrow" |
    |----------|------------------------|:---------|:-------|:-------- |
    | `left`   | 왼쪽 여백(인치)        | `0.7`    | `1.0`  | `0.25`   |
    | `right`  | 오른쪽 여백(인치)      | `0.7`    | `1.0`  | `0.25`   |
    | `top`    | 위쪽 여백(인치)        | `0.75`   | `1.0`  | `0.75`   |
    | `bottom` | 아래쪽 여백(인치)      | `0.75`   | `1.0`  | `0.75`   |
    | `header` | 머리글 여백(인치)      | `0.3`    | `0.5`  | `0.3`    |
    | `footer` | 바닥글 여백(인치)      | `0.3`    | `0.5`  | `0.3`    |```js
    /* Set worksheet sheet to "normal" */
    ws["!margins"]={left:0.7, right:0.7, top:0.75,bottom:0.75,header:0.3,footer:0.3}
    /* Set worksheet sheet to "wide" */
    ws["!margins"]={left:1.0, right:1.0, top:1.0, bottom:1.0, header:0.5,footer:0.5}
    /* Set worksheet sheet to "narrow" */
    ws["!margins"]={left:0.25,right:0.25,top:0.75,bottom:0.75,header:0.3,footer:0.3}
    

    워크시트 객체

    기본 시트 키 외에도 워크시트는 다음 항목을 추가합니다:

    • ws['!cols']: 열 속성 객체의 배열입니다. 열 너비는 실제로 파일에 정규화된 방식으로 저장되며, "최대 숫자 너비"(렌더링된 숫자 0-9의 가장 큰 너비, 픽셀 단위)로 측정됩니다. 파싱되면 열 객체는 픽셀 너비를 wpx 필드에, 문자 너비를 wch 필드에, 최대 숫자 너비를 MDW 필드에 저장합니다.

    • ws['!rows']: 문서 뒷부분에서 설명하는 행 속성 객체의 배열입니다. 각 행 객체는 행 높이와 표시 여부를 포함한 속성을 인코딩합니다.

    • ws['!merges']: 워크시트의 병합된 셀에 해당하는 범위 객체의 배열입니다. 일반 텍스트 형식은 병합 셀을 지원하지 않습니다. CSV 내보내기는 병합 범위의 모든 셀이 존재하면 해당 셀을 모두 작성하므로, 범위의 첫 번째 셀(왼쪽 위)만 설정되어 있는지 확인하세요.

    • ws['!outline']: 개요가 동작하는 방식을 구성합니다. 옵션은 기본적으로 Excel 2019의 기본 설정을 따릅니다:

    keyExcel 기능기본값
    above"요약 행을 세부 정보 아래에 표시" 선택 해제false
    left"요약 행을 세부 정보 오른쪽에 표시" 선택 해제false
    • ws['!protect']: 쓰기 시트 보호 속성의 객체입니다. password 키는 암호로 보호된 시트를 지원하는 형식(XLSX/XLSB/XLS)의 암호를 지정합니다. 작성기는 XOR 난독화 방법을 사용합니다. 다음 키는 시트 보호를 제어합니다 -- 시트가 잠겨 있을 때 기능을 활성화하려면 false로 설정하고, 기능을 비활성화하려면 true로 설정합니다:
    워크시트 보호 세부 정보 (클릭하여 표시)
    key기능 (true=비활성화 / false=활성화)기본값
    selectLockedCells잠긴 셀 선택활성화
    selectUnlockedCells잠금 해제된 셀 선택활성화
    formatCells셀 서식 지정비활성화
    formatColumns열 서식 지정비활성화
    formatRows행 서식 지정비활성화
    insertColumns열 삽입비활성화
    insertRows행 삽입비활성화
    insertHyperlinks하이퍼링크 삽입비활성화
    deleteColumns열 삭제비활성화
    deleteRows행 삭제비활성화
    sort정렬비활성화
    autoFilter필터비활성화
    pivotTables피벗 테이블 보고서 사용비활성화
    objects개체 편집활성화
    scenarios시나리오 편집활성화
    • ws['!autofilter']: 다음 스키마를 따르는 AutoFilter 객체:```typescript type AutoFilter = { ref:string; // A-1 based range representing the AutoFilter table range }
    root@kitploit:~
    #### 차트시트 객체
    
    차트시트는 표준 시트로 표현됩니다.  `!type` 속성이 `"chart"`로 설정되어 구분됩니다.
    
    기본 데이터와 `!ref`는 차트시트에 캐시된 데이터를 참조합니다.  차트시트의 첫 번째 행은 기본 헤더입니다.
    
    #### 매크로시트 객체
    
    매크로시트는 표준 시트로 표현됩니다.  `!type` 속성이 `"macro"`로 설정되어 구분됩니다.
    
    #### 대화상자시트 객체
    
    대화상자시트는 표준 시트로 표현됩니다.  `!type` 속성이 `"dialog"`로 설정되어 구분됩니다.
    
    ### 통합 문서 객체
    
    `workbook.SheetNames`는 통합 문서에 있는 시트의 순서 목록입니다.
    
    `wb.Sheets[sheetname]`는 워크시트를 나타내는 객체를 반환합니다.
    
    `wb.Props`는 표준 속성을 저장하는 객체입니다.  `wb.Custprops`는 사용자 지정 속성을 저장합니다.  XLS 표준 속성은 XLSX 표준과 다르기 때문에 XLS 파싱은 핵심 속성을 두 위치 모두에 저장합니다.
    
    `wb.Workbook`은 [통합 문서 수준 속성](#workbook-level-attributes)을 저장합니다.
    
    #### 통합 문서 파일 속성
    
    다양한 파일 형식은 파일 속성에 대해 서로 다른 내부 이름을 사용합니다.  통합 문서의 `Props` 객체는 이름을 정규화합니다.
    
    <details>
      <summary><b>파일 속성</b> (클릭하여 표시)</summary>
    
    | JS 이름         | Excel 설명                       |
    |:--------------|:-------------------------------|
    | `Title`       | 요약 탭 "제목"                    |
    | `Subject`     | 요약 탭 "주제"                    |
    | `Author`      | 요약 탭 "작성자"                  |
    | `Manager`     | 요약 탭 "관리자"                  |
    | `Company`     | 요약 탭 "회사"                    |
    | `Category`    | 요약 탭 "범주"                    |
    | `Keywords`    | 요약 탭 "키워드"                  |
    | `Comments`    | 요약 탭 "메모"                    |
    | `LastAuthor`  | 통계 탭 "마지막 저장한 사람"      |
    | `CreatedDate` | 통계 탭 "만든 날짜"               |
    
    </details>
    
    예를 들어, 통합 문서 제목 속성을 설정하려면:```js
    if(!wb.Props) wb.Props = {};
    wb.Props.Title = "Insert Title Here";
    

    사용자 지정 속성은 통합 문서의 Custprops 개체에 추가됩니다:```js if(!wb.Custprops) wb.Custprops = {}; wb.Custprops["Custom Property"] = "Custom Value";

    root@kitploit:~
    Writers는 options 객체의 `Props` 키를 처리합니다:```js
    /* force the Author to be "SheetJS" */
    XLSX.write(wb, {Props:{Author:"SheetJS"}});
    

    Workbook-Level Attributes

    wb.Workbook은 통합 문서 수준 속성을 저장합니다.

    Defined Names

    wb.Workbook.Names은 다음 키를 가진 정의된 이름 객체의 배열입니다:

    Defined Name Properties (click to show)
    KeyDescription
    Sheet이름 범위. 시트 인덱스(0 = 첫 번째 시트) 또는 null(통합 문서)
    Name대소문자 구분 이름. 표준 규칙이 적용됩니다 **
    RefA1 스타일 참조("Sheet1!$A$1:$D$20")
    Comment주석(XLS/XLSX/XLSB에만 적용)

    Excel에서는 두 개의 시트 범위 정의 이름이 같은 이름을 공유할 수 있습니다. 그러나 시트 범위 이름은 통합 문서 범위 이름과 충돌할 수 없습니다. 통합 문서 작성자는 이 제약 조건을 적용하지 않을 수 있습니다.

    Workbook Views

    wb.Workbook.Views은 다음 키를 가진 통합 문서 보기 객체의 배열입니다:

    KeyDescription
    RTLtrue이면 오른쪽에서 왼쪽으로 표시합니다.

    Miscellaneous Workbook Properties

    wb.Workbook.WBProps는 기타 통합 문서 속성을 보유합니다:

    KeyDescription
    CodeNameVBA 프로젝트 통합 문서 코드 이름
    date1904epoch: 1900 시스템은 0/false, 1904는 1/true
    filterPrivacy저장 시 개인 식별 정보 경고 또는 제거

    Document Features

    날짜 저장과 같은 기본 기능조차도 공식 Excel 형식은 동일한 콘텐츠를 서로 다른 방식으로 저장합니다. 파서는 기본 파일 형식 표현을 공통 스프레드시트 형식(Common Spreadsheet Format)으로 변환할 것으로 예상됩니다. 작성자는 CSF에서 기본 파일 형식으로 다시 변환할 것으로 예상됩니다.

    Formulae

    A1 스타일 수식 문자열은 f 필드에 저장됩니다. 서로 다른 파일 형식은 수식을 서로 다른 방식으로 저장하지만 형식은 변환됩니다. 일부 형식은 앞에 등호가 있는 수식을 저장하지만 CSF 수식은 =로 시작하지 않습니다.

    Formulae File Format Support (click to show)
    Storage RepresentationFormatsReadWrite
    A1-style stringsXLSX✔✔
    RC-style stringsXLML and plain text✔✔
    BIFF Parsed formulaeXLSB and all XLS formats✔
    OpenFormula formulaeODS/FODS/UOS✔✔
    Lotus Parsed formulaeAll Lotus WK_ formats✔

    Excel에서는 명명된 셀이 A1 또는 RC 스타일 셀 참조의 이름과 충돌하는 것을 금지하므로 (그렇게 간단하지 않은) 정규식 변환이 가능합니다. BIFF 파싱 수식과 Lotus 파싱 수식은 명시적으로 풀어야 합니다. OpenFormula 수식은 정규식으로 변환할 수 있습니다.

    공유 수식은 압축이 풀리며 각 셀은 해당 셀에 해당하는 수식을 갖습니다. 작성자는 일반적으로 공유 수식을 생성하려고 시도하지 않습니다.

    Single-Cell Formulae

    단순 수식의 경우 원하는 셀의 f 키를 실제 수식 텍스트로 설정할 수 있습니다. 이 워크시트는 A1=1, A2=2, A3=A1+A2를 나타냅니다:```js var worksheet = { "!ref": "A1:A3", A1: { t:'n', v:1 }, A2: { t:'n', v:2 }, A3: { t:'n', v:3, f:'A1+A2' } };

    root@kitploit:~
    Utilities like `aoa_to_sheet` will accept cell objects in lieu of values:
    
    → `aoa_to_sheet`와 같은 유틸리티는 값 대신 셀 객체를 허용합니다:```js
    var worksheet = XLSX.utils.aoa_to_sheet([
      [ 1 ], // A1
      [ 2 ], // A2
      [ {t: "n", v: 3, f: "A1+A2"} ] // A3
    ]);
    

    Cells with formula entries but no value will be serialized in a way that Excel and other spreadsheet tools will recognize. This library will not automatically compute formula results! For example, the following worksheet will include the BESSELJ function but the result will not be available in JavaScript:```js var worksheet = XLSX.utils.aoa_to_sheet([ [ 3.14159, 2 ], // Row "1" [ { t:'n', f:'BESSELJ(A1,B1)' } ] // Row "2" will be calculated on file open }

    root@kitploit:~
    실제 결과가 JS에서 필요하다면, [SheetJS Pro](https://sheetjs.com/pro)는
    표현식 평가, 값 및 종속 셀 업데이트, 전체 통합 문서 새로 고침을 위한
    수식 계산기 구성 요소를 제공합니다.
    
    
    **배열 수식**
    
    _배열 수식 할당_```js
    XLSX.utils.sheet_set_array_formula(worksheet, range, formula);
    

    배열 수식은 배열 블록의 왼쪽 위 셀에 저장됩니다. 배열 수식의 모든 셀은
    해당 범위에 대응하는 F 필드를 가집니다. 단일 셀 수식은
    F 필드의 존재로 일반 수식과 구분할 수 있습니다.

    예를 들어, 셀 C1을 배열 수식 {=SUM(A1:A3*B1:B3)}로 설정하는 경우:```js // API function XLSX.utils.sheet_set_array_formula(worksheet, "C1", "SUM(A1:A3*B1:B3)");

    // ... OR raw operations worksheet['C1'] = { t:'n', f: "SUM(A1:A3*B1:B3)", F:"C1:C1" };

    root@kitploit:~
    다중 셀 배열 수식의 경우 모든 셀은 동일한 배열 범위를 가지지만 첫 번째 셀만 수식을 지정합니다. `D1:D3=A1:A3*B1:B3`를 고려하세요:```js
    // API function
    XLSX.utils.sheet_set_array_formula(worksheet, "D1:D3", "A1:A3*B1:B3");
    
    // ... OR raw operations
    worksheet['D1'] = { t:'n', F:"D1:D3", f:"A1:A3*B1:B3" };
    worksheet['D2'] = { t:'n', F:"D1:D3" };
    worksheet['D3'] = { t:'n', F:"D1:D3" };
    

    유틸리티와 작성자는 F 필드의 존재를 확인하고 시작 셀 이외의 셀에 있는 가능한 수식 요소 f는 무시해야 합니다. 수식의 유효성 검사를 수행할 필요는 없습니다!

    동적 배열 수식

    동적 배열 수식 할당```js XLSX.utils.sheet_set_array_formula(worksheet, range, formula, true);

    root@kitploit:~
    2020년에 출시된 동적 배열 수식(Dynamic Array Formulae)은 XLSX/XLSM 및 XLSB 파일 형식에서 지원됩니다. 이는 일반 배열 수식처럼 표현되지만, 수식이 범위를 조정할 수 있도록 허용되어야 함을 나타내는 특별한 셀 메타데이터를 가지고 있습니다.
    
    배열 수식은 셀의 `D` 속성을 true로 설정하여 동적 수식으로 표시할 수 있습니다. `F` 범위는 필수이지만 현재 셀로 설정될 수 있습니다:```js
    // API function
    XLSX.utils.sheet_set_array_formula(worksheet, "C1", "_xlfn.UNIQUE(A1:A3)", 1);
    
    // ... OR raw operations
    worksheet['C1'] = { t: "s", f: "_xlfn.UNIQUE(A1:A3)", F:"C1", D: 1 }; // dynamic
    

    함수 이름을 사용한 지역화

    SheetJS는 파일 수준에서 작동합니다. Excel은 수식 표현식을 영어(미국) 함수 이름으로 저장합니다. 영어를 사용하지 않는 사용자의 경우 Excel은 지역화된 함수 이름 집합을 사용합니다.

    예를 들어, 컴퓨터 언어와 지역이 프랑스어(프랑스)로 설정된 경우 Excel은 =SOMME(A1:C3)을 SOMME가 SUM 함수인 것처럼 해석합니다. 그러나 실제 파일에서 Excel은 SUM(A1:C3)을 저장합니다.

    접두사가 붙은 "향후 함수"

    최신 버전의 Excel에 도입된 함수는 파일에 저장될 때 _xlfn. 접두사가 붙습니다. 이러한 함수를 사용하여 수식 표현식을 작성할 때 최대 호환성을 위해 접두사가 필요합니다:```js // Broadest compatibility XLSX.utils.sheet_set_array_formula(worksheet, "C1", "_xlfn.UNIQUE(A1:A3)", 1);

    // Can cause errors in spreadsheet software XLSX.utils.sheet_set_array_formula(worksheet, "C1", "UNIQUE(A1:A3)", 1);

    root@kitploit:~
    When reading a file, the `xlfn` option preserves the prefixes.
    
    <details>
      <summary><b> `_xlfn.` 접두사가 필요한 함수</b> (클릭하여 표시)</summary>
    
    이 목록은 Excel 릴리스가 나올 때마다 늘어나고 있습니다.```
    ACOT
    ACOTH
    AGGREGATE
    ARABIC
    BASE
    BETA.DIST
    BETA.INV
    BINOM.DIST
    BINOM.DIST.RANGE
    BINOM.INV
    BITAND
    BITLSHIFT
    BITOR
    BITRSHIFT
    BITXOR
    BYCOL
    BYROW
    CEILING.MATH
    CEILING.PRECISE
    CHISQ.DIST
    CHISQ.DIST.RT
    CHISQ.INV
    CHISQ.INV.RT
    CHISQ.TEST
    COMBINA
    CONFIDENCE.NORM
    CONFIDENCE.T
    COT
    COTH
    COVARIANCE.P
    COVARIANCE.S
    CSC
    CSCH
    DAYS
    DECIMAL
    ERF.PRECISE
    ERFC.PRECISE
    EXPON.DIST
    F.DIST
    F.DIST.RT
    F.INV
    F.INV.RT
    F.TEST
    FIELDVALUE
    FILTERXML
    FLOOR.MATH
    FLOOR.PRECISE
    FORMULATEXT
    GAMMA
    GAMMA.DIST
    GAMMA.INV
    GAMMALN.PRECISE
    GAUSS
    HYPGEOM.DIST
    IFNA
    IMCOSH
    IMCOT
    IMCSC
    IMCSCH
    IMSEC
    IMSECH
    IMSINH
    IMTAN
    ISFORMULA
    ISOMITTED
    ISOWEEKNUM
    LAMBDA
    LET
    LOGNORM.DIST
    LOGNORM.INV
    MAKEARRAY
    MAP
    MODE.MULT
    MODE.SNGL
    MUNIT
    NEGBINOM.DIST
    NORM.DIST
    NORM.INV
    NORM.S.DIST
    NORM.S.INV
    NUMBERVALUE
    PDURATION
    PERCENTILE.EXC
    PERCENTILE.INC
    PERCENTRANK.EXC
    PERCENTRANK.INC
    PERMUTATIONA
    PHI
    POISSON.DIST
    QUARTILE.EXC
    QUARTILE.INC
    QUERYSTRING
    RANDARRAY
    RANK.AVG
    RANK.EQ
    REDUCE
    RRI
    SCAN
    SEC
    SECH
    SEQUENCE
    SHEET
    SHEETS
    SKEW.P
    SORTBY
    STDEV.P
    STDEV.S
    T.DIST
    T.DIST.2T
    T.DIST.RT
    T.INV
    T.INV.2T
    T.TEST
    UNICHAR
    UNICODE
    UNIQUE
    VAR.P
    VAR.S
    WEBSERVICE
    WEIBULL.DIST
    XLOOKUP
    XOR
    Z.TEST
    

    행 및 열 속성

    포맷 지원 (클릭하여 표시)

    행 속성: XLSX/M, XLSB, BIFF8 XLS, XLML, SYLK, DOM, ODS

    열 속성: XLSX/M, XLSB, BIFF8 XLS, XLML, SYLK, DOM

    행 및 열 속성은 파일을 읽을 때 기본적으로 추출되지 않으며 파일에 쓸 때 기본적으로 유지되지 않습니다. 옵션 cellStyles: true를 해당 읽기 또는 쓰기 함수에 전달해야 합니다.

    열 속성

    각 워크시트의 !cols 배열은, 존재하는 경우, ColInfo 객체들의 모음이며 다음 속성을 가집니다:```typescript type ColInfo = { /* visibility */ hidden?: boolean; // if true, the column is hidden

    /* column width is specified in one of the following ways: / wpx?: number; // width in screen pixels width?: number; // width in Excel's "Max Digit Width", width256 is integral wch?: number; // width in characters

    /* other fields for preserving features from files */ level?: number; // 0-indexed outline / group level MDW?: number; // Excel's "Max Digit Width" unit, always integral };

    root@kitploit:~
    _Row Properties_
    
    각 워크시트의 `!rows` 배열은, 존재하는 경우, 다음 속성을 가진 `RowInfo` 객체 모음입니다:```typescript
    type RowInfo = {
      /* visibility */
      hidden?: boolean; // if true, the row is hidden
    
      /* row height is specified in one of the following ways: */
      hpx?:    number;  // height in screen pixels
      hpt?:    number;  // height in points
    
      level?:  number;  // 0-indexed outline / group level
    };
    

    개요/그룹 수준 규칙

    Excel UI는 기본 개요 수준을 1로, 최대 수준을 8로 표시합니다. JS 관례에 따라 SheetJS는 0부터 시작하는 개요 수준을 사용하며, 기본 개요 수준은 0, 최대 수준은 7입니다.

    왜 세 가지 너비 유형이 있나요? (클릭하여 표시)

    스프레드시트가 열 너비를 저장하는 세 가지 방식에 해당하는 세 가지 너비 유형이 있습니다.

    SYLK 및 기타 일반 텍스트 형식은 원시 문자 수를 사용합니다. 당시의 도구인 Visicalc와 Multiplan은 문자 기반이었습니다. 문자의 너비가 동일했기 때문에 개수를 저장하는 것으로 충분했습니다. 이 전통은 BIFF 형식으로 이어졌습니다.

    SpreadsheetML(2003)은 파일 전체에서 화면 픽셀 수를 표준화하여 HTML과 정렬하려고 했습니다. 열 너비, 행 높이 및 기타 측정값은 픽셀을 사용합니다. 픽셀 수와 문자 수가 일치하지 않으면 Excel은 값을 반올림합니다.

    XLSX는 내부적으로 열 너비를 모호한 "Max Digit Width" 형식으로 저장합니다. Max Digit Width는 렌더링될 때 가장 큰 숫자의 너비입니다(일반적으로 "0" 문자가 가장 넓습니다). 내부 너비는 너비를 256으로 나눈 값의 정수 배수여야 합니다. ECMA-376은 픽셀과 내부 너비 사이의 변환 공식을 설명합니다. 이는 하이브리드 방식을 나타냅니다.

    읽기 함수는 세 속성을 모두 채우려고 시도합니다. 쓰기 함수는 지정된 값을 원하는 유형으로 순환시키려고 합니다. 잠재적 충돌을 피하려면 조작 시 먼저 다른 속성을 삭제해야 합니다. 예를 들어 픽셀 너비를 변경할 때 wch 및 width 속성을 삭제하십시오.

    구현 세부 사항 (클릭하여 표시)

    행 높이

    Excel은 내부적으로 행 높이를 포인트 단위로 저장합니다. 기본 해상도는 72 DPI 또는 96 PPI이므로 픽셀 크기와 포인트 크기는 일치해야 합니다. 해상도가 다르면 일치하지 않을 수 있으므로 라이브러리는 개념을 분리합니다.

    모든 정보가 제공되지만, 쓰기 함수는 다음 우선순위를 따라야 합니다:

    1. 가능하면 hpx 픽셀 높이를 사용
    2. 가능하면 hpt 포인트 높이를 사용

    열 너비

    제약 조건이 주어지면 실제로 글꼴을 검사하지 않고도 MDW를 결정할 수 있습니다! 파서는 너비를 픽셀로 변환했다가 다시 변환하여 픽셀 너비를 추측하고, 가능한 모든 MDW에 대해 반복하여 오류를 최소화하는 MDW를 선택합니다. XLML은 실제로 픽셀 너비를 저장하므로 추측은 반대 방향으로 작동합니다.

    모든 정보가 제공되지만, 쓰기 함수는 다음 우선순위를 따라야 합니다:

    1. 가능하면 width 필드를 사용
    2. 가능하면 wpx 픽셀 너비를 사용
    3. 가능하면 wch 문자 수를 사용

    숫자 서식

    각 셀의 cell.w 포맷된 텍스트는 cell.v 및 cell.z 서식에서 생성됩니다. 서식이 지정되지 않으면 Excel의 General 서식이 사용됩니다. 서식은 문자열 또는 서식 테이블의 인덱스로 지정할 수 있습니다. 파서는 workbook.SSF에 숫자 서식 테이블을 채워야 합니다. 쓰기 함수는 테이블을 직렬화해야 합니다.

    사용자 지정 도구는 로컬 테이블에 사용된 각 서식 문자열이 테이블 어딘가에 있는지 확인해야 합니다. Excel 규칙은 사용자 지정 서식이 인덱스 164에서 시작하도록 요구합니다. 다음 예제는 처음부터 사용자 지정 서식을 만듭니다:

    사용자 지정 서식이 있는 새 워크시트 (클릭하여 표시)```js var wb = { SheetNames: ["Sheet1"], Sheets: { Sheet1: { "!ref":"A1:C1", A1: { t:"n", v:10000 }, // <-- General format B1: { t:"n", v:10000, z: "0%" }, // <-- Builtin format C1: { t:"n", v:10000, z: "\"T\"\ #0.00" } // <-- Custom format } } } ```

    규칙은 Excel에서 사용자 지정 숫자 형식을 표시하는 방식과 약간 다릅니다. 특히, 리터럴 문자는 큰따옴표로 묶거나 백슬래시를 앞에 붙여야 합니다. 자세한 내용은 Excel 설명서 문서 Create or delete a custom number format 또는 ECMA-376 18.8.31 (Number Formats)을 참조하세요.

    기본 숫자 형식 (표시하려면 클릭)

    기본 형식은 ECMA-376 18.8.30에 나열되어 있습니다:

    ID형식
    0General
    10
    20.00
    3#,##0
    4#,##0.00
    90%
    100.00%
    110.00E+00
    12# ?/?
    13# ??/??
    14m/d/yy (아래 참조)
    15d-mmm-yy
    16d-mmm
    17mmm-yy
    18h:mm AM/PM
    19h:mm:ss AM/PM
    20h:mm
    21h:mm:ss
    22m/d/yy h:mm
    37#,##0 ;(#,##0)
    38#,##0 ;[Red](#,##0)
    39#,##0.00;(#,##0.00)
    40

    형식 14(m/d/yy)는 Excel에서 지역화됩니다. 파일에 해당 숫자 형식이 지정되어 있어도 시스템 설정에 따라 다르게 표시됩니다. 파일을 생산하는 쪽과 소비하는 쪽이 같은 로케일에 있으면 의미가 있지만, 인터넷을 통해서는 항상 그런 것은 아닙니다. 이 모호함을 해결하기 위해 구문 분석 함수는 dateNF 옵션을 사용하여 해당 특정 형식 문자열의 해석을 재정의할 수 있습니다.

    하이퍼링크

    형식 지원 (표시하려면 클릭)

    셀 하이퍼링크: XLSX/M, XLSB, BIFF8 XLS, XLML, ODS

    툴팁: XLSX/M, XLSB, BIFF8 XLS, XLML

    하이퍼링크는 셀 객체의 l 키에 저장됩니다. 하이퍼링크 객체의 Target 필드는 링크의 대상(URI 프래그먼트 포함)입니다. 툴팁은 Tooltip 필드에 저장되며 마우스를 텍스트 위로 이동하면 표시됩니다.

    예를 들어, 다음 코드 조각은 셀 A3에서 https://sheetjs.com으로, 팁 "Find us @ SheetJS.com!"과 함께 링크를 만듭니다:```js ws['A1'].l = { Target:"https://sheetjs.com", Tooltip:"Find us @ SheetJS.com!" };

    root@kitploit:~
    Excel은 하이퍼링크에 자동으로 스타일을 적용하지 않는다는 점에 유의하세요. 일반적으로
    일반 텍스트로 표시됩니다.
    
    _원격 링크_
    
    HTTP / HTTPS 링크는 직접 사용할 수 있습니다:```js
    ws['A2'].l = { Target:"https://docs.sheetjs.com/#hyperlinks" };
    ws['A3'].l = { Target:"http://localhost:7262/yes_localhost_works" };
    

    Excel은 또한 제목 줄이 있는 mailto 이메일 링크를 지원합니다:```js ws['A4'].l = { Target:"mailto:[email protected]" }; ws['A5'].l = { Target:"mailto:[email protected]?subject=Test Subject" };

    root@kitploit:~
    _로컬 링크_
    
    절대 경로에 대한 링크는 `file://` URI 스킴을 사용해야 합니다:```js
    ws['B1'].l = { Target:"file:///SheetJS/t.xlsx" }; /* Link to /SheetJS/t.xlsx */
    ws['B2'].l = { Target:"file:///c:/SheetJS.xlsx" }; /* Link to c:\SheetJS.xlsx */
    

    상대 경로에 대한 링크는 스킴 없이 지정할 수 있습니다:```js ws['B3'].l = { Target:"SheetJS.xlsb" }; /* Link to SheetJS.xlsb / ws['B4'].l = { Target:"../SheetJS.xlsm" }; / Link to ../SheetJS.xlsm */

    root@kitploit:~
    상대 경로는 SpreadsheetML 2003 형식에서 정의되지 않은 동작을 가집니다.  Excel
    2019는 `..\` 부모 표시를 두 단계 위로 취급합니다.
    
    _내부 링크_
    
    대상이 동일 통합 문서의 셀, 범위 또는 정의된 이름인 링크("내부 링크")는 앞에 해시 문자로 표시됩니다:```js
    ws['C1'].l = { Target:"#E2" }; /* Link to cell E2 */
    ws['C2'].l = { Target:"#Sheet2!E2" }; /* Link to cell E2 in sheet Sheet2 */
    ws['C3'].l = { Target:"#SomeDefinedName" }; /* Link to Defined Name */
    

    셀 주석

    셀 주석은 셀 객체의 c 배열에 저장되는 객체입니다. 실제 주석 내용은 작성자를 기준으로 블록으로 나뉩니다. 각 주석 객체의 a 필드는 작성자, t 필드는 일반 텍스트 표현입니다.

    예를 들어, 다음 스니펫은 셀 A1에 셀 주석을 추가합니다:```js if(!ws.A1.c) ws.A1.c = []; ws.A1.c.push({a:"SheetJS", t:"I'm a little comment, short and stout!"});

    root@kitploit:~
    참고: XLSB는 작성자 이름에 54자 제한을 적용합니다. 54자를 초과하는
    이름은 다른 형식에 문제를 일으킬 수 있습니다.
    
    주석을 일반적으로 숨김 처리하려면 `hidden` 속성을 설정하세요:```js
    if(!ws.A1.c) ws.A1.c = [];
    ws.A1.c.push({a:"SheetJS", t:"This comment is visible"});
    
    if(!ws.A2.c) ws.A2.c = [];
    ws.A2.c.hidden = true;
    ws.A2.c.push({a:"SheetJS", t:"This comment will be hidden"});
    

    스레드형 댓글

    Excel 365에서 도입된 스레드형 댓글은 작성자 메타데이터와 부모 참조가 포함된 일반 텍스트 댓글 조각입니다. XLSX 및 XLSB에서 지원됩니다.

    댓글을 스레드형으로 표시하려면 각 댓글 부분에 T 속성이 true여야 합니다.```js if(!ws.A1.c) ws.A1.c = []; ws.A1.c.push({a:"SheetJS", t:"This is not threaded"});

    if(!ws.A2.c) ws.A2.c = []; ws.A2.c.hidden = true; ws.A2.c.push({a:"SheetJS", t:"This is threaded", T: true}); ws.A2.c.push({a:"JSSheet", t:"This is also threaded", T: true});

    root@kitploit:~
    스레드의 작성자와 연결된 Active Directory 또는 Office 365 메타데이터는 없습니다.
    
    #### 시트 표시 여부
    
    Excel에서는 하단 탭 막대에서 시트를 숨길 수 있습니다.  시트 데이터는 파일에 저장되지만
    UI에서는 쉽게 확인할 수 없습니다.  일반적으로 숨겨진 시트는 "숨기기 취소" 메뉴에서
    표시됩니다.  Excel에는 메뉴에서 표시할 수 없는 "매우 숨김" 시트도 있습니다.
    이 시트는 VB 편집기에서만 접근할 수 있습니다!
    
    표시 여부 설정은 시트 props 배열의 `Hidden` 속성에 저장됩니다.
    
    <details>
      <summary><b>자세한 내용</b> (클릭하여 표시)</summary>
    
    | 값 | 정의 |
    |:-----:|:------------|
    |   0   | 표시됨      |
    |   1   | 숨김        |
    |   2   | 매우 숨김   |
    
    다음 파일을 사용하여 <https://rawgit.com/SheetJS/test_files/HEAD/sheet_visibility.xlsx>:```js
    > wb.Workbook.Sheets.map(function(x) { return [x.name, x.Hidden] })
    [ [ 'Visible', 0 ], [ 'Hidden', 1 ], [ 'VeryHidden', 2 ] ]
    

    Excel이 아닌 형식은 Very Hidden 상태를 지원하지 않습니다. 시트가 표시되는지 테스트하는 가장 좋은 방법은 Hidden 속성이 논리적으로 참인지 확인하는 것입니다:```js

    wb.Workbook.Sheets.map(function(x) { return [x.name, !x.Hidden] }) [ [ 'Visible', true ], [ 'Hidden', false ], [ 'VeryHidden', false ] ]

    root@kitploit:~
    </details>
    
    #### VBA 및 매크로
    
    VBA 매크로는 `bookVBA` 옵션이 `true`일 때 통합 문서 객체의
    `vbaraw` 속성으로 노출되는 특수 데이터 blob에 저장됩니다. 이들은
    `XLSM`, `XLSB`, `BIFF8 XLS` 형식에서 지원됩니다. 지원되는 형식
    작성기는 통합 문서에 데이터 blob이 존재하면 자동으로 삽입하고 워크시트 이름과
    연결합니다.
    
    <details>
    	<summary><b>사용자 지정 코드 이름</b> (클릭하여 표시)</summary>
    
    통합 문서 코드 이름은 `wb.Workbook.WBProps.CodeName`에 저장됩니다. 기본적으로
    Excel은 `ThisWorkbook` 또는 `DieseArbeitsmappe` 같은 번역된 문구를 작성합니다.
    워크시트 및 차트 시트의 코드 이름은 `wb.Workbook.Sheets[i].CodeName`의
    워크시트 속성 객체에 있습니다. 매크로 시트와 대화 상자 시트는 무시됩니다.
    
    읽기 및 쓰기 도구는 코드 이름을 보존하지만, VBA blob을 다른 통합 문서에 추가할 때
    수동으로 설정해야 합니다.
    
    </details>
    
    <details>
    	<summary><b>매크로 시트</b> (클릭하여 표시)</summary>
    
    이전 버전의 Excel에서는 자동화 명령을 저장하는 비VBA "macrosheet" 시트 유형도
    지원했습니다. 이러한 시트는 `!type` 속성이 `"macro"`로 설정된 객체로
    노출됩니다.
    
    </details>
    
    <details>
    	<summary><b>통합 문서에서 매크로 감지</b> (클릭하여 표시)</summary>
    
    `vbaraw` 필드는 매크로가 있는 경우에만 설정되므로 테스트는 간단합니다.```js
    function wb_has_macro(wb/*:workbook*/)/*:boolean*/ {
    	if(!!wb.vbaraw) return true;
    	const sheets = wb.SheetNames.map((n) => wb.Sheets[n]);
    	return sheets.some((ws) => !!ws && ws['!type']=='macro');
    }
    
    Option NameDefaultDescription
    type입력 데이터 인코딩 (아래 입력 유형 참조)
    rawfalsetrue이면 일반 텍스트 구문 분석이 값을 구문 분석하지 않습니다 **
    codepage지정된 경우 적절할 때 코드 페이지를 사용합니다 **
    cellFormulatrue수식을 .f 필드에 저장합니다
    cellHTMLtrue리치 텍스트를 구문 분석하고 HTML을 .h 필드에 저장합니다
    cellNFfalse숫자 형식 문자열을 .z 필드에 저장합니다
    cellStylesfalse스타일/테마 정보를 .s 필드에 저장합니다
    cellTexttrue생성된 형식화 텍스트를 .w 필드에 저장합니다
    cellDatesfalse날짜를 유형 d로 저장합니다 (기본값은 n)
    dateNF지정된 경우 날짜 코드 14에 문자열을 사용합니다 **
    sheetStubsfalse스텁 셀에 대해 유형 z의 셀 객체를 생성합니다
    sheetRows0>0이면 처음 sheetRows 행을 읽습니다 **
    bookDepsfalsetrue이면 계산 체인을 구문 분석합니다
    bookFilesfalsetrue이면 원시 파일을 book 객체에 추가합니다 **
    bookPropsfalsetrue이면 book 메타데이터를 얻을 수 있을 만큼만 구문 분석합니다 **
    bookSheetsfalsetrue이면 시트 이름을 얻을 수 있을 만큼만 구문 분석합니다
    bookVBAfalsetrue이면 VBA blob을 vbaraw 필드에 복사합니다 **
    password""정의되어 있고 파일이 암호화된 경우 암호를 사용합니다 **
    WTFfalsetrue이면 예기치 않은 파일 기능에서 오류를 발생시킵니다 **
    sheets지정된 경우 지정된 시트만 구문 분석합니다 **
    PRNfalsetrue이면 PRN 파일 구문 분석을 허용합니다 **
    xlfnfalsetrue이면 수식에서 _xlfn. 접두사를 유지합니다 **
    FSDSV 필드 구분 기호 재정의
  • 기본적으로 모든 워크시트가 구문 분석됩니다. sheets는 입력 유형에 따라 제한합니다:
    • number: 구문 분석할 워크시트의 0부터 시작하는 인덱스 (0은 첫 번째 워크시트)
    • string: 구문 분석할 워크시트의 이름 (대소문자 구분 안 함)
    • 여러 워크시트를 선택하려는 숫자 및 문자열의 배열.
  • bookVBA는 원시 VBA CFB 객체를 노출할 뿐입니다. 데이터를 구문 분석하지는 않습니다. XLSM 및 XLSB는 VBA CFB 객체를 xl/vbaProject.bin에 저장합니다. BIFF8 XLS는 VBA 항목을 핵심 Workbook 항목과 함께 섞어 놓으므로, 라이브러리는 XLS CFB 컨테이너에서 새로운 XLSB 호환 blob을 생성합니다.
  • codepage는 CodePage 레코드가 없는 BIFF2 - BIFF5 파일과 type:"binary"에서 BOM이 없는 CSV 파일에 적용됩니다. BIFF8 XLS는 항상 1200을 기본값으로 사용합니다.
  • PRN은 공통 구분 문자가 없는 텍스트 파일의 구문 분석에 영향을 줍니다.
  • 현재 XOR 암호화만 지원됩니다. 다른 암호화 방법을 사용하는 파일의 경우 지원되지 않는 오류가 발생합니다.
  • 최신 Excel 함수는 사용자에게 숨겨진 _xlfn. 접두사와 함께 직렬화됩니다. SheetJS는 일반적으로 _xlfn.을 제거합니다. xlfn 옵션은 이를 유지합니다.
  • WTF는 주로 개발용입니다. 기본적으로 파서는 개별 워크시트의 읽기 오류를 억제하여 제대로 구문 분석되는 워크시트에서 읽을 수 있게 합니다. WTF:true로 설정하면 해당 오류가 발생하도록 강제합니다.
  • type예상 입력
    "base64"string: 파일의 Base64 인코딩
    "binary"string: 이진 문자열 (바이트 n은 data.charCodeAt(n))
    "string"string: JS 문자열 (문자는 UTF8로 해석됨)
    "buffer"nodejs Buffer
    "array"array: 8비트 부호 없는 정수 배열 (바이트 n은 data[n])
    "file"string: 읽을 파일의 경로 (nodejs 전용)
    Byte 0원시 파일 유형스프레드시트 유형
    0xD0CFB 컨테이너BIFF 5/8 또는 보호된 XLSX/XLSB 또는 WQ3/QPW 또는 XLR
    0x09BIFF 스트림BIFF 2/3/4/5
    0x3CXML/HTMLSpreadsheetML / Flat ODS / UOS1 / HTML / 일반 텍스트
    0x50ZIP 아카이브XLSB 또는 XLSX/M 또는 ODS 또는 UOS2 또는 NUMBERS 또는 텍스트
    0x49일반 텍스트SYLK 또는 일반 텍스트
    0x54일반 텍스트DIF 또는 일반 텍스트
    0xEFUTF8 인코딩SpreadsheetML / Flat ODS / UOS1 / HTML / 일반 텍스트
    0xFFUTF16 인코딩SpreadsheetML / Flat ODS / UOS1 / HTML / 일반 텍스트
    0x00레코드 스트림Lotus WK* 또는 Quattro Pro 또는 일반 텍스트
    0x7B일반 텍스트RTF 또는 일반 텍스트
    0x0A일반 텍스트SpreadsheetML / Flat ODS / UOS1 / HTML / 일반 텍스트
    0x0D일반 텍스트SpreadsheetML / Flat ODS / UOS1 / HTML / 일반 텍스트
    0x20일반 텍스트SpreadsheetML / Flat ODS / UOS1 / HTML / 일반 텍스트

    DBF 파일은 첫 번째 바이트와 세 번째 및 네 번째 바이트 (파일 날짜의 월과 일에 해당)를 기반으로 감지됩니다.

    Works for Windows 파일은 유형 0xFF의 BOF 레코드를 기반으로 감지됩니다.

    일반 텍스트 형식 추측은 다음 우선순위를 따릅니다:

    형식테스트
    XML<?xml이 처음 1024자에 나타남
    HTML<로 시작하고 HTML 태그가 처음 1024자에 나타남 *
    XML<로 시작하고 첫 번째 태그가 유효함
    RTF{\rt로 시작함
    DSV/sep=.$/로 시작하며, 구분 기호는 지정된 문자임
    DSV처음 1024자에서 따옴표 없는 `
    DSV처음 1024자에서 따옴표 없는 ; 문자가 \t 또는 ,보다 많음
    TSV처음 1024자에서 따옴표 없는 \t 문자가 , 문자보다 많음
    CSV처음 1024자 중 하나가 쉼표 ","임
    ETHsocialcalc:version:로 시작함
    PRNPRN 옵션이 true로 설정됨
    CSV(대체)
    • HTML 태그에는 다음이 포함됩니다: html, table, head, meta, script, style, div
    #,##0.00;[Red](#,##0.00)
    45mm:ss
    46[h]:mm:ss
    47mmss.0
    48##0.0E+0
    49@