{/* Trang này được tạo tự động từ SKILL.md của kỹ năng bởi website/scripts/generate-skill-docs.py. Chỉnh sửa nguồn SKILL.md, không phải trang này. */}
Tác giả Excel
Xây dựng sổ làm việc Excel có thể kiểm tra không có đầu với openpyxl — quy ước ô màu xanh lam/đen/xanh lục, công thức trên mã cứng, phạm vi được đặt tên, kiểm tra số dư, bảng độ nhạy. Sử dụng cho các mô hình tài chính, kết quả kiểm toán, đối chiếu.
Siêu dữ liệu kỹ năng
| Nguồn | Tùy chọn — cài đặt với |
| `Hermes skills install official/finance/excel-author | |
| ` | |
| Đường dẫn |
optional-skills/finance/excel-author ` | | Phiên bản |
1.0.0 ` | | Tác giả | Nhân chủng học (được chuyển thể bởi Nous Research) | | Giấy phép | Apache-2.0 | | Nền tảng | Linux, macOS, Windows | | Thẻ |
excel
, `openpyxl
, `finance
, `spreadsheet
,
modeling |
| Kỹ năng liên quan | XPROTECTX17XPROTECTX, XPROTECTX18XPROTECTX, XPROTECTX19XPROTECTX, XPROTECTX20XPROTECTX, XPROTECTX21XPROTECTX |
Tham khảo: đầy đủ SKILL.md
Sau đây là định nghĩa kỹ năng đầy đủ mà Hermes tải khi kỹ năng này được kích hoạt. Đây là những gì tác nhân coi là hướng dẫn khi kỹ năng được kích hoạt.
tác giả excel
Tạo tệp .xlsx trên đĩa bằng `openpyxl
. Hãy tuân theo các quy ước cấp ngân hàng bên dưới để mô hình có thể kiểm tra được, linh hoạt và có thể được xem xét bởi người khác chứ không phải người đã xây dựng nó.
Được chuyển thể từ các kỹ năng
xlsx-author và
audit-xls của Anthropic trong repo Anthropics/financial-services. Các nhánh dành riêng cho MCP / Office-JS / Cowork của bản gốc bị loại bỏ - kỹ năng này giả sử Python không có đầu.
Hợp đồng đầu ra
- Viết thư
./out/<name>.xlsx
. Tạo
./out/ ` nếu nó chưa tồn tại.
- Trả lại đường dẫn tương đối trong tin nhắn cuối cùng của bạn để các công cụ xuôi dòng có thể tiếp nhận.
- Một mô hình logic cho mỗi tập tin. Không thêm vào sổ làm việc hiện có trừ khi được yêu cầu rõ ràng.
Thiết lập
pip install "openpyxl>=3.0"
`
## Quy ước cốt lõi (không thể thương lượng)
### Màu ô xanh / đen / xanh
- **Xanh dương** (
`Font(color="0000FF")
) — dữ liệu nhập được mã hóa cứng mà con người nhập vào. Trình điều khiển doanh thu, đầu vào WACC, tăng trưởng cuối cùng, dữ liệu thị trường.
- **Đen** (mặc định) — công thức. Mỗi ô dẫn xuất là một công thức Excel trực tiếp.
- **Xanh** (
`Font(color="006100")
) — liên kết đến trang tính khác hoặc tệp bên ngoài.
Sau đó, người đánh giá có thể quét trang tính và xem ngay đâu là giả định so với những gì được tính toán.
### Công thức trên mã cứng
Mỗi ô tính toán PHẢI là một chuỗi công thức, không bao giờ là số được tính toán bằng Python và được dán dưới dạng giá trị.
``` python
# WRONG — silent bug waiting to happen
ws["D20"] = revenue_prior_year * (1 + growth)
# CORRECT — flexes when the user changes the assumption
ws["D20"] = "=D19*(1+$B$8)"
`
``Các số được mã hóa cứng duy nhất được phép:
1. Dữ liệu đầu vào lịch sử thô (doanh thu thực tế, EBITDA được báo cáo, v.v.)
2. Trình điều khiển giả định mà người dùng có ý định linh hoạt (tốc độ tăng trưởng, đầu vào WACC, terminal g)
3. Dữ liệu thị trường hiện tại (giá cổ phiếu, số dư nợ) - với nguồn ghi chú + ngày tháng
Nếu bạn thấy mình đang tính toán một giá trị bằng Python và viết kết quả, hãy dừng lại.
### Phạm vi được đặt tên cho tham chiếu bảng tính chéo
Sử dụng các phạm vi được đặt tên cho bất kỳ hình nào được tham chiếu từ một trang tính, bộ bài hoặc bản ghi nhớ khác.
``` python
from openpyxl.workbook.defined_name import DefinedName
wb.defined_names["WACC"] = DefinedName("WACC", attr_text="Inputs!$C$8")
# then elsewhere:
calc["D30"] = "=D29/WACC"
`
### Tab kiểm tra số dư
Bao gồm tab
`Checks
` liên kết mọi thứ và hiển thị TRUE/FALSE:
- Số dư bảng cân đối kế toán (tài sản = nợ phải trả + vốn chủ sở hữu)
- Dòng tiền liên quan đến sự thay đổi tiền mặt theo từng thời kỳ trên BS
- Tổng các phần liên quan đến tổng hợp nhất
- Không có mã cứng giả mạo trong phạm vi calc
Ví dụ:
`
``` python
checks = wb.create_sheet("Checks")
checks["A2"] = "BS balances"
checks["B2"] = "=IS!D20-IS!D21-IS!D22"
checks["C2"] = "=ABS(B2)<0.01" # TRUE/FALSE
`
### Nhận xét ô trên mỗi đầu vào được mã hóa cứng
Thêm nhận xét NHƯ bạn tạo ô, không phải sau này.
`Python
from openpyxl.comments import Comment
ws["C2"] = 1_250_000_000
ws["C2"].font = Font(color="0000FF")
ws["C2"].comment = Comment("Source: 10-K FY2024, p.47, revenue line", "analyst")
`
``Định dạng:
`Source: [System/Document], [Date], [Reference], [URL if applicable]
.
Không bao giờ trì hoãn việc tìm nguồn cung ứng. Không bao giờ viết
`TODO: add source
.
## Skeleton: mô hình tài chính điển hình
`Python
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.comments import Comment
from openpyxl.utils import get_column_letter
from pathlib import Path
BLUE = Font(color="0000FF")
BLACK = Font(color="000000")
GREEN = Font(color="006100")
BOLD = Font(bold=True)
HEADER_FILL = PatternFill("solid", fgColor="1F4E79")
HEADER_FONT = Font(color="FFFFFF", bold=True)
wb = Workbook()
# --- Inputs tab ---
inp = wb.active
inp.title = "Inputs"
inp["A1"] = "MARKET DATA & KEY INPUTS"
inp["A1"].font = HEADER_FONT
inp["A1"].fill = HEADER_FILL
inp.merge_cells("A1:C1")
inp["B3"] = "Revenue FY2024"
inp["C3"] = 1_250_000_000
inp["C3"].font = BLUE
inp["C3"].comment = Comment("Source: 10-K FY2024 p.47", "model")
inp["B4"] = "Growth Rate"
inp["C4"] = 0.12
inp["C4"].font = BLUE
# --- Calc tab ---
calc = wb.create_sheet("DCF")
calc["B2"] = "Projected Revenue"
calc["C2"] = "=Inputs!C3*(1+Inputs!C4)" # formula, black
# --- Checks tab ---
chk = wb.create_sheet("Checks")
chk["A2"] = "BS balances"
chk["B2"] = "=ABS(BS!D20-BS!D21-BS!D22)<0.01"
Path("./out").mkdir(exist_ok=True)
wb.save("./out/model.xlsx")
`
## Tiêu đề phần có ô được hợp nhất`quirk openpyxl: khi bạn hợp nhất, hãy đặt giá trị ở ô trên cùng bên trái và tạo kiểu riêng cho toàn bộ phạm vi.
`Python
ws["A7"] = "CASH FLOW PROJECTION"
ws["A7"].font = HEADER_FONT
ws.merge_cells("A7:H7")
for col in range(1, 9): # A..H
ws.cell(row=7, column=col).fill = HEADER_FILL
`
## Bảng độ nhạy
Xây dựng bằng vòng lặp chứ không phải công thức được mã hóa cứng trên mỗi ô. Quy tắc:
- **Số lượng hàng/cột lẻ** (5×5 hoặc 7×7) — đảm bảo có một ô trung tâm thực sự.
- **Ô trung tâm = trường hợp cơ sở.** Tiêu đề hàng giữa/col phải bằng WACC thực tế của mô hình và điểm cuối g để đầu ra trung tâm bằng giá cổ phiếu ngụ ý của trường hợp cơ sở. Đó là kiểm tra sự tỉnh táo.
- **Đánh dấu ô trung tâm** với màu tô màu xanh lam vừa phải (
"BDD7EE"
) và in đậm.
- Điền vào mỗi ô một công thức tính toán lại đầy đủ — không bao giờ là giá trị gần đúng.
``` python
# 5x5 WACC (rows) x terminal growth (cols) sensitivity
wacc_axis = [0.08, 0.085, 0.09, 0.095, 0.10] # center row = base 9.0%
term_axis = [0.02, 0.025, 0.03, 0.035, 0.04] # center col = base 3.0%`start_row = 40
ws.cell(row=start_row, column=1).value = "Implied Share Price ($)"
ws.cell(row=start_row, column=1).font = BOLD`for j, g in enumerate(term_axis):
ws.cell(row=start_row+1, column=2+j).value = g
ws.cell(row=start_row+1, column=2+j).font = BLUE`for i, w in enumerate(wacc_axis):
r = start_row + 2 + i
ws.cell(row=r, column=1).value = w
ws.cell(row=r, column=1).font = BLUE
for j, g in enumerate(term_axis):
c = 2 + j
# Full DCF recalc formula (simplified for illustration).
# In a real model this references the full projection block.
ws.cell(row=r, column=c).value = (
f"=SUMPRODUCT(FCF_range,1/(1+\{w})^year_offset) + "
f"FCF_terminal*(1+\{g})/(\{w}-\{g})/(1+\{w})^terminal_year"
)
# Highlight center cell (base case)
center = ws.cell(row=start_row+2+len(wacc_axis)//2,
column=2+len(term_axis)//2)
center.fill = PatternFill("solid", fgColor="BDD7EE")
center.font = BOLD
`
## Tính toán lại trước khi giao hàngopenpyxl ghi chuỗi công thức nhưng không tính toán chúng. Excel tính toán lại trên các ứng dụng tiêu dùng mở nhưng ở hạ nguồn (tập lệnh kiểm tra tự động, CI) cần các giá trị được tính toán.
Chạy LibreOffice hoặc một bước tính toán lại chuyên dụng trước khi phân phối:
``` bash
# LibreOffice headless recalc
libreoffice --headless --calc --convert-to xlsx ./out/model.xlsx --outdir ./out/
`
``Hoặc sử dụng trình trợ giúp tính toán lại Python (xem
`scripts/recalc.py
` trong kỹ năng này).
## Lập kế hoạch bố trí mô hình
Trước khi viết bất kỳ công thức nào:
1. Xác định TẤT CẢ vị trí hàng phần
2. Viết TẤT CẢ tiêu đề và nhãn
3. Viết TẤT CẢ các ngăn chia phần và các hàng trống
4. SAU ĐÓ viết công thức bằng cách sử dụng các vị trí hàng bị khóa
Điều này ngăn chặn mẫu phá vỡ công thức xếp tầng trong đó việc chèn hàng tiêu đề sau khi công thức được viết sẽ làm dịch chuyển mọi tham chiếu xuôi dòng.
## Xác minh từng bước với người dùng
Đối với các mô hình lớn (DCF, 3 câu lệnh, LBO), hãy dừng và hiển thị các tạo phẩm trung gian cho người dùng trước khi tiếp tục. Việc nắm bắt giả định sai về tỷ suất lợi nhuận trước khi xây dựng các bảng độ nhạy xuôi dòng sẽ giúp bạn tiết kiệm được một giờ.
Mẫu điểm kiểm tra:
- Sau khối Đầu vào → hiển thị đầu vào thô, xác nhận trước khi chiếu
- Sau khi dự báo Doanh thu → xác nhận doanh thu + tăng trưởng
- Sau khi xây dựng FCF → xác nhận toàn bộ lịch trình
- Sau WACC → xác nhận đầu vào
- Sau khi định giá → xác nhận cầu vốn cổ phần
- SAU ĐÓ xây dựng bảng độ nhạy
## Khi nào KHÔNG nên sử dụng kỹ năng này
- Người dùng trong phiên Excel trực tiếp có sẵn Office MCP — thay vào đó, hãy điều khiển sổ làm việc trực tiếp của họ.
- Xuất dữ liệu dạng bảng thuần túy không có công thức -
`csv
` hoặc
`pandas.to_excel
` đơn giản hơn.
- Trang tổng quan/biểu đồ có tính tương tác cao — sử dụng công cụ BI thực.
## Ghi công
Các quy ước (xanh dương/đen/xanh lục, công thức trên mã cứng, phạm vi được đặt tên, quy tắc nhạy cảm) được phỏng theo bộ plugin Claude dành cho Dịch vụ Tài chính của Anthropic, được cấp phép Apache-2.0. Bản gốc: https://GitHub.com/Anthropics/financial-services/tree/main/plugins/vertical-plugins/financial-analysis/skills/xlsx-author