Agent skill

Spreadsheet QA

by OneWave-AI in OneWave-AI/claude-skills

Answers business questions about the user's own spreadsheet or data export (CSV, TSV, XLSX from a CRM, Shopify, Stripe, QuickBooks, ad platforms, HR or payroll systems) correctly and auditably.

MITAuto-check passedDocuments & Office

Install Spreadsheet QA

skills CLI
$ npx skills add OneWave-AI/claude-skills --skill spreadsheet-qa -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install OneWave-AI/claude-skills spreadsheet-qa --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/OneWave-AI/claude-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/spreadsheet-qa .claude/skills/spreadsheet-qa && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
spreadsheet-qa
GitHub stars
323
Token cost
~2.2k tokens
SKILL.md length
1,088 words
Files
18 (incl. scripts, references)
Skills in repo
70
Repo updated
First seen
Licence
MIT

At a glance

Answers business questions about the user's own spreadsheet or data export (CSV, TSV, XLSX from a CRM, Shopify, Stripe, QuickBooks, ad platforms, HR or payroll systems) correctly and auditably.

  • Works in 5 steps: Profile before answering anything → Pin the metric definition, then proceed → Compute in code only → …
  • Says analyze this spreadsheet
  • SKILL.md covers Workflow, Editing data safely and Testing
  • Runs Python scripts from its folder; calls python3 and pip

What it does

Spreadsheet QA is an agent skill from OneWave-AI/claude-skills. Answers business questions about the user's own spreadsheet or data export (CSV, TSV, XLSX from a CRM, Shopify, Stripe, QuickBooks, ad platforms, HR or payroll systems) correctly and auditably. Profiles every file first (grain, duplicate keys, embedded Grand Total rows, text-stored numbers, mixed currencies, UTC timestamps, Excel serial dates, hidden rows), states the metric definition used, computes every number in SQL or pandas instead of mental math, checks joins for fan-out, reconciles to a known total, and…

Its SKILL.md is about 2.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 22 other files, including scripts and reference files (for example `references/metric-definitions.md`, `references/traps.md` and `scripts/ask.py`).

It sits in Documents & Office, covering Excel spreadsheets and CSV and tabular files. It works with Microsoft Excel, SQL, pandas and Shopify. The repository describes itself as: 200+ production-ready Claude Code skills for sales, marketing, design, engineering, and AI agent architecture. Built and maintained by OneWave AI. The licence is MIT.

When your agent uses it

  • Says analyze this spreadsheet
  • Whats the total in this export
  • Which customers...
  • Revenue by month

Example prompts

  • “analyze this spreadsheet”
  • “how many...”
  • “s the total in this export”
  • “/spreadsheet-qa”

Requirements

  • Python 3

Workflow steps

5 steps, taken from the step headings in SKILL.md.

  1. Profile before answering anything
  2. Pin the metric definition, then proceed
  3. Compute in code only
  4. Reconcile
  5. Answer with an evidence block

What it can do on your machine

Read from SKILL.md and the folder at commit fc5b785. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships 3 files in scripts/ (Python, from the files we listed), which the agent can run.

    Shell commands in SKILL.md call:

    • python3
    • pip

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use pip, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Spreadsheet QA loads about 2.2k tokens when it runs, and up to ~5.7k if it reads all its reference files. Until then it costs about 234 tokens; SKILL.md has 1,088 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~234
When it runs · the whole SKILL.md, loaded when a task matches
~2.2k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~5.7k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.

SKILL.md

The full file from OneWave-AI/claude-skills at commit fc5b785, republished under its MIT licence (© OneWave-AI). 1,088 words, ~2,154 tokens.

