Skip to content

8. 셀 병합

여러 셀을 하나로 병합하거나 해제하는 기능을 다룹니다.

merge_cells(sheet, top_left, bottom_right) / mergeCells(sheet, topLeft, bottomRight)

셀 범위를 병합합니다.

Rust:

rust
wb.merge_cells("Sheet1", "A1", "D1")?;

TypeScript:

typescript
wb.mergeCells("Sheet1", "A1", "D1");

unmerge_cell(sheet, reference) / unmergeCell(sheet, reference)

병합을 해제합니다. 참조는 "A1:D1" 형식의 전체 범위 문자열입니다.

Rust:

rust
wb.unmerge_cell("Sheet1", "A1:D1")?;

TypeScript:

typescript
wb.unmergeCell("Sheet1", "A1:D1");

get_merge_cells(sheet) / getMergeCells(sheet)

시트의 모든 병합 범위를 반환합니다.

Rust:

rust
let merged: Vec<String> = wb.get_merge_cells("Sheet1")?;
// ["A1:D1", "B3:C5"]

TypeScript:

typescript
const merged: string[] = wb.getMergeCells("Sheet1");

9. 하이퍼링크

셀에 하이퍼링크를 설정, 조회, 삭제하는 기능을 다룹니다. 외부 URL, 내부 시트 참조, 이메일의 세 가지 유형을 지원합니다.

셀에 하이퍼링크를 설정합니다.

Rust:

rust
use sheetkit::hyperlink::HyperlinkType;

// External URL
wb.set_cell_hyperlink(
    "Sheet1", "A1",
    HyperlinkType::External("https://example.com".into()),
    Some("Example Site"),  // display text
    Some("Click here"),    // tooltip
)?;

// Internal sheet reference
wb.set_cell_hyperlink(
    "Sheet1", "A2",
    HyperlinkType::Internal("Sheet2!A1".into()),
    None, None,
)?;

// Email
wb.set_cell_hyperlink(
    "Sheet1", "A3",
    HyperlinkType::Email("mailto:user@example.com".into()),
    Some("Send email"), None,
)?;

TypeScript:

typescript
// External URL
wb.setCellHyperlink("Sheet1", "A1", {
    linkType: "external",
    target: "https://example.com",
    display: "Example Site",
    tooltip: "Click here",
});

// Internal sheet reference
wb.setCellHyperlink("Sheet1", "A2", {
    linkType: "internal",
    target: "Sheet2!A1",
});

// Email
wb.setCellHyperlink("Sheet1", "A3", {
    linkType: "email",
    target: "mailto:user@example.com",
    display: "Send email",
});

셀의 하이퍼링크 정보를 조회합니다. 없으면 None / null을 반환합니다.

Rust:

rust
if let Some(info) = wb.get_cell_hyperlink("Sheet1", "A1")? {
    // info.link_type, info.display, info.tooltip
}

TypeScript:

typescript
const info = wb.getCellHyperlink("Sheet1", "A1");
if (info) {
    console.log(info.linkType, info.target, info.display, info.tooltip);
}

JsHyperlinkInfo 구조:

typescript
interface JsHyperlinkInfo {
  linkType: string;     // "external" | "internal" | "email"
  target: string;       // URL, sheet reference, or email address
  display?: string;     // display text
  tooltip?: string;     // tooltip text
}

셀의 하이퍼링크를 삭제합니다.

Rust:

rust
wb.delete_cell_hyperlink("Sheet1", "A1")?;

TypeScript:

typescript
wb.deleteCellHyperlink("Sheet1", "A1");

외부/이메일 하이퍼링크는 워크시트 .rels 파일에 저장되고, 내부 하이퍼링크는 location 속성만 사용합니다.


10. 차트

43가지 차트 유형을 지원합니다. add_chart로 시트에 차트를 추가하며, 셀 범위로 위치와 크기를 지정합니다.

add_chart(sheet, from_cell, to_cell, config) / addChart(sheet, fromCell, toCell, config)

시트에 차트를 추가합니다. from_cell은 차트의 왼쪽 상단, to_cell은 오른쪽 하단 위치를 나타냅니다.

