llamacloud-sheets
Skill0 starsChanged 5 months agoMITView on GitHub
This skill should be used when the user wants to "extract from spreadsheets", "use LlamaCloud Sheets", "reason over spreadsheet rows", or "pull tables from messy Excel/CSV" — detecting table regions in disorganized workbooks and turning them into normalized rows. Owns spreadsheet table extraction and its output format; defers typed field extraction from documents to `llamacloud-extract`, raw text to `llamacloud-parse`, and account/key setup to core `llamacloud`.
In this repository12 other files it gives its agents.
- liteparseSkill
- llamacloud-classifySkill
- llamacloud-extractSkill
- llamacloud-indexSkill
- llamacloud-parseSkill
- llamacloud-self-hostingSkill
- llamacloudSkill
- llamacloud-splitSkill
- llamaindex-cookbooksSkill
- llamaindex-deploySkill
- llamaindex-frameworkSkill
- llamaindex-workflowsSkill
The file
We split this skill into the rules it gives an agent
3 rules. About 0 are common, 3 are distinctive, and 0 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 21
Use Sheets when the source is a spreadsheet and the deliverable is rows/tables, not a fixed set of typed fields:
- Distinctive: line 60
Create-job config is optional, and the defaults (parse all sheets, generate region/sheet metadata) are sensible.
- Distinctive: line 69
Look up the exact config field names and defaults live (MCP) before relying on them.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
LlamaCloud Sheets — messy spreadsheets → reasoned-over rows
LlamaCloud Sheets (LlamaSheets) takes a disorganized .xlsx / .csv — stacked tables, header
banners, merged cells, notes scattered around the grid — and finds the table regions, normalizes
each into a clean typed table, and returns the result as Parquet. The point is to get from a
human-formatted workbook to rows a program can load and reason over (Pandas, Polars, DuckDB) without
hand-writing range parsing.
Sheets is beta. Set that expectation up front: the API surface lives under a beta namespace,
throughput and sheet size are capped (see Limits), and signatures can shift. Treat it as production-
viable for batch/offline normalization, not yet as a hardened low-latency path.
When Sheets is the right tool
Use Sheets when the source is a spreadsheet and the deliverable is rows/tables, not a fixed set of typed fields:
- A workbook where the real table doesn't start at A1 — there's a title banner, a logo, blank rows,
then the grid. Sheets locates the region (e.g.
A4:H230) for you. - One sheet holding several stacked tables with gaps between them — Sheets returns each as a separate region.
- You want to aggregate / filter / join the rows afterward (group by, sum, dedupe) — Parquet loads straight into Pandas/Polars/DuckDB with types preserved.
- You need cell-level metadata (formatting, position, detected type) to infer structure — e.g. bold first row = header, currency-formatted column = amount.
Reach for a sibling instead when:
- The source is a PDF / scan / document, not a spreadsheet →
llamacloud-parse(clean text) orllamacloud-extract(typed fields). - You want a specific typed schema ("invoice_total, vendor, due_date") rather than the table's
own rows — even from a spreadsheet, that intent is
llamacloud-extractterritory. Sheets gives you the table as it is, normalized; Extract gives you fields you defined. Seereferences/sheets-usage.mdfor the full Sheets-vs-Extract boundary.
The extraction flow
Four async steps; the SDK exposes a high-level method per step (confirm exact names live — see Fetching facts):
- Upload the spreadsheet → returns a file id.
- Create a Sheets job from the file id, under the SDK's
beta.sheetsnamespace. - Poll the job until status is terminal:
SUCCESS,PARTIAL_SUCCESS,ERROR, orFAILURE(transient state isPENDING).PARTIAL_SUCCESSmeans some regions came back and others failed — inspect theerrorsarray, don't assume all-or-nothing. - Download results per region — Parquet table data, and optionally a separate cell-metadata Parquet — via the presigned URLs the result returns.
Polling is mandatory; results are not inline. Presigned download URLs expire — fetch them from a fresh result rather than caching the URL.
Job config — the two decisions that matter
Create-job config is optional, and the defaults (parse all sheets, generate region/sheet metadata) are sensible. The two knobs worth a conscious choice:
- Which sheets to parse. Restrict to the sheets you care about when a workbook has many tabs you don't need — it cuts cost and noise versus parsing everything.
- Whether to generate metadata. The generated
title/descriptionsummaries make region selection easy. Turn generation off only when you already know exactly which region you want and want the leanest, fastest job.
Look up the exact config field names and defaults live (MCP) before relying on them.
Sequence (illustrative — fetch exact method names via MCP)
# upload the spreadsheet -> file id
# create a beta sheets job -> job id (beta.sheets namespace)
# poll the job's get-status -> until status is terminal
# fetch the result table -> presigned Parquet URL(s)
# load the Parquet -> pandas / polars / DuckDB, reason over rowsThis is the durable shape — upload → create → poll → download → load. The exact beta.sheets method
and parameter names are the most drift-prone part of this surface; grep them via MCP
(mcp__plugin_llamacloud_docs__grep_docs) rather than copying them from memory. The high-level
Python surface is commonly llama-cloud-services and the TS one @llamaindex/llama-cloud — confirm
both live before pinning.
Output: regions and Parquet
A successful job returns, per worksheet:
regions— each with aregion_id, thesheet_name, alocationrange (A2:E11), and a generatedtitle/descriptionwhen metadata is enabled.worksheet_metadata—sheet_name,title,descriptionat the sheet level.
For each region you download up to two Parquet files:
- Table data — the normalized rows, types preserved. This is what you load and query.
- Cell metadata (separate file, separate download) — per-cell position, formatting (font/color/ border/alignment), and detected type (date/percent/currency). Pull this only when you need to infer structure beyond the normalized table.
Parquet is columnar and portable: pd.read_parquet, Polars, or a DuckDB read_parquet() query all
load it directly with no schema declaration. See references/sheets-usage.md for handling the
output well (region selection, multi-table sheets, when cell metadata earns its keep).
Limits (beta)
- Input: spreadsheet workbooks —
.xlsxand.csvgrids. For documents that merely contain tables (PDFs, scans), usellamacloud-parse/llamacloud-extractinstead. - Throughput: job creation is throttled (low single-digit requests/sec — confirm the exact rate
live) — batch with backoff, don't fan out hundreds of
createcalls at once. - Size: each sheet caps at a fixed column/row limit (whichever hits first; confirm the current values live). The cap is per sheet, not per workbook. A sheet over the cap is the upstream split point: break it into sheets within the limit before upload rather than expecting Sheets to chunk it for you — don't rely on graceful truncation.
The throttle and the size cap exist; their exact values are drift-prone — fetch them (and the exact over-limit behavior) from the docs before relying on them.
Fetching facts (do not hardcode)
Exact package names/versions, method/parameter signatures, base URLs, throttle/size limits, and status enums drift — fetch them live, never from memory:
- Docs MCP (wired, no auth):
mcp__plugin_llamacloud_docs__search_docsfor concepts,mcp__plugin_llamacloud_docs__read_docfor a known page,mcp__plugin_llamacloud_docs__grep_docsfor an exact symbol (e.g.get_result_table,region_id). - Fallback: append
index.mdto anyhttps://developers.llamaindex.ai/...page URL andWebFetchit.
Anchor page: /llamaparse/sheets/. For exact SDK signatures, prefer the MCP over reproducing them.
Cross-links
- Account, API key, region choice, SDK install → core
llamacloud(don't re-teach setup here). - Typed-field extraction from documents (or from a spreadsheet against a schema you define) →
llamacloud-extract. - Raw clean text/markdown from a document →
llamacloud-parse.
Additional resources
references/sheets-usage.md— Sheets-vs-Extract decision table, working with the output (region selection, multi-table andPARTIAL_SUCCESShandling, cell-metadata judgment), and beta gotchas / anti-patterns.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