Download SKILL.mdSave it as .claude/skills/spreadsheet-qa/SKILL.md (or your agent's skills folder). This skill also uses 17 other files; get the full folder from GitHub.
name
spreadsheet-qa
description
Answers business questions about the user's own spreadsheet or data export (CSV, TSV, XLSX from a CRM, Shopify, Stripe, QuickBooks, ad platforms, HR or payroll systems) correctly and auditably. Profiles every file first (grain, duplicate keys, embedded Grand Total rows, text-stored numbers, mixed currencies, UTC timestamps, Excel serial dates, hidden rows), states the metric definition used, computes every number in SQL or pandas instead of mental math, checks joins for fan-out, reconciles to a known total, and returns the query, filters, row counts, and rows behind the answer. Use this whenever the user says "analyze this spreadsheet", "how many...", "what's the total in this export", "which customers...", "pivot this", "revenue by month", "top 10", "what's our churn/MRR/AOV", or asks any question about their data, CSV, or Excel file, even a quick one. Also use when they ask to change values in a data file.

Spreadsheet QA

Business exports lie quietly. A "Grand Total" row doubles every SUM. A customer listed twice multiplies their orders through a join. EUR and USD sit in one amount column. A UTC timestamp at 02:30 on Aug 1 is a July order in New York. None of these raise an error, so an answer computed by eye or by one quick query looks right and is wrong. This skill makes every number reproducible: profile, define, compute in code, reconcile, show the evidence.

Scope: questions about the data in the file. To combine or dedupe several files into one first, use csv-excel-merger. To check whether a financial model's formulas are sound, use spreadsheet-model-auditor.

Workflow

1. Profile before answering anything
bash
python3 scripts/profile.py path/to/*.csv path/to/book.xlsx --out sqa_out

Read sqa_out/profile.md. It reports, per file and sheet: header row, row count, candidate keys, duplicate keys, each column's type and parse rate, null %, distinct count, min/max, top values, currency and timezone hints, date ranges, embedded total/footer rows, hidden rows/columns, autofilters, merged cells, and a join-risk section predicting fan-out between files. It also drafts data_dictionary.md with open questions.

Why first: the traps above are visible only in the profile. Once a query has run, nobody rereads the raw rows. Do this even for "just give me the total": the total is the question most exposed to embedded total rows.

State the grain in one line per table ("one row = one order; key order_id") before writing a query. If no key is unique, say what one row is before counting anything.

2. Pin the metric definition, then proceed

Look up the metric in references/metric-definitions.md. If different definitions give materially different answers, list the one to three that matter, pick a stated default, and continue. Do not stall waiting for an answer. Example:

Using net revenue = paid orders minus refunds against them, in USD at the rates in fx_rates.csv, by UTC date. By refund date instead: 8,710. Gross: 9,020. Say if you want one of those.

Ask before computing only when the choice is unknowable and decisive: which of two amount columns is the real one, which currency to report in when no rates exist, or what "active" means when the file has no activity dates.

Never invent a definition silently. "Active customer", "revenue", "churn", and "conversion" each have several; the answer must name the one used.

3. Compute in code only

Write a question spec (JSON steps) and run it:

bash
python3 scripts/ask.py spec.json --out sqa_out/q1

Each step is one SQL view built on the previous ones, with a kind: clean (cast text, drop total rows), filter, join, dedupe, derive, aggregate (last step is the answer). ask.py counts rows before and after every step, fails the run when a join grows rows (fan-out) and warns when one drops rows, runs assert_zero checks (e.g. "amounts that failed to parse"), and writes answer.md, query.sql, steps.json, and rows_used.csv. Worked specs covering all of this: tests/questions/*.json. Copy the closest one.

Rules:

  • Every source column loads as text. Cast explicitly with to_num() (handles "$1,200.00", "(35.00)", "12%") and excel_date(), and assert that nothing failed to parse. Auto-typing is how "$1,200" becomes NULL without anyone noticing.
  • Exclude embedded total, subtotal, and footer rows in the first clean step and let the row count show it.
  • Dedupe lookup tables (customers, products) before joining, or aggregate the many side first (refunds per order). Use LEFT JOIN and count unmatched rows instead of letting an inner join drop them.
  • Convert currencies through an explicit rate table and assert every row found a rate. If there are no rates, report per currency.
  • Convert timestamps to the reporting timezone before bucketing by day, week, or month: CAST(ts AS TIMESTAMPTZ) AT TIME ZONE 'America/New_York'.
  • Recompute rates (CTR, margin %, conversion) from summed parts. Never average row-level rates.
  • No mental math, including "quick" sums in prose. If a number appears in the answer, it came from a query output. Differences, percentages, and "X more than last month" too: add them as a step.
  • DuckDB is the engine (pip install duckdb). Without it, ask.py falls back to SQLite, which lacks timezone functions; or use pandas and print the same row counts yourself.

For a one-off exploratory look, ask.py --table orders=orders.csv --sql "SELECT ..." works, but the final answer comes from a spec with the full step accounting.

Show full SKILL.md (387 more words)Show less
4. Reconcile

Before reporting, tie the number to something independent. Add a reconcile entry to the spec:

  • the export's own total row (your parsed sum must equal it)
  • a total the user quoted, or one from the source system's dashboard
  • the ungrouped total (grouped rows must sum to it; this is what catches fan-out)
  • a second route to the same number (net = gross - refunds computed separately)

If it does not reconcile, the answer is not ready. Find the gap (usually filters, a hidden row, a timezone edge, or a status value) and say what explains it. Filtered views are a common cause: ask which filters the user's reference number used. references/traps.md lists the usual culprits.

5. Answer with an evidence block

Lead with the number and the definition in one or two sentences, then the evidence:

Net revenue, Q3 2026: $8,260.00 (USD, paid orders minus refunds against them, UTC dates)

Evidence
- Source: orders.csv (17 rows), refunds.csv (3), fx_rates.csv (3)
- Filters: dropped 1 Grand Total row (17 -> 16); status = paid, created Jul 1-Sep 30 UTC (16 -> 13)
- Joins: FX rates (13 -> 13, all matched); refunds pre-summed per order (13 -> 13)
- Reconciled: parsed amounts = the export's own Grand Total (9,700); net = gross 9,020 - refunds 760
- Other definitions: by refund date 8,710; gross 9,020
- Caveats: one fixed FX rate per currency, not transaction-date rates
- Query and rows: sqa_out/q1/query.sql, sqa_out/q1/rows_used.csv

Show sample rows when the user asks "which" (which customers, which orders): list the rows themselves, not only a count. Keep the evidence block even when the user wants a quick answer. It is five lines and it is what lets them trust or challenge the number.

Editing data safely

When asked to change values in a file (fix a price, update a status, correct an invoice line):

  1. Copy the original first. Never edit the only copy.
  2. Change only the targeted cells, addressed by a unique key and column name, never by row position or by rewriting the whole file from memory. Re-emitting a full table from context is how an edit to one invoice line also changes the bank account number on another.
  3. Diff before and after for every other column:
bash
python3 scripts/diff_edit.py original.csv edited.csv --key invoice_id --allow amount --rows INV-7

It lists every changed cell and exits 1 if anything outside the allowed columns and rows changed, or if rows or columns appeared or disappeared. Show the user the diff. For .xlsx, edit with openpyxl on the specific cells so formulas and formatting survive, then run the same diff on the sheet.

Testing

python3 tests/run_tests.py rebuilds the fixtures (orders with a Grand Total row, text amounts, three currencies and UTC timestamps; customers with a duplicated key; refunds; an xlsx with a title row, serial dates, a hidden row, and a Total row), checks that the profile catches every trap, answers four questions against hand-computed values, confirms the naive join is caught, and checks the edit diff.

© OneWave-AI, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 17 other files (scripts, references) in spreadsheet-qa of OneWave-AI/claude-skills.

  • SKILL.md
  • references/metric-definitions.md
  • references/traps.md
  • scripts/ask.py
  • scripts/diff_edit.py
  • scripts/profile.py
  • tests/build_fixtures.py
  • tests/fixtures/customers.csv
  • tests/fixtures/fx_rates.csv
  • tests/fixtures/orders.csv
  • tests/fixtures/pipeline.xlsx
  • tests/fixtures/refunds.csv
  • tests/questions/q1_net_revenue.json
  • tests/questions/q2_august_ny.json
  • tests/questions/q3_naive_fanout.json
  • tests/questions/q3_segment_revenue.json
  • … and 2 more

Open the folder on GitHubat commit fc5b785

Compare with similar skills

Spreadsheet QA next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Spreadsheet QA compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Spreadsheet QA this skillOneWave-AI/claude-skills323—~2.2kAutomated safety check: PassMIT
XLSXmateaix/mateclaw1.1k—~1.5kAutomated safety check: PassProprietary
Rust SQL Testshencangsheng/easydb_app590—~1.2kAutomated safety check: PassMIT
File Format Conversionpipeshub-ai/pipeshub-ai3.8k—~865Automated safety check: PassApache-2.0
Create Spreadsheettheexperiencecompany/gaia308—~802Automated safety check: PassCustom licence
Spreadsheetdavila7/claude-code-templates32k1 repos~1.3kAutomated safety check: NotesApache-2.0

Similar skills

  • XLSX

    mateaix/mateclaw

    Use this skill any time a spreadsheet file is the primary input or output.

    1.1k GitHub stars~1.5k tokensUpdated 3 days ago
    Documents & OfficeAuto-check passed
  • Rust SQL Test

    shencangsheng/easydb_app

    Enforces unit test requirements for the Rust data-processing modules in src-tauri/src/sql/ (generator.rs, parse.rs) and src-tauri/src/reader/ (excel.rs and other readers).

    590 GitHub stars~1.2k tokensUpdated 1 mo ago
    Documents & OfficeAuto-check passed
  • File Format Conversion

    pipeshub-ai/pipeshub-ai

    Picks the right library for converting between CSV, XLSX, JSON, images, DOCX and PDF text, and lists the conversions that are not supported so the agent does not attempt them.

    3.8k GitHub stars~865 tokensUpdated today
    Documents & OfficeAuto-check passed
  • Create Spreadsheet

    theexperiencecompany/gaia

    Generate an Excel (.xlsx) workbook or a CSV file: tables, financial models, data exports, formatted reports with charts.

    308 GitHub stars~802 tokensUpdated today
    Documents & OfficeAuto-check passed
  • Spreadsheet

    davila7/claude-code-templates

    A skill your agent uses when tasks involve creating, editing, analyzing, or formatting spreadsheets (.xlsx, .csv, .tsv) using Python (openpyxl, pandas), especially when formulas, references, and…

    32k GitHub starsUsed in 1 repo~1.3k tokens
    Documents & OfficeAuto-check: notes
  • Streaming Export Safety

    doccker/cc-use-exp

    当代码涉及 Excel/CSV/JSON/PDF 大文件导出、批量序列化、内存里构建大对象时触发。防止 OOM、临时文件残留、同步导出阻塞 HTTP 线程等内存安全陷阱。

    1.1k GitHub stars~1.9k tokensUpdated 1 mo ago
    Documents & OfficeAuto-check passed

More from OneWave-AI/claude-skills

All 70 skills in this repo
  • CRM Data Cleanup

    OneWave-AI/claude-skills

    Finds duplicate and junk records in a CRM CSV export with fuzzy matching, normalizes fields and writes a reviewable merge plan plus import-ready files without touching the live CRM.

    323 GitHub starsUsed in 1 repo~2.5k tokens
    Auto-check passed
  • Design Export Repair

    OneWave-AI/claude-skills

    Repairs broken decks and PDFs exported from Claude Design or similar AI deck generators: clipped text, wrong fonts and corrupted .pptx package structure.

    323 GitHub stars~2.6k tokensUpdated 6 days ago
    Auto-check passed
  • Bi Measure Builder

    OneWave-AI/claude-skills

    Writes, explains, debugs, and optimizes BI calculations - Power BI / Fabric DAX measures and calculated columns, Tableau calculated fields (FIXED/INCLUDE/EXCLUDE LOD expressions, table…

    323 GitHub stars~2.2k tokensUpdated 6 days ago
    Auto-check passed
  • Bookkeeping Close

    OneWave-AI/claude-skills

    Categorizes transactions, reconciles bank and card statements to the ledger, works a month-end checklist and prepares a close package, without ever forcing a balance.

    323 GitHub stars~2k tokensUpdated 6 days ago
    Auto-check passed
  • CSV and Excel Merger

    OneWave-AI/claude-skills

    Combines CSV, TSV and Excel files into one verified table with pandas, by stacking or joining, mapping columns, normalizing keys and removing duplicates.

    323 GitHub stars~1.6k tokensUpdated 6 days ago
    Auto-check passed
  • Sec Filing Puller

    OneWave-AI/claude-skills

    Pulls financial statement numbers for US public companies straight from SEC EDGAR's free official XBRL APIs (companyfacts, companyconcept, frames, submissions) into a cited table.

    323 GitHub stars~2.1k tokensUpdated 6 days ago
    Auto-check passed

Questions about Spreadsheet QA

What does Spreadsheet QA do?

Answers business questions about the user's own spreadsheet or data export (CSV, TSV, XLSX from a CRM, Shopify, Stripe, QuickBooks, ad platforms, HR or payroll systems) correctly and auditably. Spreadsheet QA is an agent skill from OneWave-AI/claude-skills. Answers business questions about the user's own spreadsheet or data export (CSV, TSV, XLSX from a CRM, Shopify, Stripe, QuickBooks, ad platforms, HR or payroll systems) correctly and auditably.

When should I use Spreadsheet QA?

Spreadsheet QA fits situations like: says analyze this spreadsheet; whats the total in this export; which customers..; revenue by month.

How do I install Spreadsheet QA in Claude Code?

Run `npx skills add OneWave-AI/claude-skills --skill spreadsheet-qa -a claude-code`. Or copy the skill folder (spreadsheet-qa in OneWave-AI/claude-skills) into .claude/skills/spreadsheet-qa in your project. Claude Code loads it when a task matches its description.

How do I install Spreadsheet QA in Codex?

Run `npx skills add OneWave-AI/claude-skills --skill spreadsheet-qa -a codex`. Or copy the skill folder (spreadsheet-qa in OneWave-AI/claude-skills) into .agents/skills/spreadsheet-qa in your project. Codex loads it when a task matches its description.

Can I use Spreadsheet QA in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add OneWave-AI/claude-skills --skill spreadsheet-qa -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/spreadsheet-qa, .gemini/skills/spreadsheet-qa, .github/skills/spreadsheet-qa and .opencode/skills/spreadsheet-qa in your project.

What does Spreadsheet QA need to run?

Going by SKILL.md and its folder, Spreadsheet QA needs Python for the scripts in its folder and the command-line tools its instructions call (python3 and pip). Our summary lists: Python 3.

Does Spreadsheet QA access the network?

SKILL.md contains no URLs. Its commands use pip, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Spreadsheet QA safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Spreadsheet QA use?

Spreadsheet QA is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Spreadsheet QA use?

About 2.2k tokens (SKILL.md is roughly 8.6k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 3.5k tokens, read only when the agent opens those files.

What are the alternatives to Spreadsheet QA?

Skills that share tags, products or a category with Spreadsheet QA: XLSX (mateaix/mateclaw, 1.1k stars), Rust SQL Test (shencangsheng/easydb_app, 590 stars), File Format Conversion (pipeshub-ai/pipeshub-ai, 3.8k stars) and Create Spreadsheet (theexperiencecompany/gaia, 308 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Spreadsheet QA?

OneWave-AI (a GitHub organization) maintains it in OneWave-AI/claude-skills, which has 323 GitHub stars. The repository holds 70 skills in this directory. The repository was last updated on October 2, 2026.

Source: OneWave-AI/claude-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.