Rust:

rust
use sheetkit::chart::*;

wb.add_chart("Sheet1", "E1", "L15", &ChartConfig {
    chart_type: ChartType::Col,
    title: Some("Sales Report".into()),
    series: vec![
        ChartSeries {
            name: "Revenue".into(),
            categories: "Sheet1!$A$2:$A$6".into(),
            values: "Sheet1!$B$2:$B$6".into(),
            x_values: None,
            bubble_sizes: None,
        },
    ],
    show_legend: true,
    view_3d: None,
})?;

TypeScript:

typescript
wb.addChart("Sheet1", "E1", "L15", {
    chartType: "col",
    title: "Sales Report",
    series: [
        {
            name: "Revenue",
            categories: "Sheet1!$A$2:$A$6",
            values: "Sheet1!$B$2:$B$6",
        },
    ],
    showLegend: true,
});

ChartSeries 구조

속성타입필수설명
namestringO시리즈 이름 또는 셀 참조
categoriesstringO카테고리 데이터 범위
valuesstringO값 데이터 범위
x_values / xValuesstring?XScatter/Bubble용 X 축 범위
bubble_sizes / bubbleSizesstring?XBubble 차트용 크기 범위

View3DConfig 구조

3D 차트의 시점을 설정합니다. 3D 차트 유형에서는 지정하지 않으면 자동으로 기본값이 적용됩니다.

속성타입설명
rot_x / rotXi32? / number?X축 회전 각도
rot_y / rotYi32? / number?Y축 회전 각도
depth_percent / depthPercentu32? / number?깊이 비율 (100 = 기본)
right_angle_axes / rightAngleAxesbool? / boolean?직각 축 사용 여부
perspectiveu32? / number?원근 각도

차트 유형 전체 목록 (41종)

세로 막대 (Column) 차트

타입 문자열Rust Enum설명
colChartType::Col세로 막대
colStackedChartType::ColStacked누적 세로 막대
colPercentStackedChartType::ColPercentStacked100% 누적 세로 막대
col3DChartType::Col3D3D 세로 막대
col3DStackedChartType::Col3DStacked3D 누적 세로 막대
col3DPercentStackedChartType::Col3DPercentStacked3D 100% 누적 세로 막대

가로 막대 (Bar) 차트

타입 문자열Rust Enum설명
barChartType::Bar가로 막대
barStackedChartType::BarStacked누적 가로 막대
barPercentStackedChartType::BarPercentStacked100% 누적 가로 막대
bar3DChartType::Bar3D3D 가로 막대
bar3DStackedChartType::Bar3DStacked3D 누적 가로 막대
bar3DPercentStackedChartType::Bar3DPercentStacked3D 100% 누적 가로 막대

꺾은선 (Line) 차트

타입 문자열Rust Enum설명
lineChartType::Line꺾은선
lineStackedChartType::LineStacked누적 꺾은선
linePercentStackedChartType::LinePercentStacked100% 누적 꺾은선
line3DChartType::Line3D3D 꺾은선

원형 (Pie) 차트

타입 문자열Rust Enum설명
pieChartType::Pie원형
pie3DChartType::Pie3D3D 원형
doughnutChartType::Doughnut도넛형

영역 (Area) 차트

타입 문자열Rust Enum설명
areaChartType::Area영역
areaStackedChartType::AreaStacked누적 영역
areaPercentStackedChartType::AreaPercentStacked100% 누적 영역
area3DChartType::Area3D3D 영역
area3DStackedChartType::Area3DStacked3D 누적 영역
area3DPercentStackedChartType::Area3DPercentStacked3D 100% 누적 영역

분산형 (Scatter) 차트

타입 문자열Rust Enum설명
scatterChartType::Scatter분산형 (표식만)
scatterSmoothChartType::ScatterSmooth부드러운 선
scatterStraightChartType::ScatterLine직선

방사형 (Radar) 차트

타입 문자열Rust Enum설명
radarChartType::Radar방사형
radarFilledChartType::RadarFilled채워진 방사형
radarMarkerChartType::RadarMarker표식이 있는 방사형

