Skip to content

사용 예시

실제 프롬프트와 에이전트가 도구를 호출하는 과정을 카테고리별로 소개합니다. 각 예시에서 도구 호출, 파라미터, 응답 JSON을 함께 확인할 수 있습니다.


시작하기

스프레드시트를 처음 열었을 때 구조를 파악하는 단계입니다.

스프레드시트 탐색

"열려 있는 스프레드시트에 뭐가 있어?"

도구 호출:

json
get_active_workbook()

응답:

json
{
  "name": "매출현황_2025.xlsx",
  "path": "C:\\Users\\user\\Documents\\매출현황_2025.xlsx",
  "sheets": [
    { "name": "매출", "used_range": "$A$1:$H$120", "rows": 120, "columns": 8 },
    { "name": "비용", "used_range": "$A$1:$F$85", "rows": 85, "columns": 6 },
    { "name": "요약", "used_range": "$A$1:$D$15", "rows": 15, "columns": 4 }
  ],
  "active_sheet": "매출",
  "selection": {
    "address": "$A$1:$H$5",
    "sheet": "매출",
    "data": [["월", "지역", "제품", "수량", "단가", "매출액", "할인율", "순매출"]],
    "rows": 5,
    "columns": 8
  }
}

에이전트는 3개 시트의 크기와 사용 범위를 파악하고, 현재 선택 영역의 헤더를 통해 데이터 구조를 즉시 이해합니다.

선택한 데이터 요약

"내가 선택한 셀 데이터를 요약해줘"

도구 호출:

json
get_active_workbook()

응답:

json
{
  "name": "매출현황_2025.xlsx",
  "selection": {
    "address": "$B$3:$E$12",
    "sheet": "매출",
    "data": [
      ["서울", "노트북", 45, 1250000],
      ["서울", "모니터", 120, 450000],
      ["부산", "노트북", 32, 1250000],
      ["부산", "모니터", 88, 450000]
    ],
    "rows": 10,
    "columns": 4
  }
}

get_active_workbook() 응답에 선택 영역 데이터가 포함되어 있으므로 추가 호출 없이 바로 분석할 수 있습니다.

시트 구조 분석

"이 시트에 어떤 테이블이 있는지 알려줘"

도구 호출:

json
read_data()

cell_range를 생략하면 데이터를 읽는 대신 시트의 구조 요약을 반환합니다.

응답:

json
{
  "sheet": "매출",
  "used_range": "$A$1:$H$120",
  "total_rows": 120,
  "total_columns": 8,
  "headers": ["월", "지역", "제품", "수량", "단가", "매출액", "할인율", "순매출"],
  "merged_cells": [
    { "range": "$A$1:$H$1", "value": "2025년 월별 매출 현황", "rows": 1, "columns": 8 }
  ],
  "regions": [
    { "range": "$A$1:$H$60", "rows": 60, "columns": 8 },
    { "range": "$A$65:$D$80", "rows": 16, "columns": 4 }
  ]
}

used_range로 데이터가 존재하는 위치를, merged_cells로 병합된 제목 행을, regions로 분리된 테이블 경계를 파악합니다. 이 시트에는 60행짜리 메인 테이블과 16행짜리 보조 테이블이 있습니다.


읽기 및 분석

데이터를 읽고 수식, 스타일, 오브젝트 등을 분석하는 예시입니다.

모든 시트 일괄 읽기

"이 통합 문서의 모든 시트를 한 번에 요약해줘"

도구 호출:

json
read_data(sheet="*")

응답:

json
{
  "sheet_count": 3,
  "sheets": {
    "매출": {
      "sheet": "매출",
      "used_range": "$A$1:$H$120",
      "total_rows": 120,
      "total_columns": 8,
      "headers": ["월", "지역", "제품", "수량", "단가", "매출액", "할인율", "순매출"]
    },
    "비용": {
      "sheet": "비용",
      "used_range": "$A$1:$F$85",
      "total_rows": 85,
      "total_columns": 6,
      "headers": ["월", "항목", "부서", "예산", "집행액", "잔액"]
    },
    "요약": {
      "sheet": "요약",
      "used_range": "$A$1:$D$15",
      "total_rows": 15,
      "total_columns": 4,
      "headers": ["구분", "금액", "비율", "비고"]
    }
  }
}

sheet="*"를 사용하면 한 번의 호출로 모든 시트의 구조를 파악할 수 있어 효율적입니다.

병합 셀이 있는 데이터 읽기

"B3:D10을 읽는데 병합된 셀 값을 채워줘"

도구 호출:

json
read_data(cell_range="B3:D10", merge_info=true)

응답:

