Skip to content
Agentmart
Submit a tool

sheetops

Use when reading, validating or changing Excel/CSV data with SheetOps.

Skill by Zalos-io

IndexedMIT★ 1
Write a review

Chalk Labs

Need help deploying sheetops?

Chalk Labs sets up agents like this inside real teams: connected to your tools, tested on your data, with a human in the loop where it matters.

Book a call

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/zalos-io-sheetops

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Use when reading, validating or changing Excel/CSV data with SheetOps.

Use cases: spreadsheets, data, agent-building

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/sheetops

What's inside

Skill name
sheetops
Description
Use when reading, validating or changing Excel/CSV data with SheetOps.
License
MIT
Instructions
256 lines in SKILL.md · view on GitHub

Agent Skills spec issues

  • name: "sheetops" does not match folder "codex"

Files (6)

  • SKILL.md
  • bulk.md · references/
  • cli-profile.md · references/
  • development.md · references/
  • finance-python-legacy.md · references/
  • workbook-operations.md · references/

SKILL.md (first lines)

# SheetOps

## Data-analysis workflow

Use the documented Python APIs below directly on the supplied files. This task
uses an installed spreadsheet library; a successful import in the analysis
script checks availability. The validated read supplies the data evidence.

1. Start the analysis script with the documented imports and the actual reader.
   Use given paths, sheets, header rows, encodings and delimiters. Inspect once
   only when a required source coordinate is unknown.
2. Validate each entire required population, then compute the requested controls
   on the loaded rows. Reuse the receipts and rows for all report fields.
3. Construct and save the requested JSON in that same execution, including its
   requested blocked shape when a control rejects. Print compact findings.

Finish when the requested report is saved and every applicable control has
passed or its blocker is reported. A successful import plus these receipts
completes availability/data checks. Extra package browsing or manual parser
reimplementation adds no control. Use a heredoc or a writable working directory.

For an unexpected API/import error, resolve the specific gap with the callable's
signature/docstring or that command's `--help` in one lookup, then use the actual
reader/validator. Inspect implementation for a reproducible contradiction or
package bug. Invalid input is a reportable blocker, not an API-discovery task.
All tools remain available for a justified investigation; preserve rejection.
Python imports `zalos_sheetops`; CLI: `sheetops`.

## Complete tables: read → profile → report

```python
import json
from pathlib import Path
from zalos_sheetops.io.read_table import read_table
from zalos_sheetops.io.read_csv_table import read_csv_table
from zalos_sheetops.io.read_csv_profile import read_csv_profile
from zalos_sheetops.validation.table_profile import profile_table
from zalos_sheetops.errors import SheetOpsError

try:
    # Choose one reader; None reads the entire population.
    table, receipt = read_csv_profile(Path("source.csv"), key_columns=["reference"],
        amount_columns=["amount"], encoding="auto", delimiter=",")
    # XLSX alternative: read_table(..., max_rows=None), then profile_table(...).
    # Adapt fields/shape to the requested report.
    result = {"row_count": receipt["rowCount"], "totals": receipt["totals"]}
except SheetOpsError as error:
    # Adapt this blocker to the user's requested JSON shape in this same run.
    result = {"status": "blocked", "errorCode": error.error_code, "details": error.details}
Path("result.json").write_text(json.dumps(result, ensure_ascii=False), encoding="utf-8")
print(json.dumps(result, ensure_ascii=False))
```

Readers return `headers` (stripped, lowercased, whitespace collapsed), `rows`, `rowCount`, `returnedRowCount`,
`truncated`. XLSX rows are string lists; CSV rows are dictionaries (CSV also adds
`sourceRows`, `encoding`, `delimiter`). Preserve IDs, amounts, whitespace and
multiline values. Use returned header names (e.g. `reference`, not `Reference`)
in key/amount lists. Resolve a missing column from the loaded `table["headers"]`.
Legacy encodings need an explicit codec; specify CSV delimiters.

`profile_table` checks the complete population, counts, rectangular rows,
nonblank text keys and finite bounded decimal-string amounts. It returns
`validated`, `rowCount`, exact `totals[column]`, and `columns[column]` containing
`first`/`last` (source order), `min`/`max` (lexical), `blankCount`.
Use the requested statistic and loaded rows for other fields. Previews
(`maxRows` CLI / `max_rows` Python) cannot validate totals.