주식 (Stock) 차트

타입 문자열Rust Enum설명
stockHLCChartType::StockHLC고가-저가-종가
stockOHLCChartType::StockOHLC시가-고가-저가-종가
stockVHLCChartType::StockVHLC거래량-고가-저가-종가
stockVOHLCChartType::StockVOHLC거래량-시가-고가-저가-종가

기타 차트

타입 문자열Rust Enum설명
bubbleChartType::Bubble거품형
surfaceChartType::Surface표면형
surfaceTopChartType::Surface3D3D 표면형
surfaceWireframeChartType::SurfaceWireframe와이어프레임 표면형
surfaceTopWireframeChartType::SurfaceWireframe3D3D 와이어프레임 표면형

콤보 (Combo) 차트

타입 문자열Rust Enum설명
colLineChartType::ColLine세로 막대 + 꺾은선
colLineStackedChartType::ColLineStacked누적 세로 막대 + 꺾은선
colLinePercentStackedChartType::ColLinePercentStacked100% 누적 세로 막대 + 꺾은선

11. 이미지

시트에 이미지를 삽입하는 기능을 다룹니다. 11가지 형식을 지원합니다: PNG, JPEG, GIF, BMP, ICO, TIFF, SVG, EMF, EMZ, WMF, WMZ.

add_image(sheet, config) / addImage(sheet, config)

시트에 이미지를 추가합니다.

Rust:

rust
use sheetkit::image::{ImageConfig, ImageFormat};

let data = std::fs::read("logo.png")?;
wb.add_image("Sheet1", &ImageConfig {
    data,
    format: ImageFormat::Png,
    from_cell: "A1".into(),
    width_px: 200,
    height_px: 100,
})?;

TypeScript:

typescript
import { readFileSync } from "fs";

const data = readFileSync("logo.png");
wb.addImage("Sheet1", {
    data: data,
    format: "png",
    fromCell: "A1",
    widthPx: 200,
    heightPx: 100,
});

ImageConfig 구조

속성타입설명
dataVec<u8> / Buffer이미지 바이너리 데이터
formatImageFormat / string11가지 형식 지원 (이미지 참조)
from_cell / fromCellstring이미지 시작 위치 셀
width_px / widthPxu32 / number너비 (픽셀)
height_px / heightPxu32 / number높이 (픽셀)

12. 데이터 유효성 검사

셀에 입력 제한 규칙을 설정하여 사용자 입력을 검증하는 기능을 다룹니다.

add_data_validation / addDataValidation

데이터 유효성 검사 규칙을 추가합니다.

Rust:

rust
use sheetkit::validation::*;

// Dropdown list
wb.add_data_validation("Sheet1", &DataValidationConfig {
    sqref: "A1:A100".into(),
    validation_type: ValidationType::List,
    operator: None,
    formula1: Some("\"Option1,Option2,Option3\"".into()),
    formula2: None,
    allow_blank: true,
    error_style: Some(ErrorStyle::Stop),
    error_title: Some("Invalid".into()),
    error_message: Some("Select from the list".into()),
    prompt_title: Some("Selection".into()),
    prompt_message: Some("Choose an option".into()),
    show_input_message: true,
    show_error_message: true,
})?;

// Number range
wb.add_data_validation("Sheet1", &DataValidationConfig {
    sqref: "B1:B100".into(),
    validation_type: ValidationType::Whole,
    operator: Some(ValidationOperator::Between),
    formula1: Some("1".into()),
    formula2: Some("100".into()),
    allow_blank: true,
    error_style: Some(ErrorStyle::Stop),
    error_title: None,
    error_message: Some("Enter a number between 1 and 100".into()),
    prompt_title: None,
    prompt_message: None,
    show_input_message: false,
    show_error_message: true,
})?;

TypeScript:

typescript
// Dropdown list
wb.addDataValidation("Sheet1", {
    sqref: "A1:A100",
    validationType: "list",
    formula1: '"Option1,Option2,Option3"',
    allowBlank: true,
    errorStyle: "stop",
    errorTitle: "Invalid",
    errorMessage: "Select from the list",
    promptTitle: "Selection",
    promptMessage: "Choose an option",
    showInputMessage: true,
    showErrorMessage: true,
});

