> For the complete documentation index, see [llms.txt](https://captivatehelp.newbluelive.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://captivatehelp.newbluelive.com/play-and-update-graphics/chapter-index/4-drive-from-spreadsheet.md).

# 4. Drive a graphic from a spreadsheet or file

By the end of this step, you’ll understand how to point a graphic at an external spreadsheet or data file so the file controls what the graphic shows. A team member updates a roster, schedule, or leaderboard outside Captivate, and Captivate uses those values on air.

Where step 3 stored variations inside the project, this step keeps them in a file (or a Google Sheet) that lives outside Captivate, closer to where your team already works.

## When to choose this step

Pick Tables when:

* You already maintain the data somewhere — a Google Sheet, an Excel workbook, a CSV export, an XML file, or a JSON file.
* Several people need to edit the data without opening Captivate.
* The dataset is broadly tabular: rows are items (students, players, race entries, sponsors, songs), columns are fields.

If your data is being fetched live from a dedicated source (a scoreboard system, a presentation app, a weather service), use a Data Controller instead. That’s [step 5](/play-and-update-graphics/chapter-index/5-drive-with-data-controller.md). Tables works best when the source can be treated as rows and columns.

## The two flavors: Row vs Block

Captivate includes two Tables controllers. Start with **Tables: Row** unless the graphic needs to show several records at once:

* **Tables: Row** drives a graphic from one record at a time: a lower third for one speaker, a player intro card for one athlete, a sponsor bug for one sponsor.
* **Tables: Block** drives a graphic from several records at once: a leaderboard with the top 10, a roster card with five players, a schedule slate with the next four games.

Match the controller to the graphic. A graphic with one set of fields (**Name**, **Title**, **Headshot**) usually wants **Tables: Row**; a graphic with repeated sets of fields (**Player 1**, **Player 2**, **Player 3**) usually wants **Tables: Block**.

## Basic setup

1. Drag a graphic from the **Library** into the **Project List**. For Tables: Row, pick something with a small set of variables (one record’s worth). For Tables: Block, pick a leaderboard-style or roster-style graphic.
2. In the **Project List**, find the **Data Controller** column for the graphic’s row.
3. Click the column and choose **Productivity → Tables: Row** (or **Tables: Block**) **→ New Input**. Captivate adds the controller and opens its panel.
4. The Tables panel opens to **Load New Data**. **Browse** for a local file (CSV, Excel, JSON, XML, plain text, SQLite), **Create CSV** to start one inside Captivate, or **Open URL** to fetch a web URL or Google Sheets link. If the source requires sign-in, Captivate prompts you during setup.
5. Check the values in the **Preview** panel. Captivate connects matching source columns to matching graphic values by name; use **Link Data** in the Preview panel to change which source field controls a graphic value.
6. Play the graphic on, then choose or advance the row from the Tables panel.

Tables: Block needs additional setup to decide how rows are grouped into blocks. See [Tables: Block Controller](/play-and-update-graphics/chapter-index-1/tables-block-controller.md) for that workflow.

## Common examples

* **Speaker lower thirds** — Google Sheet or CSV to **Tables: Row**.
* **Player intro cards** — CSV or Excel to **Tables: Row**.
* **Now-playing or service-order graphics** — Google Sheet to **Tables: Row**.
* **Leaderboards** — Google Sheet or CSV to **Tables: Block**.
* **Rosters and stats slates** — Excel or CSV to **Tables: Block**.
* **XML or JSON feeds** — use Tables when the data can be treated as rows and columns.

## Go deeper

The full per-format setup, the Block detection rules, the Row sequencing controls, and the auto-refresh and auto-play options are all in the Tables sibling chapter:

* [Tables overview](/play-and-update-graphics/chapter-index-1/tables-overview.md)
* [Drive a graphic with Tables: Row](/play-and-update-graphics/chapter-index-1/drive-a-graphic-with-tables-row.md)
* [Use XML or JSON with Tables](/play-and-update-graphics/chapter-index-1/use-xml-or-json-with-tables.md)
* [Tables: Block Controller](/play-and-update-graphics/chapter-index-1/tables-block-controller.md)
* [Crawls Controller](/play-and-update-graphics/chapter-index-1/crawls-controller.md)
* [Leaderboard Controller](/play-and-update-graphics/chapter-index-1/leaderboard-controller.md)

Existing projects may use the older Spreadsheet, JSON, or XML controllers; new projects should use Tables unless a legacy workflow is required. See [Legacy data controllers](/play-and-update-graphics/chapter-index-2.md).

For operating Tables live during a show (Stream Deck and Companion bindings, mid-show row selection, auto-play behavior under pressure), see [Tables controller with Companion](/control-your-show/chapter-index-4/tables-controller-with-companion.md).

## What you just did

You learned when to use Tables, how **Tables: Row** drives ordinary one-record graphics, and when **Tables: Block** is needed for multi-row graphics. The detailed setup by source type lives in the Tables chapter, one article per workflow.

## Next step

[5. Drive a graphic with a Data Controller](/play-and-update-graphics/chapter-index/5-drive-with-data-controller.md): for scoreboards, presentation apps, weather, meetings, and other sources that have dedicated live controllers.

## Related

* [3. Prepare multiple variations (Values Grid)](/play-and-update-graphics/chapter-index/3-prepare-variations.md)
* [Tables overview](/play-and-update-graphics/chapter-index-1/tables-overview.md)
* [Data Controller catalog](/play-and-update-graphics/chapter-index-3.md)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://captivatehelp.newbluelive.com/play-and-update-graphics/chapter-index/4-drive-from-spreadsheet.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
