officecli-office-automation
Use OfficeCLI to create, read, and edit Word, Excel, and PowerPoint files from the command line with AI-friendly commands.
How do I install this agent skill?
npx skills add https://github.com/reason-machines/devtools-skills --skill officecli-office-automationIs this agent skill safe to install?
- Gen Agent Trust Hubfail
The skill instructs the agent or user to download and execute installation scripts directly from a GitHub repository not associated with a known trusted vendor. This pattern is risky as the remote scripts could be modified to execute malicious code. Additionally, the skill processes external documents, which presents a surface for indirect prompt injection.
- Socketpass
No alerts
- Snykwarn
Risk: MEDIUM · 1 issue
What does this agent skill do?
OfficeCLI Office Automation Skill
Skill by ara.so — Devtools Skills collection.
OfficeCLI is an Office suite purpose-built for AI agents to create, read, and edit Word (.docx), Excel (.xlsx), and PowerPoint (.pptx) files. It's a single binary with no Office installation required, featuring a unified CLI interface and built-in rendering to HTML/PNG.
Installation
macOS / Linux:
curl -fsSL https://raw.githubusercontent.com/iOfficeAI/OfficeCLI/main/install.sh | bash
Windows (PowerShell):
irm https://raw.githubusercontent.com/iOfficeAI/OfficeCLI/main/install.ps1 | iex
Manual installation:
- Download the binary for your platform from GitHub Releases
- Run
officecli installto add to PATH
Verify installation:
officecli --version
Core Commands
File Operations
Create a new document:
# Blank files
officecli create document.docx
officecli create spreadsheet.xlsx
officecli create presentation.pptx
# With initial content
officecli create report.docx --prop title="Q4 Report"
View document content:
# View as outline (tree structure)
officecli view document.docx outline
# View as plain text
officecli view document.docx text
# View as HTML (opens in browser)
officecli view document.docx html
# View as JSON structure
officecli view document.docx json
Get specific elements:
# Get element details as JSON
officecli get document.docx '/paragraph[1]' --json
officecli get spreadsheet.xlsx '$Sheet1:A1' --json
officecli get presentation.pptx '/slide[1]/shape[2]' --json
Live Preview
Watch mode (auto-refresh in browser):
# Start live preview server on http://localhost:26315
officecli watch presentation.pptx
# Custom port
officecli watch presentation.pptx --port 8080
# Every edit you make will auto-refresh the browser
Word Documents (.docx)
Path Syntax
/paragraph[N]- Nth paragraph (1-indexed)/paragraph[N]/run[M]- Mth run in Nth paragraph/table[N]- Nth table/table[N]/row[R]/cell[C]- Cell in table
Add Content
Add paragraphs:
# Simple paragraph
officecli add report.docx / --type paragraph --prop text="Executive Summary"
# Styled paragraph
officecli add report.docx / --type paragraph \
--prop text="Quarterly Revenue Analysis" \
--prop style=Heading1 \
--prop align=center
# With formatting
officecli add report.docx / --type paragraph \
--prop text="Important notice" \
--prop bold=true \
--prop color=FF0000 \
--prop size=14
Add runs (inline formatting):
officecli add report.docx '/paragraph[1]' --type run \
--prop text="bold text" \
--prop bold=true
Add tables:
# 3x3 table
officecli add report.docx / --type table \
--prop rows=3 \
--prop cols=3
# Set cell content
officecli set report.docx '/table[1]/row[1]/cell[1]' \
--prop text="Header 1"
Add images:
officecli add report.docx / --type picture \
--prop src=chart.png \
--prop width=15cm \
--prop height=10cm
Add headers/footers:
# Add header to first section
officecli add report.docx '/section[1]' --type header \
--prop type=default
# Add content to header
officecli add report.docx '/section[1]/header[1]' --type paragraph \
--prop text="Confidential Report" \
--prop align=right
Modify Content
Set paragraph properties:
officecli set report.docx '/paragraph[1]' \
--prop text="Updated title" \
--prop style=Heading1 \
--prop align=center \
--prop spaceBefore=240 \
--prop spaceAfter=120
Set run properties:
officecli set report.docx '/paragraph[2]/run[1]' \
--prop bold=true \
--prop italic=true \
--prop font=Arial \
--prop size=12 \
--prop color=0000FF
Remove Content
# Remove paragraph
officecli remove report.docx '/paragraph[3]'
# Remove table
officecli remove report.docx '/table[1]'
RTL and i18n Support
# RTL paragraph (Arabic, Hebrew)
officecli add report.docx / --type paragraph \
--prop text="مرحبا بك" \
--prop direction=rtl \
--prop lang.cs=ar-SA
# Per-script fonts
officecli add report.docx / --type paragraph \
--prop text="Hello 世界 مرحبا" \
--prop font.latin=Arial \
--prop font.ea="MS Gothic" \
--prop font.cs="Arial Unicode MS"
Excel Spreadsheets (.xlsx)
Cell Addressing
$SheetName:A1- Cell A1 in named sheet$Sheet1:B2:D4- Range B2:D4/sheet[1]/cell[A1]- Path-based addressing
Add Content
Add sheets:
# Add new sheet
officecli add budget.xlsx / --type sheet --prop name="Q1 Budget"
# Add with properties
officecli add budget.xlsx / --type sheet \
--prop name="Summary" \
--prop tabColor=FF0000 \
--prop state=visible
Add cells:
# Simple value
officecli add budget.xlsx '$Sheet1:A1' --type cell \
--prop value="Revenue"
# Number with formatting
officecli add budget.xlsx '$Sheet1:B1' --type cell \
--prop value=125000 \
--prop format='$#,##0.00'
# Formula
officecli add budget.xlsx '$Sheet1:C1' --type cell \
--prop formula='=SUM(B1:B10)'
# Date
officecli add budget.xlsx '$Sheet1:D1' --type cell \
--prop value=2024-01-15 \
--prop format='yyyy-mm-dd'
Batch add cells:
# Multiple cells
officecli add budget.xlsx '$Sheet1:A1' --type cell --prop value="Name"
officecli add budget.xlsx '$Sheet1:B1' --type cell --prop value="Amount"
officecli add budget.xlsx '$Sheet1:A2' --type cell --prop value="Sales"
officecli add budget.xlsx '$Sheet1:B2' --type cell --prop value=50000
Add tables:
# Create table from range
officecli add budget.xlsx '$Sheet1:A1:C10' --type table \
--prop name="SalesData" \
--prop style=TableStyleMedium2 \
--prop showHeader=true
Add charts:
# Column chart
officecli add budget.xlsx '$Sheet1' --type chart \
--prop chartType=column \
--prop dataRange='$Sheet1:A1:B10' \
--prop title="Sales by Region" \
--prop x=5cm \
--prop y=2cm
# Pie chart
officecli add budget.xlsx '$Sheet1' --type chart \
--prop chartType=pie \
--prop dataRange='$Sheet1:A1:B5' \
--prop title="Market Share"
Add pivot tables:
officecli add budget.xlsx '$Sheet2:A1' --type pivottable \
--prop sourceRange='$Sheet1:A1:D100' \
--prop rowFields=Region \
--prop dataFields=Sales \
--prop name="SalesByRegion"
Modify Content
Set cell values:
officecli set budget.xlsx '$Sheet1:A1' --prop value="Updated"
# With formatting
officecli set budget.xlsx '$Sheet1:B2' \
--prop value=75000 \
--prop format='$#,##0.00' \
--prop bold=true \
--prop color=FF0000
Set sheet properties:
officecli set budget.xlsx '/sheet[1]' \
--prop name="Renamed Sheet" \
--prop tabColor=00FF00 \
--prop direction=rtl
Formulas
150+ built-in functions with auto-evaluation:
# Math
officecli add budget.xlsx '$Sheet1:C1' --type cell \
--prop formula='=SUM(A1:A10)'
# Conditional
officecli add budget.xlsx '$Sheet1:D1' --type cell \
--prop formula='=IF(B1>1000,"High","Low")'
# Lookup
officecli add budget.xlsx '$Sheet1:E1' --type cell \
--prop formula='=VLOOKUP(A1,$Sheet2:A:B,2,FALSE)'
# Date functions
officecli add budget.xlsx '$Sheet1:F1' --type cell \
--prop formula='=TODAY()'
Sort Data
# Sort range by column
officecli add budget.xlsx '$Sheet1:A1:C10' --type sort \
--prop key1=B \
--prop order1=desc
# Multi-key sort
officecli add budget.xlsx '$Sheet1:A1:D20' --type sort \
--prop key1=A \
--prop order1=asc \
--prop key2=B \
--prop order2=desc
Conditional Formatting
officecli add budget.xlsx '$Sheet1:B2:B10' --type conditionalformatting \
--prop type=colorScale \
--prop minColor=FF0000 \
--prop maxColor=00FF00
PowerPoint Presentations (.pptx)
Path Syntax
/slide[N]- Nth slide/slide[N]/shape[M]- Mth shape on slide/slide[N]/table[M]- Mth table on slide
Add Content
Add slides:
# Blank slide
officecli add deck.pptx / --type slide
# With title
officecli add deck.pptx / --type slide \
--prop title="Introduction"
# With background
officecli add deck.pptx / --type slide \
--prop title="Dark Theme" \
--prop background=1A1A2E
Add shapes (text boxes):
# Simple text box
officecli add deck.pptx '/slide[1]' --type shape \
--prop text="Hello World" \
--prop x=2cm \
--prop y=3cm \
--prop width=10cm \
--prop height=2cm
# Styled text box
officecli add deck.pptx '/slide[1]' --type shape \
--prop text="Key Findings" \
--prop x=1cm \
--prop y=2cm \
--prop font=Arial \
--prop size=32 \
--prop color=FFFFFF \
--prop bold=true \
--prop align=center
Add images:
# Basic image
officecli add deck.pptx '/slide[1]' --type picture \
--prop src=logo.png \
--prop x=1cm \
--prop y=1cm \
--prop width=5cm \
--prop height=3cm
# With effects
officecli add deck.pptx '/slide[1]' --type picture \
--prop src=photo.jpg \
--prop x=5cm \
--prop y=5cm \
--prop brightness=20 \
--prop contrast=10 \
--prop shadow=true
Add tables:
# Create table
officecli add deck.pptx '/slide[1]' --type table \
--prop rows=3 \
--prop cols=3 \
--prop x=2cm \
--prop y=5cm
# Set cell content
officecli set deck.pptx '/slide[1]/table[1]/row[1]/cell[1]' \
--prop text="Header 1" \
--prop bold=true
Add charts:
officecli add deck.pptx '/slide[1]' --type chart \
--prop chartType=column \
--prop title="Sales Growth" \
--prop x=2cm \
--prop y=5cm \
--prop width=20cm \
--prop height=10cm
Add 3D models:
officecli add deck.pptx '/slide[1]' --type 3dmodel \
--prop src=model.glb \
--prop x=5cm \
--prop y=5cm \
--prop width=10cm \
--prop height=10cm
Slide Transitions and Animations
Add transitions:
officecli set deck.pptx '/slide[2]' \
--prop transition=morph \
--prop duration=1000
Add animations:
officecli add deck.pptx '/slide[1]/shape[1]' --type animation \
--prop effect=fadeIn \
--prop duration=500
Modify Content
Set shape properties:
officecli set deck.pptx '/slide[1]/shape[1]' \
--prop text="Updated text" \
--prop font=Calibri \
--prop size=28 \
--prop color=333333 \
--prop fill=F0F0F0
Set slide properties:
officecli set deck.pptx '/slide[1]' \
--prop title="New Title" \
--prop background=FFFFFF \
--prop hidden=false
Speaker Notes
# Add notes to slide
officecli add deck.pptx '/slide[1]' --type notes \
--prop text="Remember to mention the Q3 results"
Common Patterns
Batch Document Generation
#!/bin/bash
# Generate monthly reports
for month in Jan Feb Mar Apr; do
officecli create "report-${month}.docx"
officecli add "report-${month}.docx" / --type paragraph \
--prop text="${month} Report" \
--prop style=Heading1
officecli add "report-${month}.docx" / --type paragraph \
--prop text="Generated on $(date)"
done
CSV to Excel
# Import CSV data
officecli create data.xlsx
officecli add data.xlsx '$Sheet1' --type import \
--prop src=data.csv \
--prop format=csv
Multi-slide Presentation from Template
#!/bin/bash
# Create presentation with consistent styling
officecli create pitch.pptx
# Title slide
officecli add pitch.pptx / --type slide \
--prop title="Product Launch" \
--prop background=1A1A2E
# Content slides
for topic in "Problem" "Solution" "Market" "Team"; do
officecli add pitch.pptx / --type slide \
--prop title="$topic" \
--prop background=1A1A2E
officecli add pitch.pptx '/slide[-1]' --type shape \
--prop text="Content for $topic" \
--prop x=2cm \
--prop y=5cm \
--prop color=FFFFFF
done
Automated Report with Charts
#!/bin/bash
# Generate Excel report with chart
officecli create sales.xlsx
# Add headers
officecli add sales.xlsx '$Sheet1:A1' --type cell --prop value="Month"
officecli add sales.xlsx '$Sheet1:B1' --type cell --prop value="Revenue"
# Add data
officecli add sales.xlsx '$Sheet1:A2' --type cell --prop value="January"
officecli add sales.xlsx '$Sheet1:B2' --type cell --prop value=50000
officecli add sales.xlsx '$Sheet1:A3' --type cell --prop value="February"
officecli add sales.xlsx '$Sheet1:B3' --type cell --prop value=65000
officecli add sales.xlsx '$Sheet1:A4' --type cell --prop value="March"
officecli add sales.xlsx '$Sheet1:B4' --type cell --prop value=72000
# Add chart
officecli add sales.xlsx '$Sheet1' --type chart \
--prop chartType=line \
--prop dataRange='$Sheet1:A1:B4' \
--prop title="Monthly Revenue" \
--prop x=5cm \
--prop y=2cm
Extract and Transform
#!/bin/bash
# Extract text from Word doc, process, create new doc
# Extract text
text=$(officecli view input.docx text)
# Process (example: convert to uppercase)
processed=$(echo "$text" | tr '[:lower:]' '[:upper:]')
# Create new document
officecli create output.docx
officecli add output.docx / --type paragraph --prop text="$processed"
Integration with Scripts
Python Integration
import subprocess
import json
def create_report(title, content):
"""Create a Word document using OfficeCLI."""
filename = f"{title}.docx"
# Create document
subprocess.run(["officecli", "create", filename])
# Add title
subprocess.run([
"officecli", "add", filename, "/",
"--type", "paragraph",
"--prop", f"text={title}",
"--prop", "style=Heading1"
])
# Add content
for paragraph in content:
subprocess.run([
"officecli", "add", filename, "/",
"--type", "paragraph",
"--prop", f"text={paragraph}"
])
return filename
def get_cell_value(filename, cell):
"""Get cell value from Excel file."""
result = subprocess.run([
"officecli", "get", filename, cell, "--json"
], capture_output=True, text=True)
data = json.loads(result.stdout)
return data.get("attributes", {}).get("value")
# Usage
create_report("Q1 Summary", [
"Revenue increased by 25%.",
"Customer satisfaction improved.",
"New product launch successful."
])
value = get_cell_value("budget.xlsx", "$Sheet1:B2")
print(f"Budget value: {value}")
Node.js Integration
const { execSync } = require('child_process');
function createPresentation(title, slides) {
const filename = `${title}.pptx`;
// Create presentation
execSync(`officecli create "${filename}"`);
// Add slides
slides.forEach(slide => {
execSync(`officecli add "${filename}" / --type slide --prop title="${slide.title}"`);
if (slide.content) {
execSync(`officecli add "${filename}" '/slide[-1]' --type shape --prop text="${slide.content}" --prop x=2cm --prop y=5cm`);
}
});
return filename;
}
function viewAsHTML(filename) {
execSync(`officecli view "${filename}" html`);
}
// Usage
const slides = [
{ title: "Introduction", content: "Welcome to our presentation" },
{ title: "Main Points", content: "Key findings and results" },
{ title: "Conclusion", content: "Thank you" }
];
const file = createPresentation("meeting", slides);
viewAsHTML(file);
Troubleshooting
Binary not found after installation
# Check if binary is in PATH
which officecli
# If not, run install again
officecli install
# Or manually add to PATH
export PATH="$PATH:$HOME/.officecli/bin"
File not opening in Office
# Verify file is valid
officecli view document.docx outline
# Check file wasn't corrupted
file document.docx
# Should show: "Microsoft Word 2007+"
Preview not refreshing in watch mode
# Ensure watch server is running
officecli watch document.docx
# Check if port is blocked
officecli watch document.docx --port 8081
# Clear browser cache or hard refresh (Ctrl+Shift+R / Cmd+Shift+R)
Permission denied errors
# Ensure file isn't open in another program
# Close Office/LibreOffice/other editors
# Check file permissions
ls -l document.docx
chmod 644 document.docx
Invalid path errors
# Verify document structure first
officecli view document.docx outline
# Paths are 1-indexed: /paragraph[1], /slide[1]
# Use --json to see exact paths
officecli get document.docx / --json
Formula not calculating in Excel
# OfficeCLI auto-evaluates 150+ functions
# Unsupported functions show #NAME? error
# Check formula syntax:
officecli get spreadsheet.xlsx '$Sheet1:A1' --json
RTL text not rendering correctly
# Set direction property
officecli set document.docx '/paragraph[1]' \
--prop direction=rtl \
--prop lang.cs=ar-SA
# For complex scripts, set appropriate font
officecli set document.docx '/paragraph[1]' \
--prop font.cs="Arial Unicode MS"
Image not appearing
# Check image path is correct and file exists
ls -l image.png
# Ensure image format is supported (PNG/JPG/GIF/SVG)
file image.png
# Use absolute path if relative path fails
officecli add doc.docx / --type picture --prop src=/full/path/to/image.png
Configuration
OfficeCLI is designed to work out-of-the-box with no configuration needed. All settings are passed as command-line flags.
Common flags:
--json- Output as JSON--port PORT- Custom port for watch server (default: 26315)--prop key=value- Set element properties
Documentation
- Wiki: https://github.com/iOfficeAI/OfficeCLI/wiki
- Word Reference: https://github.com/iOfficeAI/OfficeCLI/wiki/word-paragraph
- Excel Reference: https://github.com/iOfficeAI/OfficeCLI/wiki/excel-cell
- PowerPoint Reference: https://github.com/iOfficeAI/OfficeCLI/wiki/ppt-slide
- i18n Support: https://github.com/iOfficeAI/OfficeCLI/wiki/i18n
- GitHub: https://github.com/iOfficeAI/OfficeCLI
- Discord: https://discord.gg/2QAwJn7Egx
Key Concepts
- XPath-like addressing: All elements use path notation (
/paragraph[1],$Sheet1:A1,/slide[1]/shape[2]) - Unified interface: Same
add,set,get,remove,viewverbs across all formats - Live preview:
watchcommand provides real-time browser preview with auto-refresh - No dependencies: Single binary, no Office installation needed
- AI-first design: Commands optimized for LLM generation and automation
- Format preservation: Edit documents without breaking complex formatting
- Rich i18n: Full RTL support, per-script fonts, locale-aware rendering
When helping users with OfficeCLI, focus on the unified command structure and path-based addressing. The same patterns work across Word, Excel, and PowerPoint with format-specific properties.
How can the creator link this skill?
Add the canonical catalog link to the repository README so users can inspect current installs and available audits. The publishing guide covers the complete discovery path.
<a href="https://skillzs.dev/skills/reason-machines/devtools-skills/officecli-office-automation">View officecli-office-automation on skillZs</a>