// Number range
wb.addDataValidation("Sheet1", {
    sqref: "B1:B100",
    validationType: "whole",
    operator: "between",
    formula1: "1",
    formula2: "100",
    errorMessage: "Enter a number between 1 and 100",
    showErrorMessage: true,
});

Node.js에서 validationType은 지원되는 값(none, list, whole, decimal, date, time, textLength, custom)만 허용되며, 지원되지 않는 값은 오류를 반환합니다. sqref는 유효한 셀 범위여야 합니다(예: "A1:B10"). none 이외의 타입에는 formula1이 필수이며, between/notBetween 연산자에는 formula2도 필수입니다.

get_data_validations / getDataValidations

시트의 모든 유효성 검사 규칙을 반환합니다.

Rust:

rust
let validations = wb.get_data_validations("Sheet1")?;

TypeScript:

typescript
const validations = wb.getDataValidations("Sheet1");

remove_data_validation / removeDataValidation

sqref로 유효성 검사를 제거합니다.

Rust:

rust
wb.remove_data_validation("Sheet1", "A1:A100")?;

TypeScript:

typescript
wb.removeDataValidation("Sheet1", "A1:A100");

유효성 검사 유형 (8종)

설명
none제한 없음 (프롬프트/메시지만 표시)
whole정수
decimal소수
list드롭다운 목록
date날짜
time시각
textLength텍스트 길이
custom사용자 정의 수식

연산자 (8종)

TypeScript 입력은 대소문자를 구분하지 않으며, 출력은 OOXML 규격에 맞는 camelCase를 사용합니다:

설명
between사이 (범위)
notBetween사이 아님
equal같음
notEqual같지 않음
lessThan미만
lessThanOrEqual이하
greaterThan초과
greaterThanOrEqual이상

오류 스타일 (3종)

설명
stop입력 차단 (기본)
warning경고 (사용자가 무시 가능)
information정보 (사용자가 무시 가능)

13. 코멘트

셀에 메모(코멘트)를 추가, 조회, 삭제하는 기능을 다룹니다.

코멘트를 추가하면 SheetKit이 자동으로 VML(Vector Markup Language) 드로잉 파트(xl/drawings/vmlDrawingN.vml)와 워크시트 XML의 <legacyDrawing> 참조를 생성합니다. 이를 통해 Excel UI에서 코멘트 팝업 상자가 올바르게 렌더링됩니다.

기존 VML 코멘트 드로잉이 포함된 워크북을 열면 SheetKit이 저장/열기 사이클을 통해 VML 파트를 보존합니다. 시트의 모든 코멘트가 제거되면 관련 VML 파트와 관계가 자동으로 정리됩니다.

add_comment / addComment

셀에 코멘트를 추가합니다.

Rust:

rust
use sheetkit::comment::CommentConfig;

wb.add_comment("Sheet1", &CommentConfig {
    cell: "A1".into(),
    author: "Admin".into(),
    text: "Review this value".into(),
})?;

TypeScript:

typescript
wb.addComment("Sheet1", {
    cell: "A1",
    author: "Admin",
    text: "Review this value",
});

get_comments / getComments

시트의 모든 코멘트를 반환합니다.

Rust:

rust
let comments = wb.get_comments("Sheet1")?;
for c in &comments {
    println!("{}: {} - {}", c.cell, c.author, c.text);
}

TypeScript:

typescript
const comments = wb.getComments("Sheet1");
for (const c of comments) {
    console.log(`${c.cell}: ${c.author} - ${c.text}`);
}

remove_comment / removeComment

셀의 코멘트를 삭제합니다.

Rust:

rust
wb.remove_comment("Sheet1", "A1")?;

TypeScript:

typescript
wb.removeComment("Sheet1", "A1");

VML 호환성

