| name | xlsx-manipulation |
| description | Create, edit, and manipulate Excel spreadsheets programmatically using openpyxl |
| author | claude-office-skills |
| version | 1.0 |
| tags | ["spreadsheet","excel","xlsx","openpyxl","data"] |
| models | ["claude-sonnet-4","claude-opus-4"] |
| tools | ["computer","code_execution","file_operations"] |
| library | {"name":"openpyxl","url":"https://github.com/theorchard/openpyxl","stars":"3.8k"} |
XLSX Manipulation Skill
Overview
This skill enables programmatic creation, editing, and manipulation of Microsoft Excel (.xlsx) spreadsheets using the openpyxl library. Create professional spreadsheets with formulas, formatting, charts, and data validation without manual editing.
How to Use
- Describe the spreadsheet you want to create or modify
- Provide data, formulas, or formatting requirements
- I'll generate openpyxl code and execute it
Example prompts:
- "Create a budget spreadsheet with monthly tracking"
- "Add conditional formatting to highlight values above threshold"
- "Generate a pivot-table-like summary from this data"
- "Create a dashboard with charts and KPIs"
Domain Knowledge
openpyxl Fundamentals
from openpyxl import Workbook, load_workbook
from openpyxl.styles import Font, Fill, Border, Alignment
from openpyxl.chart import BarChart, Reference
wb = Workbook()
ws = wb.active
wb = load_workbook('existing.xlsx')
ws = wb.active
Workbook Structure
Workbook
├── worksheets (sheets/tabs)
│ ├── cells (data storage)
│ ├── rows/columns (formatting)
│ ├── merged_cells
│ └── charts
├── defined_names (named ranges)
└── styles (formatting templates)
Working with Cells
Basic Cell Operations
ws['A1'] = 'Header'
ws['B1'] = 42
ws.cell(row=1, column=3, value='Data')
ws['A1:C1'] = [['Col1', 'Col2', 'Col3']]
ws.append(['Row', 'Data', 'Here'])
Reading Cells
value = ws['A1'].value
for row in ws['A1:C3']:
for cell in row:
print(cell.value)
for row in ws.iter_rows(min_row=1, max_row=10, min_col=1, max_col=3):
for cell in row:
print(cell.value)
Formulas
ws['D1'] = '=SUM(A1:C1)'
ws['D2'] = '=AVERAGE(A2:C2)'
ws['E1'] = '=IF(D1>100,"High","Low")'
from openpyxl.workbook.defined_name import DefinedName
ref = "Sheet!$A$1:$C$10"
defn = DefinedName("SalesData", attr_text=ref)
wb.defined_names.add(defn)
ws['F1'] = '=SUM(SalesData)'
Formatting
Cell Styles
from openpyxl.styles import Font, Fill, PatternFill, Border, Side, Alignment
ws['A1'].font = Font(
name='Arial',
size=14,
bold=True,
italic=False,
color='FF0000'
)
ws['A1'].fill = PatternFill(
start_color='FFFF00',
end_color='FFFF00',
fill_type='solid'
)
thin_border = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)
ws['A1'].border = thin_border
ws['A1'].alignment = Alignment(
horizontal='center',
vertical='center',
wrap_text=True
)
Number Formats
ws['B2'].number_format = '$#,##0.00'
ws['C2'].number_format = '0.00%'
ws['D2'].number_format = 'YYYY-MM-DD'
ws['E2'].number_format = '#,##0.00 "units"'
Conditional Formatting
from openpyxl.formatting.rule import ColorScaleRule, CellIsRule, FormulaRule
from openpyxl.styles import PatternFill
color_scale = ColorScaleRule(
start_type='min', start_color='FF0000',
end_type='max', end_color='00FF00'
)
ws.conditional_formatting.add('A1:A10', color_scale)
red_fill = PatternFill(start_color='FFCCCC', end_color='FFCCCC', fill_type='solid')
rule = CellIsRule(operator='greaterThan', formula=['100'], fill=red_fill)
ws.conditional_formatting.add('B1:B10', rule)
Charts
from openpyxl.chart import BarChart, LineChart, PieChart, Reference
data = Reference(ws, min_col=2, min_row=1, max_col=3, max_row=5)
categories = Reference(ws, min_col=1, min_row=2, max_row=5)
chart = BarChart()
chart.type = "col"
chart.title = "Sales by Region"
chart.add_data(data, titles_from_data=True)
chart.set_categories(categories)
chart.shape = 4
ws.add_chart(chart, "E1")
line = LineChart()
line.title = "Trend Analysis"
line.add_data(data, titles_from_data=True)
line.set_categories(categories)
ws.add_chart(line, "E15")
pie = PieChart()
pie.add_data(data, titles_from_data=True)
pie.set_categories(categories)
ws.add_chart(pie, "M1")
Data Validation
from openpyxl.worksheet.datavalidation import DataValidation
dv = DataValidation(
type="list",
formula1='"Option1,Option2,Option3"',
allow_blank=True
)
dv.error = "Please select from list"
dv.errorTitle = "Invalid Input"
ws.add_data_validation(dv)
dv.add('A1:A100')
dv_num = DataValidation(
type="whole",
operator="between",
formula1="1",
formula2="100"
)
ws.add_data_validation(dv_num)
dv_num.add('B1:B100')
Sheet Operations
ws2 = wb.create_sheet("Data")
ws3 = wb.create_sheet("Summary", 0)
ws.title = "Main Report"
del wb["Sheet2"]
source = wb["Template"]
target = wb.copy_worksheet(source)
Row/Column Operations
ws.column_dimensions['A'].width = 20
ws.row_dimensions[1].height = 30
ws.column_dimensions['C'].hidden = True
ws.freeze_panes = 'B2'
ws.auto_filter.ref = "A1:D100"
Best Practices
- Use Templates: Start with a .xlsx template for complex formatting
- Batch Operations: Minimize cell-by-cell operations for speed
- Named Ranges: Use defined names for clearer formulas
- Data Validation: Add validation to prevent input errors
- Save Incrementally: For large files, save periodically
Common Patterns
Data Import
def import_csv_to_xlsx(csv_path, xlsx_path):
import csv
wb = Workbook()
ws = wb.active
with open(csv_path) as f:
reader = csv.reader(f)
for row in reader:
ws.append(row)
wb.save(xlsx_path)
Report Template
def create_monthly_report(data, output_path):
wb = Workbook()
ws = wb.active
ws.title = "Monthly Report"
headers = ['Date', 'Revenue', 'Expenses', 'Profit']
ws.append(headers)
for col in range(1, 5):
cell = ws.cell(1, col)
cell.font = Font(bold=True)
cell.fill = PatternFill('solid', fgColor='4472C4')
cell.font = Font(bold=True, color='FFFFFF')
for row in data:
ws.append(row)
last_row = len(data) + 1
ws.cell(last_row + 1, 1, 'TOTAL')
ws.cell(last_row + 1, 2, f'=SUM(B2:B{last_row})')
ws.cell(last_row + 1, 3, f'=SUM(C2:C{last_row})')
ws.cell(last_row + 1, 4, f'=SUM(D2:D{last_row})')
wb.save(output_path)
Examples
Example 1: Budget Tracker
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.utils import get_column_letter
wb = Workbook()
ws = wb.active
ws.title = "Budget 2024"
months = ['Category', 'Jan', 'Feb', 'Mar', 'Q1 Total']
ws.append(months)
budget_data = [
['Salary', 5000, 5000, 5000],
['Rent', -1500, -1500, -1500],
['Utilities', -200, -180, -220],
['Food', -400, -450, -380],
['Transport', -150, -160, -140],
['Entertainment', -200, -250, -200],
]
for row in budget_data:
ws.append(row + [f'=SUM(B{ws.max_row + 1}:D{ws.max_row + 1})'])
ws.append(['TOTAL',
f'=SUM(B2:B{ws.max_row})',
f'=SUM(C2:C{ws.max_row})',
f'=SUM(D2:D)',
])
header_fill = PatternFill(, fgColor=)
header_font = Font(bold=, color=)
cell ws[]:
cell.fill = header_fill
cell.font = header_font
cell.alignment = Alignment(horizontal=)
row ws.iter_rows(min_row=, min_col=, max_col=):
cell row:
cell.number_format =
ws.column_dimensions[].width =
col (, ):
ws.column_dimensions[get_column_letter(col)].width =
wb.save()
Example 2: Sales Dashboard
from openpyxl import Workbook
from openpyxl.chart import BarChart, PieChart, Reference
from openpyxl.styles import Font, PatternFill
wb = Workbook()
ws = wb.active
ws.title = "Sales Dashboard"
ws.append(['Region', 'Q1', 'Q2', 'Q3', 'Q4'])
data = [
['North', 150000, 165000, 180000, 195000],
['South', 120000, 125000, 140000, 155000],
['East', 180000, 190000, 210000, 225000],
['West', 95000, 110000, 125000, 140000],
]
for row in data:
ws.append(row)
data_ref = Reference(ws, min_col=2, min_row=1, max_col=5, max_row=5)
cats_ref = Reference(ws, min_col=1, min_row=2, max_row=5)
bar = BarChart()
bar.type = "col"
bar.title = "Quarterly Sales by Region"
bar.add_data(data_ref, titles_from_data=True)
bar.set_categories(cats_ref)
bar.height = 10
bar.width = 15
ws.add_chart(bar, "A8")
pie_data = Reference(ws, min_col=, min_row=, max_row=)
pie = PieChart()
pie.title =
pie.add_data(pie_data, titles_from_data=)
pie.set_categories(cats_ref)
ws.add_chart(pie, )
wb.save()
Limitations
- Cannot execute VBA macros
- Complex pivot tables not fully supported
- Limited sparkline support
- External data connections not supported
- Some advanced chart types unavailable
Installation
pip install openpyxl
Resources