**Report a rejection from its receipt.** `table_width_mismatch` detects populated
unheaded cells, including zero; `details["sheet"]` and `details["row"]` locate the
first offending source row. `invalid_table_values` gives `invalidRecordCount`,
`issueCount`, up to 20 `issues` with record/source-row locations, `issuesTruncated`.
Each issue includes `valueType`; strings add the original `valuePreview` (up to
80 characters) and `valueTruncated`. These are bounded examples; invalid-record
counts still cover the entire population. Use this evidence and the loaded rows
to explain the rejection; investigate another source read only for a concrete gap
or conflicting evidence.
Profile every whole source and collect all invalid-record counts before matching
or filtering. Investigate conflicting evidence or additional required controls;
a documented rejection alone needs no source-code audit. Never discard bad rows.
CLI: `ok: true, data` or `ok: false, errorCode, message, details` with nonzero exit.

For CSV source validation, `read_csv_profile(path, *, key_columns, amount_columns,
encoding="auto", delimiter=",", header_row=1)` returns `(complete_table, receipt)`.
It reuses the same complete-population/value checks, rejects row limits, and adds
`receipt.source`: actual path, SHA-256, headers, encoding, delimiter and row count.
Rejections preserve their codes/counts and include `details.sourceExcerpts` read
independently from original CSV text (up to 3 physical lines / 240 characters per
retained source row, with truncation flags). A changed source blocks the receipt.
Use this source evidence in the read/validate/report program; resolve additional
reads only for a concrete gap or conflicting evidence.

## Dates and bounded cell evidence

For dates, add `value_mode="typed"` to `read_table`: workbook epoch (1900/1904)
and date styles are applied; IDs/amounts retain source strings. Date cells become
datetime strings. With `from datetime import datetime`, a requested date-only
field is `datetime.fromisoformat(value).date().isoformat()`; otherwise keep time.
Raw mode returns serials; typed mode already resolves the epoch.
Typed XML table/cell receipts include `valueMode: "typed"` and `dateSystem:
"1900" | "1904"`. These identify the applied conversion; combine them with the
returned values/formats for date evidence. Investigate only a concrete conflict,
rather than opening workbook XML to redo a successful conversion.


For known coordinates, use this Python API in the same kernel as validation and
reporting. It returns the data dictionary directly (no CLI `ok`/`data` envelope):

```python
import hashlib
import json
from datetime import datetime, timedelta
from decimal import Decimal
from pathlib import Path
from openpyxl.styles.numbers import is_date_format
from openpyxl.utils.cell import get_column_letter, range_boundaries
from zalos_sheetops.io.read_cells import read_cells

# Bind actual sheet/range, column order, header labels and requested record count.
source, sheet, bounds = Path("source.xlsx"), "Data", "A1:C7"

From Zalos-io/zalos-sheetops, MIT.

Signals

Stars
1
Forks
1
Open issues
1
Last commit (this folder)
Oct 20, 2026 (10 days ago)
Last release
Oct 9, 2026 (21 days ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

Done for you

Rather not set it up yourself?

Chalk Labs scopes, builds and runs agents for your team: the task audit, the eval harness, the integrations and the weekly ops report. Fixed scope, priced before we start.

See how we build AI agents →Read the case studies

Chalk Labs is a two-founder AI and growth studio. We build AI agents, CRMs and MVPs for Web3 and AI companies, and have shipped 50+ product and token launches.

launches shipped
50+
launches shipped
media placements
500+
media placements
founders on every account
2
founders on every account

Press we've placed: Forbes · CoinDesk · Decrypt · Cointelegraph · The Block

Rahil Jain, Co-founder, Chalk Labs. Ex-Goldman Sachs engineer. You talk to the person who builds it.

Get sheetops running in your business

Tell us what you want to automate. A founder replies within one working day with a plan, not a pitch deck.

Goes to the Chalk Labs founders, not the newsletter. Privacy

Need help deploying sheetops?

CallGet help
Cite this page

sheetops skill. Agent Mart. https://agentmart.dev/skills/zalos-io-sheetops (last updated 2026-10-24)