Excel은 코멘트 노트 상자를 렌더링하기 위해 VML(Vector Markup Language)을 사용합니다. SheetKit은 다음을 자동으로 처리합니다:

  • 새 코멘트 생성 시 최소한의 VML 드로잉 파트 생성
  • 디스크에서 열린 워크북의 기존 VML 파트 보존
  • 워크시트 XML에 <legacyDrawing> 관계 참조 연결
  • VML 파트에 대한 적절한 콘텐츠 타입 항목 추가
  • 시트의 모든 코멘트가 제거될 때 VML 파트 및 관계 정리

추가적인 API 호출이 필요하지 않습니다. VML 처리는 사용자에게 투명하게 수행됩니다.


14. 자동 필터

데이터 범위에 자동 필터를 설정하거나 제거하는 기능을 다룹니다.

set_auto_filter(sheet, range) / setAutoFilter(sheet, range)

셀 범위에 자동 필터를 설정합니다.

Rust:

rust
wb.set_auto_filter("Sheet1", "A1:D10")?;

TypeScript:

typescript
wb.setAutoFilter("Sheet1", "A1:D10");

remove_auto_filter(sheet) / removeAutoFilter(sheet)

시트의 자동 필터를 제거합니다.

Rust:

rust
wb.remove_auto_filter("Sheet1")?;

TypeScript:

typescript
wb.removeAutoFilter("Sheet1");

15. 조건부 서식

셀 값이나 수식에 따라 자동으로 서식을 적용하는 17가지 규칙 유형을 지원합니다.

set_conditional_format / setConditionalFormat

셀 범위에 조건부 서식 규칙을 설정합니다.

Rust:

rust
use sheetkit::conditional::*;
use sheetkit::style::*;

// cellIs rule
wb.set_conditional_format("Sheet1", "A1:A100", &[
    ConditionalFormatRule {
        rule_type: ConditionalFormatType::CellIs {
            operator: CfOperator::GreaterThan,
            formula: "90".into(),
            formula2: None,
        },
        format: Some(ConditionalStyle {
            font: Some(FontStyle {
                bold: true,
                color: Some(StyleColor::Rgb("#006100".into())),
                ..Default::default()
            }),
            fill: Some(FillStyle {
                pattern: PatternType::Solid,
                fg_color: Some(StyleColor::Rgb("#C6EFCE".into())),
                bg_color: None,
            }),
            border: None,
            num_fmt: None,
        }),
        priority: Some(1),
        stop_if_true: false,
    },
])?;

TypeScript:

typescript
// cellIs rule
wb.setConditionalFormat("Sheet1", "A1:A100", [
    {
        ruleType: "cellIs",
        operator: "greaterThan",
        formula: "90",
        format: {
            font: { bold: true, color: "#006100" },
            fill: { pattern: "solid", fgColor: "#C6EFCE" },
        },
        priority: 1,
    },
]);

조건부 서식 예제

colorScale (색상 스케일)

typescript
wb.setConditionalFormat("Sheet1", "B1:B50", [
    {
        ruleType: "colorScale",
        minType: "min",
        minColor: "FFF8696B",  // red
        midType: "percentile",
        midValue: "50",
        midColor: "FFFFEB84",  // yellow
        maxType: "max",
        maxColor: "FF63BE7B",  // green
    },
]);

dataBar (데이터 막대)

typescript
wb.setConditionalFormat("Sheet1", "C1:C50", [
    {
        ruleType: "dataBar",
        barColor: "FF638EC6",
        showValue: true,
    },
]);

containsText (텍스트 포함)

typescript
wb.setConditionalFormat("Sheet1", "D1:D100", [
    {
        ruleType: "containsText",
        text: "Error",
        format: {
            font: { color: "#FF0000", bold: true },
        },
    },
]);

get_conditional_formats / getConditionalFormats

시트의 모든 조건부 서식 규칙을 반환합니다.

Rust:

rust
let formats = wb.get_conditional_formats("Sheet1")?;
// Vec<(String, Vec<ConditionalFormatRule>)>
// (sqref, rules)

TypeScript:

typescript
const formats = wb.getConditionalFormats("Sheet1");
// JsConditionalFormatEntry[]
for (const entry of formats) {
    console.log(`Range: ${entry.sqref}, Rules: ${entry.rules.length}`);
}

delete_conditional_format / deleteConditionalFormat

