Requirements for Outputs
All Excel files
Professional Font
- Use a consistent, professional font (e.g., Arial, Times New Roman) for all deliverables unless otherwise instructed by the user
Zero Formula Errors
- Every Excel model MUST be delivered with ZERO formula errors (#REF!, #DIV/0!, #VALUE!, #N/A, #NAME?)
Preserve Existing Templates (when updating templates)
- Study and EXACTLY match existing format, style, and conventions when modifying files
- Never impose standardized formatting on files with established patterns
- Existing template conventions ALWAYS override these guidelines
Financial models
Color Coding Standards
Unless otherwise stated by the user or existing template
Industry-Standard Color Conventions
- Blue text (RGB: 0,0,255): Hardcoded inputs, and numbers users will change for scenarios
- Black text (RGB: 0,0,0): ALL formulas and calculations
- Green text (RGB: 0,128,0): Links pulling from other worksheets within same workbook
- Red text (RGB: 255,0,0): External links to other files
- Yellow background (RGB: 255,255,0): Key assumptions needing attention or cells that need to be updated
Number Formatting Standards
Required Format Rules
- Years: Format as text strings (e.g., "2024" not "2,024")
- Currency: Use $#,##0 format; ALWAYS specify units in headers ("Revenue ($mm)")
- Zeros: Use number formatting to make all zeros "-", including percentages (e.g., "$#,##0;($#,##0);-")
- Percentages: Default to 0.0% format (one decimal)
- Multiples: Format as 0.0x for valuation multiples (EV/EBITDA, P/E)
- Negative numbers: Use parentheses (123) not minus -123
Formula Construction Rules
Assumptions Placement
- Place ALL assumptions (growth rates, margins, multiples, etc.) in separate assumption cells
- Use cell references instead of hardcoded values in formulas
- Example: Use =B5*(1+$B$6) instead of =B5*1.05
Formula Error Prevention
- Verify all cell references are correct
- Check for off-by-one errors in ranges
- Ensure consistent formulas across all projection periods
- Test with edge cases (zero values, negative numbers)
- Verify no unintended circular references
Documentation Requirements for Hardcodes
- Comment or in cells beside (if end of table). Format: "Source: [System/Document], [Date], [Specific Reference], [URL if applicable]"
- Examples:
- "Source: Company 10-K, FY2024, Page 45, Revenue Note, [SEC EDGAR URL]"
- "Source: Company 10-Q, Q2 2025, Exhibit 99.1, [SEC EDGAR URL]"
- "Source: Bloomberg Terminal, 8/15/2025, AAPL US Equity"
- "Source: FactSet, 8/20/2025, Consensus Estimates Screen"
XLSX creation, editing, and analysis
Overview
A user may ask you to create, edit, or analyze the contents of an .xlsx file. You have different tools and workflows available for different tasks.
Runtime Dependencies
- Requires LibreOffice (
soffice) for formula recalculation via scripts/recalc.py.
git is optional but improves redlining diff output in validation workflows.
- On Windows, dependencies must be installed and available in
PATH; if missing, report the dependency issue and stop (do not keep retrying).
Important Requirements
LibreOffice Required for Formula Recalculation: Use scripts/recalc.py to recalculate formula values. The script auto-configures LibreOffice on first run and handles sandboxed environments where Unix sockets are restricted (via scripts/office/soffice.py).
Reading and analyzing data
Data analysis with pandas
For data analysis, visualization, and basic operations, use pandas which provides powerful data manipulation capabilities:
import pandas as pd
# Read Excel
df = pd.read_excel('file.xlsx') # Default: first sheet
all_sheets = pd.read_excel('file.xlsx', sheet_name=None) # All sheets as dict
# Analyze
df.head() # Preview data
df.info() # Column info
df.describe() # Statistics
# Write Excel
df.to_excel('output.xlsx', index=False)
Excel File Workflows
CRITICAL: Use Formulas, Not Hardcoded Values
Always use Excel formulas instead of calculating values in Python and hardcoding them. This ensures the spreadsheet remains dynamic and updateable.
❌ WRONG - Hardcoding Calculated Values
# Bad: Calculating in Python and hardcoding result
total = df['Sales'].sum()
sheet['B10'] = total # Hardcodes 5000
# Bad: Computing growth rate in Python
growth = (df.iloc[-1]['Revenue'] - df.iloc[0]['Revenue']) / df.iloc[0]['Revenue']
sheet['C5'] = growth # Hardcodes 0.15
# Bad: Python calculation for average
avg = sum(values) / len(values)
sheet['D20'] = avg # Hardcodes 42.5
✅ CORRECT - Using Excel Formulas
# Good: Let Excel calculate the sum
sheet['B10'] = '=SUM(B2:B9)'
# Good: Growth rate as Excel formula
sheet['C5'] = '=(C4-C2)/C2'
# Good: Average using Excel function
sheet['D20'] = '=AVERAGE(D2:D19)'
This applies to ALL calculations - totals, percentages, ratios, differences, etc. The spreadsheet should be able to recalculate when source data changes.
Common Workflow
- Choose tool: pandas for data, openpyxl for formulas/formatting
- Create/Load: Create new workbook or load existing file
- Modify: Add/edit data, formulas, and formatting
- Save: Write to file
- Recalculate formulas (MANDATORY IF USING FORMULAS): Use the scripts/recalc.py script
python scripts/recalc.py output.xlsx
- Verify and fix any errors:
- The script returns JSON with error details
- If
status is errors_found, check error_summary for specific error types and locations
- Fix the identified errors and recalculate again
- Common errors to fix:
#REF!: Invalid cell references
#DIV/0!: Division by zero
#VALUE!: Wrong data type in formula
#NAME?: Unrecognized formula name
Creating new Excel files
# Using openpyxl for formulas and formatting
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
wb = Workbook()
sheet = wb.active
# Add data
sheet['A1'] = 'Hello'
sheet['B1'] = 'World'
sheet.append(['Row', 'of', 'data'])
# Add formula
sheet['B2'] = '=SUM(A1:A10)'
# Formatting
sheet['A1'].font = Font(bold=True, color='FF0000')
sheet['A1'].fill = PatternFill('solid', start_color='FFFF00')
sheet['A1'].alignment = Alignment(horizontal='center')
# Column width
sheet.column_dimensions['A'].width = 20
wb.save('output.xlsx')
Editing existing Excel files
# Using openpyxl to preserve formulas and formatting
from openpyxl import load_workbook
# Load existing file
wb = load_workbook('existing.xlsx')
sheet = wb.active # or wb['SheetName'] for specific sheet
# Working with multiple sheets
for sheet_name in wb.sheetnames:
sheet = wb[sheet_name]
print(f"Sheet: {sheet_name}")
# Modify cells
sheet['A1'] = 'New Value'
sheet.insert_rows(2) # Insert row at position 2
sheet.delete_cols(3) # Delete column 3
# Add new sheet
new_sheet = wb.create_sheet('NewSheet')
new_sheet['A1'] = 'Data'
wb.save('modified.xlsx')
Recalculating formulas
Excel files created or modified by openpyxl contain formulas as strings but not calculated values. Use the provided scripts/recalc.py script to recalculate formulas:
python scripts/recalc.py <excel_file> [timeout_seconds]
Example:
python scripts/recalc.py output.xlsx 30
The script:
- Automatically sets up LibreOffice macro on first run
- Recalculates all formulas in all sheets
- Scans ALL cells for Excel errors (#REF!, #DIV/0!, etc.)
- Returns JSON with detailed error locations and counts
- Works on Linux, macOS, and Windows
Formula Verification Checklist
Quick checks to ensure formulas work correctly:
Essential Verification
Common Pitfalls
Formula Testing Strategy
Interpreting scripts/recalc.py Output
The script returns JSON with error details:
{
"status": "success", // or "errors_found"
"total_errors": 0, // Total error count
"total_formulas": 42, // Number of formulas in file
"error_summary": { // Only present if errors found
"#REF!": {
"count": 2,
"locations": ["Sheet1!B5", "Sheet1!C10"]
}
}
}
Best Practices
Library Selection
- pandas: Best for data analysis, bulk operations, and simple data export
- openpyxl: Best for complex formatting, formulas, and Excel-specific features
Working with openpyxl
- Cell indices are 1-based (row=1, column=1 refers to cell A1)
- Use
data_only=True to read calculated values: load_workbook('file.xlsx', data_only=True)
- Warning: If opened with
data_only=True and saved, formulas are replaced with values and permanently lost
- For large files: Use
read_only=True for reading or write_only=True for writing
- Formulas are preserved but not evaluated - use scripts/recalc.py to update values
Working with pandas
- Specify data types to avoid inference issues:
pd.read_excel('file.xlsx', dtype={'id': str})
- For large files, read specific columns:
pd.read_excel('file.xlsx', usecols=['A', 'C', 'E'])
- Handle dates properly:
pd.read_excel('file.xlsx', parse_dates=['date_column'])
Code Style Guidelines
IMPORTANT: When generating Python code for Excel operations:
- Write minimal, concise Python code without unnecessary comments
- Avoid verbose variable names and redundant operations
- Avoid unnecessary print statements
For Excel files themselves:
- Add comments to cells with complex formulas or important assumptions
- Document data sources for hardcoded values
- Include notes for key calculations and model sections
1---2name: xlsx3description: Xlsx4license: Proprietary5---678# Requirements for Outputs910## All Excel files1112### Professional Font13- Use a consistent, professional font (e.g., Arial, Times New Roman) for all deliverables unless otherwise instructed by the user1415### Zero Formula Errors16- Every Excel model MUST be delivered with ZERO formula errors (#REF!, #DIV/0!, #VALUE!, #N/A, #NAME?)1718### Preserve Existing Templates (when updating templates)19- Study and EXACTLY match existing format, style, and conventions when modifying files20- Never impose standardized formatting on files with established patterns21- Existing template conventions ALWAYS override these guidelines2223## Financial models2425### Color Coding Standards26Unless otherwise stated by the user or existing template2728#### Industry-Standard Color Conventions29- **Blue text (RGB: 0,0,255)**: Hardcoded inputs, and numbers users will change for scenarios30- **Black text (RGB: 0,0,0)**: ALL formulas and calculations31- **Green text (RGB: 0,128,0)**: Links pulling from other worksheets within same workbook32- **Red text (RGB: 255,0,0)**: External links to other files33- **Yellow background (RGB: 255,255,0)**: Key assumptions needing attention or cells that need to be updated3435### Number Formatting Standards3637#### Required Format Rules38- **Years**: Format as text strings (e.g., "2024" not "2,024")39- **Currency**: Use $#,##0 format; ALWAYS specify units in headers ("Revenue ($mm)")40- **Zeros**: Use number formatting to make all zeros "-", including percentages (e.g., "$#,##0;($#,##0);-")41- **Percentages**: Default to 0.0% format (one decimal)42- **Multiples**: Format as 0.0x for valuation multiples (EV/EBITDA, P/E)43- **Negative numbers**: Use parentheses (123) not minus -1234445### Formula Construction Rules4647#### Assumptions Placement48- Place ALL assumptions (growth rates, margins, multiples, etc.) in separate assumption cells49- Use cell references instead of hardcoded values in formulas50- Example: Use =B5*(1+$B$6) instead of =B5*1.055152#### Formula Error Prevention53- Verify all cell references are correct54- Check for off-by-one errors in ranges55- Ensure consistent formulas across all projection periods56- Test with edge cases (zero values, negative numbers)57- Verify no unintended circular references5859#### Documentation Requirements for Hardcodes60- Comment or in cells beside (if end of table). Format: "Source: [System/Document], [Date], [Specific Reference], [URL if applicable]"61- Examples:62 - "Source: Company 10-K, FY2024, Page 45, Revenue Note, [SEC EDGAR URL]"63 - "Source: Company 10-Q, Q2 2025, Exhibit 99.1, [SEC EDGAR URL]"64 - "Source: Bloomberg Terminal, 8/15/2025, AAPL US Equity"65 - "Source: FactSet, 8/20/2025, Consensus Estimates Screen"6667# XLSX creation, editing, and analysis6869## Overview7071A user may ask you to create, edit, or analyze the contents of an .xlsx file. You have different tools and workflows available for different tasks.7273## Runtime Dependencies7475- Requires LibreOffice (`soffice`) for formula recalculation via `scripts/recalc.py`.76- `git` is optional but improves redlining diff output in validation workflows.77- On Windows, dependencies must be installed and available in `PATH`; if missing, report the dependency issue and stop (do not keep retrying).7879## Important Requirements8081**LibreOffice Required for Formula Recalculation**: Use `scripts/recalc.py` to recalculate formula values. The script auto-configures LibreOffice on first run and handles sandboxed environments where Unix sockets are restricted (via `scripts/office/soffice.py`).8283## Reading and analyzing data8485### Data analysis with pandas86For data analysis, visualization, and basic operations, use **pandas** which provides powerful data manipulation capabilities:8788```python89import pandas as pd9091# Read Excel92df = pd.read_excel('file.xlsx') # Default: first sheet93all_sheets = pd.read_excel('file.xlsx', sheet_name=None) # All sheets as dict9495# Analyze96df.head() # Preview data97df.info() # Column info98df.describe() # Statistics99100# Write Excel101df.to_excel('output.xlsx', index=False)102```103104## Excel File Workflows105106## CRITICAL: Use Formulas, Not Hardcoded Values107108**Always use Excel formulas instead of calculating values in Python and hardcoding them.** This ensures the spreadsheet remains dynamic and updateable.109110### ❌ WRONG - Hardcoding Calculated Values111```python112# Bad: Calculating in Python and hardcoding result113total = df['Sales'].sum()114sheet['B10'] = total # Hardcodes 5000115116# Bad: Computing growth rate in Python117growth = (df.iloc[-1]['Revenue'] - df.iloc[0]['Revenue']) / df.iloc[0]['Revenue']118sheet['C5'] = growth # Hardcodes 0.15119120# Bad: Python calculation for average121avg = sum(values) / len(values)122sheet['D20'] = avg # Hardcodes 42.5123```124125### ✅ CORRECT - Using Excel Formulas126```python127# Good: Let Excel calculate the sum128sheet['B10'] = '=SUM(B2:B9)'129130# Good: Growth rate as Excel formula131sheet['C5'] = '=(C4-C2)/C2'132133# Good: Average using Excel function134sheet['D20'] = '=AVERAGE(D2:D19)'135```136137This applies to ALL calculations - totals, percentages, ratios, differences, etc. The spreadsheet should be able to recalculate when source data changes.138139## Common Workflow1401. **Choose tool**: pandas for data, openpyxl for formulas/formatting1412. **Create/Load**: Create new workbook or load existing file1423. **Modify**: Add/edit data, formulas, and formatting1434. **Save**: Write to file1445. **Recalculate formulas (MANDATORY IF USING FORMULAS)**: Use the scripts/recalc.py script145 ```bash146 python scripts/recalc.py output.xlsx147 ```1486. **Verify and fix any errors**: 149 - The script returns JSON with error details150 - If `status` is `errors_found`, check `error_summary` for specific error types and locations151 - Fix the identified errors and recalculate again152 - Common errors to fix:153 - `#REF!`: Invalid cell references154 - `#DIV/0!`: Division by zero155 - `#VALUE!`: Wrong data type in formula156 - `#NAME?`: Unrecognized formula name157158### Creating new Excel files159160```python161# Using openpyxl for formulas and formatting162from openpyxl import Workbook163from openpyxl.styles import Font, PatternFill, Alignment164165wb = Workbook()166sheet = wb.active167168# Add data169sheet['A1'] = 'Hello'170sheet['B1'] = 'World'171sheet.append(['Row', 'of', 'data'])172173# Add formula174sheet['B2'] = '=SUM(A1:A10)'175176# Formatting177sheet['A1'].font = Font(bold=True, color='FF0000')178sheet['A1'].fill = PatternFill('solid', start_color='FFFF00')179sheet['A1'].alignment = Alignment(horizontal='center')180181# Column width182sheet.column_dimensions['A'].width = 20183184wb.save('output.xlsx')185```186187### Editing existing Excel files188189```python190# Using openpyxl to preserve formulas and formatting191from openpyxl import load_workbook192193# Load existing file194wb = load_workbook('existing.xlsx')195sheet = wb.active # or wb['SheetName'] for specific sheet196197# Working with multiple sheets198for sheet_name in wb.sheetnames:199 sheet = wb[sheet_name]200 print(f"Sheet: {sheet_name}")201202# Modify cells203sheet['A1'] = 'New Value'204sheet.insert_rows(2) # Insert row at position 2205sheet.delete_cols(3) # Delete column 3206207# Add new sheet208new_sheet = wb.create_sheet('NewSheet')209new_sheet['A1'] = 'Data'210211wb.save('modified.xlsx')212```213214## Recalculating formulas215216Excel files created or modified by openpyxl contain formulas as strings but not calculated values. Use the provided `scripts/recalc.py` script to recalculate formulas:217218```bash219python scripts/recalc.py <excel_file> [timeout_seconds]220```221222Example:223```bash224python scripts/recalc.py output.xlsx 30225```226227The script:228- Automatically sets up LibreOffice macro on first run229- Recalculates all formulas in all sheets230- Scans ALL cells for Excel errors (#REF!, #DIV/0!, etc.)231- Returns JSON with detailed error locations and counts232- Works on Linux, macOS, and Windows233234## Formula Verification Checklist235236Quick checks to ensure formulas work correctly:237238### Essential Verification239- [ ] **Test 2-3 sample references**: Verify they pull correct values before building full model240- [ ] **Column mapping**: Confirm Excel columns match (e.g., column 64 = BL, not BK)241- [ ] **Row offset**: Remember Excel rows are 1-indexed (DataFrame row 5 = Excel row 6)242243### Common Pitfalls244- [ ] **NaN handling**: Check for null values with `pd.notna()`245- [ ] **Far-right columns**: FY data often in columns 50+ 246- [ ] **Multiple matches**: Search all occurrences, not just first247- [ ] **Division by zero**: Check denominators before using `/` in formulas (#DIV/0!)248- [ ] **Wrong references**: Verify all cell references point to intended cells (#REF!)249- [ ] **Cross-sheet references**: Use correct format (Sheet1!A1) for linking sheets250251### Formula Testing Strategy252- [ ] **Start small**: Test formulas on 2-3 cells before applying broadly253- [ ] **Verify dependencies**: Check all cells referenced in formulas exist254- [ ] **Test edge cases**: Include zero, negative, and very large values255256### Interpreting scripts/recalc.py Output257The script returns JSON with error details:258```json259{260 "status": "success", // or "errors_found"261 "total_errors": 0, // Total error count262 "total_formulas": 42, // Number of formulas in file263 "error_summary": { // Only present if errors found264 "#REF!": {265 "count": 2,266 "locations": ["Sheet1!B5", "Sheet1!C10"]267 }268 }269}270```271272## Best Practices273274### Library Selection275- **pandas**: Best for data analysis, bulk operations, and simple data export276- **openpyxl**: Best for complex formatting, formulas, and Excel-specific features277278### Working with openpyxl279- Cell indices are 1-based (row=1, column=1 refers to cell A1)280- Use `data_only=True` to read calculated values: `load_workbook('file.xlsx', data_only=True)`281- **Warning**: If opened with `data_only=True` and saved, formulas are replaced with values and permanently lost282- For large files: Use `read_only=True` for reading or `write_only=True` for writing283- Formulas are preserved but not evaluated - use scripts/recalc.py to update values284285### Working with pandas286- Specify data types to avoid inference issues: `pd.read_excel('file.xlsx', dtype={'id': str})`287- For large files, read specific columns: `pd.read_excel('file.xlsx', usecols=['A', 'C', 'E'])`288- Handle dates properly: `pd.read_excel('file.xlsx', parse_dates=['date_column'])`289290## Code Style Guidelines291**IMPORTANT**: When generating Python code for Excel operations:292- Write minimal, concise Python code without unnecessary comments293- Avoid verbose variable names and redundant operations294- Avoid unnecessary print statements295296**For Excel files themselves**:297- Add comments to cells with complex formulas or important assumptions298- Document data sources for hardcoded values299- Include notes for key calculations and model sections