
Excel Heredoc Workaround
- 3 installs
- 7.3k repo stars
- Updated July 27, 2026
- hkuds/openspace
Create formatted Excel files with openpyxl by falling back to run_shell with an inline Python heredoc when execute_code_sandbox fails.
About
Provides a run_shell heredoc workaround for building styled .xlsx files with openpyxl when sandbox execution fails. A developer uses it when they need reliable Excel output with formatting despite sandbox errors.
- run_shell Python heredoc with headers, borders, auto-width
- Read-back verification of the generated xlsx
Excel Heredoc Workaround by the numbers
- 3 all-time installs (skills.sh)
- Ranked #541 of 687 Office & Documents skills by installs in the Skillselion catalog
- Data as of Aug 4, 2026 (Skillselion catalog sync)
npx skills add https://github.com/hkuds/openspace --skill excel-heredoc-workaroundAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 3 |
|---|---|
| repo stars | ★ 7.3k |
| Last updated | July 27, 2026 |
| Repository | hkuds/openspace ↗ |
What it does
Create formatted Excel files with openpyxl by falling back to run_shell with an inline Python heredoc when execute_code_sandbox fails.
Files
Excel Heredoc Workaround
Purpose
When creating Excel files with openpyxl, execute_code_sandbox may fail due to environment issues. This skill provides a robust workaround: fall back to run_shell with inline Python heredoc scripts to create properly formatted spreadsheets with styling.
When to Use
- You need to create
.xlsxfiles with openpyxl execute_code_sandboxfails with openpyxl-related errors- You need styling, formatting, or complex spreadsheet features
- Direct shell execution with Python heredoc is available
Step-by-Step Instructions
Step 1: Attempt execute_code_sandbox First
Try creating the Excel file using execute_code_sandbox:
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, PatternFill
wb = Workbook()
ws = wb.active
ws.title = "Data"
# Add data and styling
ws['A1'] = "Header"
ws['A1'].font = Font(bold=True)
wb.save("output.xlsx")
print("ARTIFACT_PATH:output.xlsx")Step 2: If Sandbox Fails, Use run_shell with Heredoc
When execute_code_sandbox fails, switch to run_shell with a Python heredoc:
python3 << 'EOF'
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, PatternFill, Border, Side
# Create workbook
wb = Workbook()
ws = wb.active
ws.title = "Schedule"
# Add headers with styling
headers = ["Task", "Date", "Status", "Priority"]
for col, header in enumerate(headers, 1):
cell = ws.cell(row=1, column=col, value=header)
cell.font = Font(bold=True, size=12)
cell.fill = PatternFill(start_color="4472C4", end_color="4472C4", fill_type="solid")
cell.font = Font(bold=True, color="FFFFFF")
cell.alignment = Alignment(horizontal="center")
# Add data rows
data = [
["Cleanup Zone A", "2024-01-15", "Pending", "High"],
["Cleanup Zone B", "2024-01-16", "Complete", "Medium"],
]
for row_idx, row_data in enumerate(data, 2):
for col_idx, value in enumerate(row_data, 1):
cell = ws.cell(row=row_idx, column=col_idx, value=value)
cell.alignment = Alignment(horizontal="left")
# Adjust column widths
for col in ws.columns:
max_length = 0
column = col[0].column_letter
for cell in col:
try:
if len(str(cell.value)) > max_length:
max_length = len(str(cell.value))
except:
pass
ws.column_dimensions[column].width = max_length + 2
# Save the file
wb.save("Cleanup_Schedule.xlsx")
print("Created Cleanup_Schedule.xlsx successfully")
EOFStep 3: Verify File Creation
After running the heredoc script, verify the file was created:
ls -lh *.xlsxStep 4: Optional - Read Back to Confirm
Use read_file to confirm the Excel file is valid:
read_file with filetype="xlsx", file_path="Cleanup_Schedule.xlsx"Key Advantages
| Aspect | execute_code_sandbox | run_shell heredoc |
|---|---|---|
| Reliability | May fail with openpyxl | More stable execution |
| Styling support | Limited | Full openpyxl support |
| File output | Via ARTIFACT_PATH | Direct file write |
| Debugging | Limited output | Full stdout/stderr |
Common Styling Patterns
Bold Headers with Colored Background
from openpyxl.styles import Font, PatternFill
header_fill = PatternFill(start_color="4472C4", end_color="4472C4", fill_type="solid")
header_font = Font(bold=True, color="FFFFFF", size=12)
cell = ws.cell(row=1, column=1, value="Header")
cell.fill = header_fill
cell.font = header_fontAlternating Row Colors
from openpyxl.styles import PatternFill
gray_fill = PatternFill(start_color="D9D9D9", end_color="D9D9D9", fill_type="solid")
for row in range(2, ws.max_row + 1):
if row % 2 == 0:
for col in range(1, ws.max_column + 1):
ws.cell(row=row, column=col).fill = gray_fillBorders and Alignment
from openpyxl.styles import Border, Side, Alignment
thin_border = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)
for row in ws.iter_rows():
for cell in row:
cell.border = thin_border
cell.alignment = Alignment(horizontal="center", vertical="center")Troubleshooting
Issue: File not created after heredoc execution
- Fix: Check stdout for Python errors; ensure working directory is correct
Issue: openpyxl not found
- Fix: Install with
pip install openpyxlbefore running heredoc
Issue: Styling not appearing
- Fix: Ensure you save the workbook after applying all styles
Example Complete Workflow
# Create Excel with full styling
python3 << 'EOF'
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, PatternFill, Border, Side
wb = Workbook()
ws = wb.active
ws.title = "Report"
# Header row
headers = ["ID", "Name", "Value", "Date"]
for col, h in enumerate(headers, 1):
cell = ws.cell(row=1, column=col, value=h)
cell.font = Font(bold=True, color="FFFFFF")
cell.fill = PatternFill(start_color="2F5597", fill_type="solid")
cell.alignment = Alignment(horizontal="center")
# Data
ws.append([1, "Item A", 100, "2024-01-01"])
ws.append([2, "Item B", 200, "2024-01-02"])
# Apply borders
thin = Side(style='thin')
border = Border(left=thin, right=thin, top=thin, bottom=thin)
for row in ws.iter_rows():
for cell in row:
cell.border = border
# Auto-width columns
for col in ws.columns:
col_letter = col[0].column_letter
max_len = max(len(str(cell.value)) if cell.value else 0 for cell in col)
ws.column_dimensions[col_letter].width = min(max_len + 2, 50)
wb.save("Report.xlsx")
print("Success: Report.xlsx created")
EOFexcel-heredoc-workaround__v0_fb015d1a