Excel
25 functions. Tables, formulas, structure. Full spreadsheet control.
Excel file manipulation using openpyxl. Create, read, write workbooks, apply formulas, manage tables, and inspect spreadsheet structure.
Highlights
- 25 functions covering all spreadsheet operations
- Table operations with dictionary-based data access
- Pure cell range functions (no file I/O required)
- JSON-formatted output for LLM consumption
- Auto-creates parent directories on workbook creation
- Auto-prepends
= to formulas if missing
Core Operations
| Function |
Description |
excel.create(filepath, sheet_name) |
Create new Excel workbook |
excel.add_sheet(filepath, sheet_name) |
Add worksheet to existing workbook |
excel.read(filepath, sheet_name, start_cell, end_cell) |
Read data from worksheet |
excel.write(filepath, data, sheet_name, start_cell) |
Write data to worksheet |
excel.info(filepath, include_ranges) |
Get workbook metadata |
excel.formula(filepath, cell, formula, sheet_name) |
Apply Excel formula to cell |
Range Manipulation (Pure Functions)
| Function |
Description |
excel.cell_range(cell, right, down, left, up) |
Expand a cell into a range |
excel.cell_shift(cell, rows, cols) |
Shift a cell reference by offset |
Search
| Function |
Description |
excel.search(filepath, pattern, sheet_name, regex, first_only) |
Search for values matching pattern |
Table Operations
| Function |
Description |
excel.tables(filepath, sheet_name) |
List all defined tables |
excel.table_info(filepath, table_name, sheet_name) |
Get detailed table information |
excel.table_data(filepath, table_name, row_index, sheet_name) |
Get table data as dicts |
excel.create_table(filepath, data_range, table_name, sheet_name) |
Create native Excel table |
Structure Manipulation
| Function |
Description |
excel.insert_rows(filepath, row, count, sheet_name) |
Insert rows at position |
excel.delete_rows(filepath, row, count, sheet_name) |
Delete rows at position |
excel.insert_cols(filepath, col, count, sheet_name) |
Insert columns at position |
excel.delete_cols(filepath, col, count, sheet_name) |
Delete columns at position |
excel.copy_range(filepath, source, target, sheet_name, target_sheet) |
Copy range to location |
Extended Inspection
| Function |
Description |
excel.sheets(filepath) |
List all sheets with visibility |
excel.used_range(filepath, sheet_name) |
Get used range of worksheet |
excel.formulas(filepath, sheet_name) |
List all formula cells |
excel.hyperlinks(filepath, sheet_name) |
List all hyperlinks |
excel.merged_cells(filepath, sheet_name) |
List merged cell ranges |
excel.named_ranges(filepath) |
List all named ranges |
Key Parameters
| Parameter |
Type |
Description |
filepath |
str |
Path to Excel file (required) |
sheet_name |
str |
Target sheet (default: active sheet) |
data |
list[list] |
Rows for writing (list of lists) |
start_cell |
str |
Starting cell reference (default: "A1") |
pattern |
str |
Search pattern (wildcards or regex) |
table_name |
str |
Name for table operations |
Examples
Basic Operations
# Create workbook with custom sheet
excel.create(filepath="output/report.xlsx", sheet_name="Sales")
# Write data
excel.write(
filepath="output/report.xlsx",
data=[["Product", "Revenue"], ["Widget", 1000], ["Gadget", 2500]],
sheet_name="Sales"
)
# Read data back
excel.read(filepath="output/report.xlsx", sheet_name="Sales")
# Apply formula
excel.formula(filepath="output/report.xlsx", cell="B4", formula="=SUM(B2:B3)")
Range Manipulation
# Expand A1 into a 6x11 range (no file needed)
excel.cell_range(cell="A1", right=5, down=10) # -> "A1:F11"
# Shift B3 down 5 rows and right 3 columns
excel.cell_shift(cell="B3", rows=5, cols=3) # -> "E8"
Tables
# Create a table from data range
excel.create_table(filepath="data.xlsx", data_range="A1:D10", table_name="SalesData")
# Get table info
excel.table_info(filepath="data.xlsx", table_name="SalesData")
# Read table data as dictionaries
excel.table_data(filepath="data.xlsx", table_name="SalesData")
# Get single row by index
excel.table_data(filepath="data.xlsx", table_name="SalesData", row_index=0)
Search
# Wildcard search
excel.search(filepath="data.xlsx", pattern="Widget*")
# Regex search
excel.search(filepath="data.xlsx", pattern="^ID-\\d+$", regex=True)
# First match only
excel.search(filepath="data.xlsx", pattern="Error*", first_only=True)
Structure Manipulation
# Insert 3 rows at row 5
excel.insert_rows(filepath="data.xlsx", row=5, count=3)
# Delete column B and C
excel.delete_cols(filepath="data.xlsx", col="B", count=2)
# Copy range to another location
excel.copy_range(filepath="data.xlsx", source="A1:C10", target="E1")
# Copy to different sheet
excel.copy_range(filepath="data.xlsx", source="A1:C10", target="A1", target_sheet="Backup")
Inspection
# List all sheets
excel.sheets(filepath="report.xlsx")
# Get used range
excel.used_range(filepath="report.xlsx", sheet_name="Data")
# Find all formulas
excel.formulas(filepath="calc.xlsx")
# List merged cells
excel.merged_cells(filepath="report.xlsx")
Demo Data
A sample spreadsheet is available at demo/data/sample_sales.xlsx with:
- Sales sheet: Product data with formulas and a table
- Inventory sheet: Stock levels with conditional formulas
- Summary sheet: Cross-sheet formulas and merged cells
Source
openpyxl Documentation
Based on
excel-mcp-server by Haris Musa (MIT)