특정 셀 범위의 조건부 서식을 삭제합니다.

Rust:

rust
wb.delete_conditional_format("Sheet1", "A1:A100")?;

TypeScript:

typescript
wb.deleteConditionalFormat("Sheet1", "A1:A100");

규칙 유형 (18종)

규칙 유형설명필수 속성
cellIs셀 값 비교operator, formula, formula2(between용)
expression수식 결과 기반formula
colorScale색상 스케일minType/minColor, maxType/maxColor, midType/midColor(선택)
dataBar데이터 막대barColor, showValue
duplicateValues중복 값--
uniqueValues고유 값--
top10상위 N개rank, percent
bottom10하위 N개rank, percent
aboveAverage평균 이상/이하above, equalAverage
containsBlanks빈 셀 포함--
notContainsBlanks빈 셀 미포함--
containsErrors오류 포함--
notContainsErrors오류 미포함--
containsText텍스트 포함text
notContainsText텍스트 미포함text
beginsWith텍스트로 시작text
endsWith텍스트로 끝남text
expression사용자 정의 수식formula

CfValueType (색상 스케일/데이터 막대용)

설명
num숫자 값
percent백분율
min최소값
max최대값
percentile백분위수
formula수식

16. 테이블

테이블은 헤더, 스타일, 선택적 자동 필터가 포함된 구조화된 데이터 범위입니다. 테이블은 별도의 OOXML 파트(xl/tables/tableN.xml)로 저장되며 관계 및 콘텐츠 타입이 자동으로 연결됩니다.

add_table(sheet, config) / addTable(sheet, config)

시트에 테이블을 생성합니다. 테이블 이름은 워크북 전체에서 고유해야 합니다.

Rust:

rust
use sheetkit::table::{TableConfig, TableColumn};

let config = TableConfig {
    name: "Sales".to_string(),
    display_name: "Sales".to_string(),
    range: "A1:C10".to_string(),
    columns: vec![
        TableColumn { name: "Product".to_string(), totals_row_function: None, totals_row_label: None },
        TableColumn { name: "Quantity".to_string(), totals_row_function: None, totals_row_label: None },
        TableColumn { name: "Price".to_string(), totals_row_function: None, totals_row_label: None },
    ],
    show_header_row: true,
    style_name: Some("TableStyleMedium2".to_string()),
    auto_filter: true,
    ..TableConfig::default()
};
wb.add_table("Sheet1", &config)?;

TypeScript:

typescript
wb.addTable("Sheet1", {
    name: "Sales",
    displayName: "Sales",
    range: "A1:C10",
    columns: [
        { name: "Product" },
        { name: "Quantity" },
        { name: "Price" },
    ],
    showHeaderRow: true,
    styleName: "TableStyleMedium2",
    autoFilter: true,
});

get_tables(sheet) / getTables(sheet)

시트의 모든 테이블을 조회합니다.

Rust:

rust
let tables = wb.get_tables("Sheet1")?;
for t in &tables {
    println!("{}: {} ({})", t.name, t.range, t.columns.join(", "));
}

TypeScript:

typescript
const tables = wb.getTables("Sheet1");
for (const t of tables) {
    console.log(`${t.name}: ${t.range}`);
}

delete_table(sheet, name) / deleteTable(sheet, name)

시트에서 이름으로 테이블을 삭제합니다.

Rust:

rust
wb.delete_table("Sheet1", "Sales")?;

TypeScript:

typescript
wb.deleteTable("Sheet1", "Sales");

TableConfig

필드Rust 타입TS 타입설명
nameStringstring내부 테이블 이름 (워크북 내 고유)
display_nameStringstringUI에 표시되는 이름
rangeStringstring셀 범위 (예: "A1:D10")
columnsVec<TableColumn>TableColumn[]열 정의
show_header_rowboolboolean?헤더 행 표시 (기본값: true)
style_nameOption<String>string?테이블 스타일 (예: "TableStyleMedium2")
auto_filterboolboolean?자동 필터 사용 (기본값: true)
show_first_columnboolboolean?첫 번째 열 강조 (기본값: false)
show_last_columnboolboolean?마지막 열 강조 (기본값: false)
show_row_stripesboolboolean?행 줄무늬 표시 (기본값: true)
show_column_stripesboolboolean?열 줄무늬 표시 (기본값: false)

