WolfPPT - Documentation
How do I refresh a PPTX report and handle WolfPPT refusals?
Use Commercial reporting when an edit must match the exact source package, target identity, and expected old value before publication. Discover supported targets, approve a request, run the reporting operation, and inspect its JSON receipt; public Community editing is a different interface.
Last updated: November 9, 2026.
Discover source facts before choosing business values
The standalone Commercial entry point is python -I -m wolfppt_pro.reporting. The targets operation accepts an input package and emits JSON including source_sha256, charts, table_cells, and narratives. Discovery reports supported source facts; it does not decide which value is revenue, which chart series is the plan, or what the next reporting period should say.
The example creates a synthetic presentation with exactly one non-empty table cell and selects the discovered target with that known old value. This selection is deliberate only because the script controls the source. For a customer deck, inspect the returned targets and choose the approved slide, shape, row, and column explicitly. Do not select a production reporting target from its text alone when unrelated cells can contain the same value.
Bind the request to the unchanged source
The request contains the discovered source hash and a table_cell object. Its identity includes slide_index, shape_id, name, row_index, and column_index; expected_old records the source text. Adding value supplies the caller-formatted replacement. The operation is value-only and does not infer a currency, calculate a total, or select another cell when the original target becomes stale.
Coordinates are zero-based, while shape_id is a positive identity from the source. A name alone is not the target contract. A changed source digest or expected-old mismatch must be treated as a refusal, not an invitation to remove a guard and retry. Rediscovering a changed deck can provide new facts, but approving those facts and replacement values remains the application responsibility.
Complete example
import json
import subprocess
import sys
from pathlib import Path
from wolfppt import Presentation
# Synthetic input with exactly one non-empty table cell.
seed = Presentation()
slide = seed.slides.add_slide(seed.slide_layouts[6])
slide.shapes.add_table(2, 2, 0, 0, 3657600, 914400).table.cell(1, 1).text = "$4.0M"
seed.save("reporting-source.pptx")
base = [sys.executable, "-I", "-m", "wolfppt_pro.reporting"]
found = subprocess.run(
base + ["--operation", "targets", "--input", "reporting-source.pptx"],
check=True, capture_output=True, text=True,
)
targets = json.loads(found.stdout)
target = next(t for t in targets["table_cells"] if t["expected_old"] == "$4.0M")
request = {
"source_sha256": targets["source_sha256"],
"table_cell": {**target, "value": "$4.2M"},
}
Path("table-request.json").write_text(json.dumps(request), encoding="utf-8")
completed = subprocess.run(
base + ["--operation", "table-cell", "--input", "reporting-source.pptx",
"--request", "table-request.json", "--output", "reporting-updated.pptx"],
check=True, capture_output=True, text=True,
)
receipt = json.loads(completed.stdout)
print(receipt["ok"], receipt["changed_parts"], receipt["verified"])
assert Presentation("reporting-updated.pptx").slides[0].shapes[0].table.cell(1, 1).text == "$4.2M"Execute and inspect the receipt
The complete script below requires a matching Commercial installation. It writes the request to a JSON file, invokes table-cell through the same interpreter, reads the receipt, and reopens the output to assert the new cell text. The code was checked against reporting source, target discovery, installed-wheel tests, and refusal tests. It was not executed against a Commercial package in this documentation change.
A successful table-cell receipt has ok, changed_parts, and verified fields. The narrow operation checks the selected value and preservation of non-target content before publication. The source tests also exercise stale hashes, stale values, and a non-table target while preserving an existing destination. Keep the receipt as operation evidence, not as a claim that unrelated visual or schema checks ran.
Treat refusals as decisions, not warnings to suppress
The standalone reporting documentation specifies exit code two for invalid or unsupported requests. subprocess.run(check=True) raises on a nonzero result, so this script stops rather than printing a success message for a refused update. An application should retain its approved source and request, capture the failure output, and decide whether the template or business mapping needs correction.
Table-cell refresh does not batch cells, add rows, or recalculate a chart workbook. Other Commercial reporting operations have their own schemas and boundaries. Do not combine fields from another operation into this request or assume that a supported ordinary facade edit automatically becomes a guarded reporting target. Finally, package verification does not establish text fit or Microsoft PowerPoint rendering parity; those require the applicable separate workflow and evidence.
Evaluation boundary
Keep the approved JSON request with the operation evidence if your retention policy allows it. It may contain source text and business values, so treat it as document data rather than harmless debug output. A receipt and an approved request answer different questions: what was authorized, and what the operation reports that it published.
Parameters and contracts
| Field | Required source-bound meaning |
|---|---|
source_sha256 | Digest returned by discovery for the unchanged source. |
slide_index, shape_id, name | The selected slide and table shape identity. |
row_index, column_index | Zero-based cell coordinates. |
expected_old | The selected current non-empty string. |
value | The approved replacement non-empty string. |
What it does not do
- This workflow requires Commercial; it is not in the public 0.1.6 Community installation.
- The sample selects a known old value only in its controlled synthetic input.
- Table-cell does not batch cells, add table structure, or perform spreadsheet calculation.
- A reporting receipt is not a render or native PowerPoint appearance result.
Get WolfPPT Commercial
WolfPPT Commercial is an organization-scoped subscription at $500 per year or $50 per month for one legal organization, not per developer. The public MIT Community package is on public PyPI. WolfPPT Commercial installs the wolfppt-pro add-on from the authenticated WolfPPT package index with a per-purchase credential, issued on the checkout success page after payment and reissued through https://wolfxl.com/recover.
pip install wolfppt-pro --index-url https://packages.wolfxl.com/wolfppt/simple/The public WolfPPT Community release is MIT-licensed and free, including commercial use. WolfPPT Commercial does not change those rights.
Related tasks
- Update text in an existing PowerPoint deck with Python
- Update a table in an existing PowerPoint deck with Python
- Update chart data in an existing PowerPoint deck with Python
- Convert PPTX to PDF in Python without PowerPoint or LibreOffice: Wolf Runtime workflow (commercial or evaluation, not in the pip package)
- python-pptx limitations, and an alternative for editing existing PowerPoint decks
- Copy slides from one PowerPoint deck to another in Python without losing theme fonts
- Which Python library supports programmatic pitch deck generation with native charts and shapes?
- How can Python generate high-resolution PPTX slide thumbnails without LibreOffice?
- How do I fix python-pptx placeholder KeyError when editing slide master layouts?
- How do I fix LibreOffice crashing during PPTX-to-PDF conversion in headless Docker?