json
{
  "range": "$B$3:$D$10",
  "sheet": "매출",
  "rows": 8,
  "columns": 3,
  "headers": ["지역", "분기", "매출액"],
  "data": [
    ["서울", "1분기", 45000000],
    ["서울", "2분기", 52000000],
    ["서울", "3분기", 48000000],
    ["서울", "4분기", 61000000],
    ["부산", "1분기", 28000000],
    ["부산", "2분기", 31000000],
    ["부산", "3분기", 29000000]
  ],
  "merged_ranges": [
    { "range": "$B$4:$B$7", "value": "서울" },
    { "range": "$B$8:$B$10", "value": "부산" }
  ]
}

merge_info=true를 지정하면 병합된 셀이 null 대신 상위 셀의 값("서울", "부산")으로 채워집니다. merged_ranges에서 어떤 범위가 병합되어 있는지도 확인할 수 있습니다.

비표준 헤더 위치 처리 (header_row)

"이 시트는 3행부터 헤더가 시작하는데, B3:G50을 읽어줘"

기업용 스프레드시트에서는 1~2행에 제목이나 빈 행이 있고, 실제 헤더가 3행 이후에 위치하는 경우가 많습니다.

도구 호출:

json
read_data(cell_range="B3:G50", header_row=3)

응답:

json
{
  "range": "$B$3:$G$50",
  "sheet": "수지분석",
  "rows": 48,
  "columns": 6,
  "headers": ["구분", "면적(m2)", "단가(원)", "금액(천원)", "비율(%)", "비고"],
  "data": [
    ["토지비", 1250.5, 3200000, 4001600, 28.5, "감정가 기준"],
    ["공사비", 1250.5, 1800000, 2250900, 16.0, "도급계약"],
    ["설계비", null, null, 180000, 1.3, "설계 용역"]
  ]
}

header_row=3을 지정하면 3행을 기준으로 헤더를 인식합니다. 1~2행에 있는 제목이나 부제목은 무시하고 실제 데이터 헤더를 정확히 매핑합니다.

수식 조회

"매출 시트에 있는 모든 수식을 보여줘"

도구 호출:

json
get_formulas(cell_range="A1:H120", sheet="매출", values_too=true)

응답:

json
{
  "formulas": [
    { "cell": "F3", "formula": "=D3*E3", "value": 56250000 },
    { "cell": "H3", "formula": "=F3*(1-G3)", "value": 50625000 },
    { "cell": "F4", "formula": "=D4*E4", "value": 54000000 },
    { "cell": "H4", "formula": "=F4*(1-G4)", "value": 51300000 },
    { "cell": "F62", "formula": "=SUM(F3:F61)", "value": 1850000000 },
    { "cell": "H62", "formula": "=SUM(H3:H61)", "value": 1702500000 }
  ],
  "total_formula_cells": 236,
  "range": "$A$1:$H$120",
  "sheet": "매출"
}

values_too=true를 지정하면 수식과 계산된 값을 함께 반환합니다. F열은 수량*단가, H열은 매출액*(1-할인율)로 계산되며, 62행에 합계 수식이 있다는 것을 알 수 있습니다.

스타일로 헤더와 소계 식별

"어떤 셀이 굵게 표시되거나 배경색이 있어?"

도구 호출:

json
get_cell_styles(cell_range="A1:H65", sheet="매출", properties=["bold", "bg_color", "font_color"])

응답:

json
{
  "range": "$A$1:$H$65",
  "sheet": "매출",
  "styles": [
    { "cell": "A1", "bold": true, "bg_color": "#1B3A5C", "font_color": "#FFFFFF" },
    { "cell": "B1", "bold": true, "bg_color": "#1B3A5C", "font_color": "#FFFFFF" },
    { "cell": "A2", "bold": true, "bg_color": "#D9E2F3" },
    { "cell": "B2", "bold": true, "bg_color": "#D9E2F3" },
    { "cell": "A62", "bold": true },
    { "cell": "F62", "bold": true },
    { "cell": "H62", "bold": true }
  ]
}