TableColumn

필드Rust 타입TS 타입설명
nameStringstring열 헤더 이름
totals_row_functionOption<String>string?합계 행 함수 (예: "sum", "count", "average")
totals_row_labelOption<String>string?합계 행 레이블 (첫 번째 열용)

TableInfo (get_tables 반환 타입)

필드Rust 타입TS 타입설명
nameStringstring테이블 이름
display_nameStringstring표시 이름
rangeStringstring셀 범위
show_header_rowboolboolean헤더 행 표시 여부
auto_filterboolboolean자동 필터 사용 여부
columnsVec<String>string[]열 헤더 이름 목록
style_nameOption<String>string | null테이블 스타일 이름

테이블 이름은 단일 시트가 아닌 워크북 전체에서 고유해야 합니다. 시트가 삭제되면 해당 시트의 모든 테이블이 자동으로 제거됩니다.


17. 데이터 변환 유틸리티 (Node.js 전용)

시트 데이터와 일반적인 형식(JSON, CSV, HTML) 간의 변환을 위한 편의 메서드입니다. TypeScript/Node.js 바인딩에서만 사용할 수 있습니다.

toJSON(sheet, options?)

시트를 객체 배열로 변환합니다. 각 객체는 첫 번째 행의 열 헤더를 키로 사용합니다.

typescript
const wb = await Workbook.open("data.xlsx");
const records = wb.toJSON("Sheet1");
// [{ Name: "Alice", Age: 30, City: "Seoul" }, ...]

// 옵션 사용
const records2 = wb.toJSON("Sheet1", { headerRow: 2, range: "A2:C100" });

toCSV(sheet, options?)

시트를 CSV 문자열로 변환합니다. 필요한 경우 값이 인용되며 쉼표로 구분됩니다.

typescript
const csv = wb.toCSV("Sheet1");
// "Name,Age,City\nAlice,30,Seoul\n..."

// 사용자 정의 구분자 사용
const tsv = wb.toCSV("Sheet1", { separator: "\t" });

toHTML(sheet, options?)

시트를 HTML <table> 문자열로 변환합니다. 모든 텍스트 내용은 XSS 안전합니다(HTML 이스케이프 처리됩니다).

typescript
const html = wb.toHTML("Sheet1");
// "<table><thead><tr><th>Name</th>..."

// CSS 클래스 적용
const html2 = wb.toHTML("Sheet1", { tableClass: "data-table" });

fromJSON(sheet, data, options?)

객체 배열을 시트에 씁니다. 키가 헤더 행이 되고 값이 데이터 행을 채웁니다.

typescript
const wb = new Workbook();
wb.fromJSON("Sheet1", [
    { Name: "Alice", Age: 30, City: "Seoul" },
    { Name: "Bob", Age: 25, City: "Busan" },
]);
await wb.save("output.xlsx");

// 옵션 사용
wb.fromJSON("Sheet1", data, { startCell: "B2", writeHeaders: true });

변환 옵션

ToJSONOptions:

필드타입기본값설명
headerRownumber1열 헤더로 사용할 행 번호 (1 기반)
rangestring?undefined특정 셀 범위로 제한

ToCSVOptions:

필드타입기본값설명
separatorstring","필드 구분자
lineEndingstring"\n"줄 바꿈 문자
escapeFormulasbooleanfalse=, +, -, @로 시작하는 셀에 탭 문자를 접두사로 추가하여 수식 삽입 공격을 방지합니다

ToHTMLOptions:

필드타입기본값설명
tableClassstring?undefined<table> 요소의 CSS 클래스
includeHeadersbooleantrue<thead> 섹션 포함 여부

FromJSONOptions:

필드타입기본값설명
startCellstring"A1"쓰기 시작할 왼쪽 상단 셀
writeHeadersbooleantrue객체 키를 헤더 행으로 작성

MIT / Apache-2.0 라이선스로 배포됩니다.