기본이 아닌 스타일이 적용된 셀만 반환합니다. 패턴을 분석하면:

  • 진한 배경(#1B3A5C) + 흰색 글자 = 대제목 행
  • 연한 배경(#D9E2F3) + 굵게 = 헤더 행
  • 굵게만 적용 = 소계/합계 행

스타일 + 데이터 조합으로 시트 구조 파악

"시트 구조를 스타일 기반으로 분석해줘"

복잡한 시트에서는 get_cell_stylesread_data를 조합하면 시트의 논리적 구조를 정확히 파악할 수 있습니다.

1단계 -- 스타일 조회:

json
get_cell_styles(cell_range="A1:A50", sheet="수지분석", properties=["bold", "bg_color", "font_size"])
json
{
  "range": "$A$1:$A$50",
  "sheet": "수지분석",
  "styles": [
    { "cell": "A1", "bold": true, "bg_color": "#002060", "font_size": 14 },
    { "cell": "A3", "bold": true, "bg_color": "#4472C4", "font_size": 11 },
    { "cell": "A10", "bold": true, "bg_color": "#4472C4", "font_size": 11 },
    { "cell": "A20", "bold": true, "bg_color": "#4472C4", "font_size": 11 },
    { "cell": "A35", "bold": true, "bg_color": "#D6DCE4" },
    { "cell": "A45", "bold": true, "bg_color": "#D6DCE4" }
  ]
}

2단계 -- 섹션 헤더 값 확인:

json
read_data(sheet="수지분석", cell_range="A1:A50")
json
{
  "range": "$A$1:$A$50",
  "sheet": "수지분석",
  "headers": ["구분"],
  "data": [
    [null], ["수입 항목"], [null], [null], [null], [null], [null], [null],
    ["지출 항목"], [null], [null], [null], [null], [null], [null], [null], [null], [null],
    ["사업수지 요약"], [null]
  ]
}

스타일과 값을 조합하면 이 시트는 세 개의 주요 섹션("수입 항목", "지출 항목", "사업수지 요약")으로 구성되어 있고, 각 섹션은 파란 배경의 굵은 행으로 구분된다는 것을 알 수 있습니다.

차트 및 오브젝트 탐색

"대시보드 시트에 어떤 차트가 있어?"

도구 호출:

json
get_objects(sheet="대시보드")

응답:

json
{
  "sheet": "대시보드",
  "charts": [
    {
      "name": "Chart 1",
      "top_left_cell": "$A$2",
      "width": 520,
      "height": 320,
      "chart_type": "5",
      "title": "월별 매출 추이"
    },
    {
      "name": "Chart 2",
      "top_left_cell": "$F$2",
      "width": 400,
      "height": 320,
      "chart_type": "4",
      "title": "지역별 매출 비율"
    },
    {
      "name": "Chart 3",
      "top_left_cell": "$A$20",
      "width": 520,
      "height": 280,
      "chart_type": "51",
      "title": "비용 구성"
    }
  ],
  "images": [
    { "name": "Picture 1", "top_left_cell": "$H$1", "width": 120, "height": 40 }
  ],
  "shapes": []
}

대시보드에 차트 3개(꺾은선형, 원형, 막대형)와 로고 이미지 1개가 있습니다. 차트의 위치(top_left_cell)와 크기를 통해 레이아웃을 파악할 수 있으며, title로 각 차트의 용도를 알 수 있습니다.


쓰기 및 서식

데이터 쓰기, 수식 추가, 서식 지정, 행 삽입 등의 예시입니다.

데이터 쓰기

"A1부터 이름과 점수 데이터를 입력해줘"

도구 호출:

json
write_data(
  start_cell="A1",
  data=[
    ["이름", "부서", "매출(천원)", "달성률(%)"],
    ["김민수", "영업1팀", 85000, 106.3],
    ["이지은", "영업2팀", 72000, 90.0],
    ["박서준", "영업1팀", 91000, 113.8],
    ["최유나", "영업3팀", 68000, 85.0]
  ]
)

응답:

json
{
  "message": "Data written successfully to 매출",
  "start_cell": "A1",
  "written_range": "$A$1:$D$5",
  "rows": 5,
  "columns": 4
}

2D 배열로 헤더와 데이터를 한 번에 쓸 수 있습니다.

수식 추가

"D6에 D2부터 D5까지의 합계 수식을 넣어줘"

도구 호출:

json
write_data(start_cell="D6", formula="=SUM(D2:D5)")

응답:

json
{
  "cell": "$D$6",
  "sheet": "매출",
  "formula": "=SUM(D2:D5)",
  "calculated_value": 316000
}

수식을 입력하면 Excel이 즉시 계산한 결과값을 calculated_value로 반환합니다.

서식 지정

"헤더 행을 굵게, 가운데 정렬하고 파란 배경에 흰색 글자로 만들어줘"

도구 호출:

json
format_range(
  cell_range="A1:D1",
  bold=true,
  alignment="center",
  bg_color="#1B3A5C",
  font_color="#FFFFFF",
  font_size=11,
  border=true
)

응답:

json
{
  "range": "$A$1:$D$1",
  "sheet": "매출",
  "applied": [
    "bold=True",
    "alignment=center",
    "bg_color=#1B3A5C",
    "font_color=#FFFFFF",
    "font_size=11",
    "border=True"
  ]
}

여러 서식 속성을 한 번의 호출로 적용할 수 있습니다.

숫자 서식 적용

"C열은 천 단위 구분자, D열은 백분율 서식으로 지정해줘"

도구 호출 1:

json
format_range(cell_range="C2:C5", number_format="#,##0")

도구 호출 2:

json
format_range(cell_range="D2:D5", number_format="0.0%")

응답 1:

json
{
  "range": "$C$2:$C$5",
  "sheet": "매출",
  "applied": ["number_format=#,##0"]
}

응답 2:

json
{
  "range": "$D$2:$D$5",
  "sheet": "매출",
  "applied": ["number_format=0.0%"]
}

number_format에 Excel 표준 서식 문자열을 지정합니다. 두 호출은 서로 독립적이므로 에이전트가 병렬로 실행할 수 있습니다.

행 삽입

"5행에 빈 행 3개를 삽입해줘"

도구 호출:

json
manage_sheets(action="insert_rows", position=5, count=3)

응답:

json
{
  "message": "Inserted 3 row(s) at row 5.",
  "sheet": "매출"
}

기존 5행부터의 데이터는 아래로 밀려나고, 5~7행에 빈 행이 삽입됩니다.


검색 및 관리

찾기/바꾸기, 시트 관리, 매크로 실행, 다중 워크북 작업 예시입니다.

텍스트 검색

"매출 시트에서 '서울'이 어디에 있는지 찾아줘"

도구 호출:

json
find_replace(find="서울", sheet="매출")

응답:

json
{
  "matches": [
    { "cell": "$B$3", "value": "서울", "sheet": "매출" },
    { "cell": "$B$4", "value": "서울", "sheet": "매출" },
    { "cell": "$B$5", "value": "서울 강남", "sheet": "매출" },
    { "cell": "$B$18", "value": "서울", "sheet": "매출" }
  ],
  "count": 4
}

replace를 생략하면 검색만 수행합니다. "서울 강남"처럼 부분 일치하는 셀도 포함됩니다.

찾기 및 바꾸기

"모든 '2024'를 '2025'로 바꿔줘"

도구 호출:

json
find_replace(find="2024", replace="2025")

응답:

json
{
  "replaced": 47,
  "sheet": "매출"
}

47개의 셀에서 텍스트가 교체되었습니다.

시트 추가

"'1분기 보고서'라는 새 시트를 만들어줘"

도구 호출:

json
manage_sheets(action="add", new_name="1분기 보고서")

응답:

json
{
  "message": "Sheet '1분기 보고서' added.",
  "sheets": ["매출", "비용", "요약", "1분기 보고서"]
}

시트 이름 변경

"Sheet1 이름을 '원본데이터'로 바꿔줘"

도구 호출:

json
manage_sheets(action="rename", sheet="Sheet1", new_name="원본데이터")

응답:

json
{
  "message": "Sheet 'Sheet1' renamed to '원본데이터'.",
  "sheets": ["원본데이터", "비용", "요약"]
}

VBA 매크로 실행

"월말정산 매크로를 실행해줘"

도구 호출:

json
run_macro(macro_name="월말정산", args=["2025", "03"])

응답:

json
{
  "message": "Macro '월말정산' executed successfully.",
  "return_value": "2025년 03월 정산 완료 (처리 건수: 248)"
}

args로 매크로에 인수를 전달할 수 있습니다. 이 매크로는 연도와 월을 받아 정산을 실행합니다.

다중 워크북 데이터 복사

"report.xlsx의 데이터를 summary.xlsx로 복사해줘"

1단계 -- 원본 데이터 읽기:

json
read_data(workbook="report.xlsx", sheet="매출", cell_range="A1:D50")
json
{
  "range": "$A$1:$D$50",
  "sheet": "매출",
  "rows": 50,
  "columns": 4,
  "headers": ["월", "제품", "수량", "매출액"],
  "data": [
    ["1월", "노트북", 120, 150000000],
    ["1월", "모니터", 85, 38250000]
  ]
}

2단계 -- 대상에 쓰기:

json
write_data(
  workbook="summary.xlsx",
  sheet="집계",
  start_cell="A1",
  data=[["월", "제품", "수량", "매출액"], ["1월", "노트북", 120, 150000000], ["1월", "모니터", 85, 38250000]]
)
json
{
  "message": "Data written successfully to 집계",
  "start_cell": "A1",
  "written_range": "$A$1:$D$3",
  "rows": 3,
  "columns": 4
}

에이전트가 원본에서 읽은 데이터를 data 파라미터에 그대로 전달하여 대상 워크북에 씁니다.


실전 워크플로우

여러 도구를 조합하여 복잡한 실무 과제를 해결하는 워크플로우입니다.

사업수지 분석

"이 사업수지 분석 엑셀 파일에서 주요 재무 지표를 추출하고 정리해줘"

5개 시트, 병합 헤더, 수식이 포함된 복잡한 부동산 개발 사업수지 분석 파일을 단계별로 처리합니다.


1단계 -- 워크북 구조 파악

json
get_active_workbook()
json
{
  "name": "OO지구_사업수지분석_v3.xlsx",
  "path": "C:\\Users\\user\\Projects\\OO지구_사업수지분석_v3.xlsx",
  "sheets": [
    { "name": "사업개요", "used_range": "$A$1:$G$25", "rows": 25, "columns": 7 },
    { "name": "분양수입", "used_range": "$A$1:$N$45", "rows": 45, "columns": 14 },
    { "name": "사업비", "used_range": "$A$1:$J$80", "rows": 80, "columns": 10 },
    { "name": "자금계획", "used_range": "$A$1:$R$60", "rows": 60, "columns": 18 },
    { "name": "수지분석", "used_range": "$A$1:$H$50", "rows": 50, "columns": 8 }
  ],
  "active_sheet": "수지분석",
  "selection": {
    "address": "$A$1:$H$1",
    "sheet": "수지분석",
    "data": [["OO지구 도시개발사업 수지분석표"]],
    "rows": 1,
    "columns": 8
  }
}

5개 시트의 크기와 용도를 파악합니다. "사업개요"는 소규모(25행), "사업비"는 대규모(80행)입니다. 선택 영역에서 이 파일이 도시개발사업 수지분석표임을 확인합니다.


2단계 -- 전체 시트 일괄 요약

json
read_data(sheet="*")
json
{
  "sheet_count": 5,
  "sheets": {
    "사업개요": {
      "sheet": "사업개요",
      "used_range": "$A$1:$G$25",
      "total_rows": 25,
      "total_columns": 7,
      "headers": ["구분", "내용", "단위", "수량", "비고", null, null],
      "merged_cells": [
        { "range": "$A$1:$G$1", "value": "사업개요", "rows": 1, "columns": 7 }
      ],
      "regions": [
        { "range": "$A$1:$G$25", "rows": 25, "columns": 7 }
      ]
    },
    "분양수입": {
      "sheet": "분양수입",
      "used_range": "$A$1:$N$45",
      "total_rows": 45,
      "total_columns": 14,
      "headers": ["구분", "용도", "동", "층", "호수", "전용면적", "공용면적", "공급면적", "분양단가", "분양금액", "부가세", "합계", null, null],
      "merged_cells": [
        { "range": "$A$1:$N$1", "value": "분양수입 산출내역", "rows": 1, "columns": 14 },
        { "range": "$A$4:$A$15", "value": "아파트", "rows": 12, "columns": 1 },
        { "range": "$A$16:$A$28", "value": "상가", "rows": 13, "columns": 1 }
      ],
      "regions": [
        { "range": "$A$1:$N$45", "rows": 45, "columns": 14 }
      ]
    },
    "사업비": {
      "sheet": "사업비",
      "used_range": "$A$1:$J$80",
      "total_rows": 80,
      "total_columns": 10,
      "headers": ["구분", "세부항목", "산출근거", "단위", "수량", "단가(원)", "금액(천원)", "비율(%)", "비고", null],
      "merged_cells": [
        { "range": "$A$1:$J$1", "value": "총 사업비 산출내역", "rows": 1, "columns": 10 },
        { "range": "$A$4:$A$12", "value": "토지비", "rows": 9, "columns": 1 },
        { "range": "$A$13:$A$35", "value": "공사비", "rows": 23, "columns": 1 },
        { "range": "$A$36:$A$55", "value": "간접비", "rows": 20, "columns": 1 }
      ],
      "regions": [
        { "range": "$A$1:$J$80", "rows": 80, "columns": 10 }
      ]
    },
    "자금계획": {
      "sheet": "자금계획",
      "used_range": "$A$1:$R$60",
      "total_rows": 60,
      "total_columns": 18,
      "headers": ["구분", "합계", "1차", "2차", "3차", "4차", "5차", "6차", "7차", "8차"]
    },
    "수지분석": {
      "sheet": "수지분석",
      "used_range": "$A$1:$H$50",
      "total_rows": 50,
      "total_columns": 8,
      "headers": ["구분", "금액(천원)", "비율(%)", "평당금액", "비고", null, null, null],
      "merged_cells": [
        { "range": "$A$1:$H$1", "value": "OO지구 도시개발사업 수지분석표", "rows": 1, "columns": 8 }
      ],
      "regions": [
        { "range": "$A$1:$H$50", "rows": 50, "columns": 8 }
      ]
    }
  }
}

에이전트는 이 응답에서 다음을 파악합니다:

  • "분양수입"에 아파트/상가 구분이 병합 셀로 되어 있음
  • "사업비"에 토지비/공사비/간접비 세 개의 대분류가 병합 셀로 구분됨
  • "수지분석"이 최종 요약 시트

3단계 -- 수지분석 시트 헤더 구조 파악

json
read_data(sheet="수지분석", cell_range="A1:H5", merge_info=true)
json
{
  "range": "$A$1:$H$5",
  "sheet": "수지분석",
  "rows": 5,
  "columns": 8,
  "headers": ["OO지구 도시개발사업 수지분석표", null, null, null, null, null, null, null],
  "data": [
    [null, null, null, null, null, null, null, null],
    ["구분", "금액(천원)", "비율(%)", "평당금액", "비고", null, null, null],
    ["I. 총수입", 85200000, 100.0, null, null, null, null, null],
    ["  1. 분양수입", 78500000, 92.1, 12800, null, null, null, null]
  ],
  "merged_ranges": [
    { "range": "$A$1:$H$1", "value": "OO지구 도시개발사업 수지분석표" }
  ]
}

1행은 전체 제목이 병합되어 있고, 3행이 실제 헤더입니다. 4행부터 데이터가 시작됩니다.


4단계 -- 핵심 데이터 추출

json
read_data(sheet="수지분석", cell_range="A3:E50", header_row=3)
json
{
  "range": "$A$3:$E$50",
  "sheet": "수지분석",
  "rows": 48,
  "columns": 5,
  "headers": ["구분", "금액(천원)", "비율(%)", "평당금액", "비고"],
  "data": [
    ["I. 총수입", 85200000, 100.0, null, null],
    ["  1. 분양수입", 78500000, 92.1, 12800, null],
    ["    (1) 아파트", 62000000, 72.8, 11500, null],
    ["    (2) 상가", 16500000, 19.4, 18200, null],
    ["  2. 보류지 매각", 4200000, 4.9, null, null],
    ["  3. 기타수입", 2500000, 2.9, null, "이자수입 포함"],
    ["II. 총사업비", 72800000, 85.4, null, null],
    ["  1. 토지비", 28500000, 33.4, 4650, null],
    ["    (1) 토지매입비", 25000000, 29.3, 4080, "감정평가액"],
    ["    (2) 토지부대비", 3500000, 4.1, 571, null],
    ["  2. 공사비", 31200000, 36.6, 5090, null],
    ["    (1) 직접공사비", 27800000, 32.6, 4535, "도급계약"],
    ["    (2) 간접공사비", 3400000, 4.0, 555, null],
    ["  3. 간접비", 13100000, 15.4, 2137, null],
    ["    (1) 설계비", 1800000, 2.1, 294, null],
    ["    (2) 감리비", 1200000, 1.4, 196, null],
    ["    (3) 분담금", 4500000, 5.3, 734, "기반시설"],
    ["    (4) 금융비용", 3200000, 3.8, 522, null],
    ["    (5) 제세공과금", 1400000, 1.6, 228, null],
    ["    (6) 기타경비", 1000000, 1.2, 163, null],
    ["III. 사업이익", 12400000, 14.6, 2023, null],
    ["IV. 사업이익률", null, 14.6, null, "이익/총수입"]
  ]
}

header_row=3으로 3행을 헤더로 지정하여 데이터를 정확히 매핑합니다. 에이전트는 이 데이터에서 핵심 재무 지표를 추출합니다:

  • 총수입 852억원, 총사업비 728억원, 사업이익 124억원
  • 사업이익률 14.6%
  • 토지비 비율 33.4%, 공사비 비율 36.6%

5단계 -- 수식 검증

json
get_formulas(sheet="수지분석", cell_range="A1:E50", values_too=true)
json
{
  "formulas": [
    { "cell": "B4", "formula": "=분양수입!L30", "value": 85200000 },
    { "cell": "B5", "formula": "=분양수입!L28", "value": 78500000 },
    { "cell": "B10", "formula": "=사업비!G60", "value": 72800000 },
    { "cell": "B11", "formula": "=사업비!G12", "value": 28500000 },
    { "cell": "B14", "formula": "=사업비!G35", "value": 31200000 },
    { "cell": "B17", "formula": "=사업비!G55", "value": 13100000 },
    { "cell": "B24", "formula": "=B4-B10", "value": 12400000 },
    { "cell": "C25", "formula": "=B24/B4*100", "value": 14.6 },
    { "cell": "C5", "formula": "=B5/B4*100", "value": 92.1 },
    { "cell": "C10", "formula": "=B10/B4*100", "value": 85.4 }
  ],
  "total_formula_cells": 32,
  "range": "$A$1:$E$50",
  "sheet": "수지분석"
}

수식 분석 결과:

  • 총수입(B4)은 "분양수입" 시트의 L30 셀에서 참조
  • 총사업비(B10)는 "사업비" 시트의 G60 셀에서 참조
  • 사업이익(B24) = 총수입 - 총사업비 (=B4-B10)
  • 사업이익률(C25) = 사업이익 / 총수입 * 100 (=B24/B4*100)
  • 각 항목의 비율은 총수입 대비 백분율로 계산됨

6단계 -- 서식으로 섹션 구분 확인

json
get_cell_styles(sheet="수지분석", cell_range="A1:A30", properties=["bold", "bg_color", "font_size"])
json
{
  "range": "$A$1:$A$30",
  "sheet": "수지분석",
  "styles": [
    { "cell": "A1", "bold": true, "bg_color": "#002060", "font_size": 14 },
    { "cell": "A3", "bold": true, "bg_color": "#D9E2F3", "font_size": 11 },
    { "cell": "A4", "bold": true, "bg_color": "#E2EFDA", "font_size": 11 },
    { "cell": "A10", "bold": true, "bg_color": "#FCE4D6", "font_size": 11 },
    { "cell": "A24", "bold": true, "bg_color": "#FFF2CC", "font_size": 12 },
    { "cell": "A25", "bold": true, "bg_color": "#FFF2CC", "font_size": 12 }
  ]
}

서식 패턴을 분석하면:

  • 진한 파란 배경(#002060) = 문서 제목
  • 연한 파란 배경(#D9E2F3) = 헤더 행
  • 연한 초록 배경(#E2EFDA) = 수입 섹션
  • 연한 주황 배경(#FCE4D6) = 지출 섹션
  • 연한 노란 배경(#FFF2CC) = 이익/결론 섹션

에이전트는 이 6단계를 통해 사업수지를 체계적으로 분석하고, 최종적으로 다음과 같은 요약을 제공합니다:

사업수지 분석 요약

  • 총수입: 852억원 (분양수입 92.1%, 보류지매각 4.9%, 기타 2.9%)
  • 총사업비: 728억원 (토지비 33.4%, 공사비 36.6%, 간접비 15.4%)
  • 사업이익: 124억원, 사업이익률 14.6%
  • 주요 비용: 토지매입비 250억(29.3%), 직접공사비 278억(32.6%), 분담금 45억(5.3%)

다중 워크북 데이터 통합

"1월, 2월, 3월 매출 파일을 합쳐서 분기 요약 파일을 만들어줘"

3개의 월별 매출 워크북에서 데이터를 읽어 하나의 분기 요약 워크북으로 통합하는 워크플로우입니다.


1단계 -- 열려 있는 워크북 확인

json
manage_workbooks(action="list")
json
[
  { "name": "매출_2025_01.xlsx", "path": "C:\\Users\\user\\매출_2025_01.xlsx",
    "sheets": [{ "name": "매출", "used_range": "$A$1:$F$35", "rows": 35, "columns": 6 }] },
  { "name": "매출_2025_02.xlsx", "path": "C:\\Users\\user\\매출_2025_02.xlsx",
    "sheets": [{ "name": "매출", "used_range": "$A$1:$F$32", "rows": 32, "columns": 6 }] },
  { "name": "매출_2025_03.xlsx", "path": "C:\\Users\\user\\매출_2025_03.xlsx",
    "sheets": [{ "name": "매출", "used_range": "$A$1:$F$38", "rows": 38, "columns": 6 }] }
]

3개 파일이 모두 열려 있고, 동일한 6열 구조입니다.


2단계 -- 각 워크북에서 데이터 읽기

에이전트는 3개 워크북을 순차적으로 읽습니다.

json
read_data(workbook="매출_2025_01.xlsx", sheet="매출", cell_range="A1:F35")
json
{
  "range": "$A$1:$F$35",
  "sheet": "매출",
  "rows": 35,
  "columns": 6,
  "headers": ["날짜", "지역", "제품", "수량", "단가", "매출액"],
  "data": [
    ["2025-01-02", "서울", "노트북", 15, 1250000, 18750000],
    ["2025-01-02", "부산", "모니터", 22, 450000, 9900000],
    ["2025-01-03", "서울", "키보드", 45, 120000, 5400000]
  ]
}
json
read_data(workbook="매출_2025_02.xlsx", sheet="매출", cell_range="A1:F32")
json
{
  "range": "$A$1:$F$32",
  "sheet": "매출",
  "rows": 32,
  "columns": 6,
  "headers": ["날짜", "지역", "제품", "수량", "단가", "매출액"],
  "data": [
    ["2025-02-03", "서울", "노트북", 18, 1250000, 22500000],
    ["2025-02-03", "대전", "모니터", 12, 450000, 5400000]
  ]
}
json
read_data(workbook="매출_2025_03.xlsx", sheet="매출", cell_range="A1:F38")
json
{
  "range": "$A$1:$F$38",
  "sheet": "매출",
  "rows": 38,
  "columns": 6,
  "headers": ["날짜", "지역", "제품", "수량", "단가", "매출액"],
  "data": [
    ["2025-03-02", "부산", "노트북", 20, 1250000, 25000000],
    ["2025-03-02", "서울", "모니터", 30, 450000, 13500000]
  ]
}

3개 파일 모두 동일한 헤더 구조("날짜", "지역", "제품", "수량", "단가", "매출액")를 가지고 있음을 확인합니다.


3단계 -- 요약 워크북 생성

json
manage_workbooks(action="open", filepath="new")
json
{
  "name": "통합 문서1",
  "sheets": [{ "name": "Sheet1", "used_range": "", "rows": 0, "columns": 0 }]
}

빈 워크북이 생성되었습니다.


4단계 -- 시트 이름 변경 및 구조 준비

json
manage_sheets(action="rename", workbook="통합 문서1", sheet="Sheet1", new_name="1분기 요약")
json
{
  "message": "Sheet 'Sheet1' renamed to '1분기 요약'.",
  "sheets": ["1분기 요약"]
}

5단계 -- 집계 데이터 쓰기

에이전트가 3개 워크북의 데이터를 지역별/제품별로 집계하여 씁니다.

json
write_data(
  workbook="통합 문서1",
  sheet="1분기 요약",
  start_cell="A1",
  data=[
    ["2025년 1분기 매출 요약"],
    [],
    ["지역", "제품", "1월 수량", "1월 매출", "2월 수량", "2월 매출", "3월 수량", "3월 매출", "합계 수량", "합계 매출"],
    ["서울", "노트북", 42, 52500000, 51, 63750000, 48, 60000000, 141, 176250000],
    ["서울", "모니터", 65, 29250000, 58, 26100000, 72, 32400000, 195, 87750000],
    ["서울", "키보드", 130, 15600000, 145, 17400000, 118, 14160000, 393, 47160000],
    ["부산", "노트북", 28, 35000000, 32, 40000000, 38, 47500000, 98, 122500000],
    ["부산", "모니터", 48, 21600000, 42, 18900000, 55, 24750000, 145, 65250000],
    ["대전", "노트북", 15, 18750000, 18, 22500000, 22, 27500000, 55, 68750000],
    ["대전", "모니터", 20, 9000000, 12, 5400000, 18, 8100000, 50, 22500000]
  ]
)
json
{
  "message": "Data written successfully to 1분기 요약",
  "start_cell": "A1",
  "written_range": "$A$1:$J$10",
  "rows": 10,
  "columns": 10
}

6단계 -- 합계 행 및 수식 추가

json
write_data(workbook="통합 문서1", sheet="1분기 요약", start_cell="A11", data=[["합계"]])
json
write_data(workbook="통합 문서1", sheet="1분기 요약", start_cell="C11", formula="=SUM(C4:C10)")
json
{
  "cell": "$C$11",
  "sheet": "1분기 요약",
  "formula": "=SUM(C4:C10)",
  "calculated_value": 348
}

나머지 열(D~J)에도 동일하게 SUM 수식을 추가합니다.


7단계 -- 서식 적용

json
format_range(
  workbook="통합 문서1",
  sheet="1분기 요약",
  cell_range="A1:J1",
  bold=true, font_size=14, bg_color="#002060", font_color="#FFFFFF"
)
json
format_range(
  workbook="통합 문서1",
  sheet="1분기 요약",
  cell_range="A3:J3",
  bold=true, alignment="center", bg_color="#D9E2F3", border=true
)
json
format_range(
  workbook="통합 문서1",
  sheet="1분기 요약",
  cell_range="D4:D11",
  number_format="#,##0"
)
json
format_range(
  workbook="통합 문서1",
  sheet="1분기 요약",
  cell_range="A11:J11",
  bold=true, bg_color="#FFF2CC", border=true
)

제목, 헤더, 금액 서식, 합계 행에 각각 서식을 적용합니다.


8단계 -- 파일 저장

json
manage_workbooks(action="save", workbook="통합 문서1", filepath="C:\\Users\\user\\매출_2025_Q1_요약.xlsx")
json
{
  "message": "Workbook saved as 'C:\\Users\\user\\매출_2025_Q1_요약.xlsx'."
}

3개 월별 파일의 데이터를 읽고, 지역/제품별로 집계하고, 서식을 적용하여 분기 요약 파일을 완성했습니다.

Released under the MIT License.