Spreadsheet2Video
The node that turns a CSV into a ComfyUI loop
- first_image
- IMAGE
- AUDIO
ComfyUI is great at running one image through a pipeline and useless at running a table through it. If you've ever copied the same 40-node stack ten times to try ten prompts, or spliced video clips together one at a time, you've felt the gap this node is aimed at. Spreadsheet2Video (from the niknah/Spreadsheet2Video-ComfyUI pack) makes a spreadsheet the driver of your workflow: every row is one run, and each run hands its output to the next row. The name says video, but it's really a general-purpose loop over a CSV.
Here's the mental model, because it's the whole trick. You write a CSV with a header row. The first column holds the name of the "part" of the workflow you want to execute for that row - a name you also type into a Spreadsheet2Video Input Image node. Every other column is just a value: a prompt, a seed, a filename, a number, a boolean. Column 2 of row 3 gets wired into whatever input you connect the Input Image node's COLUMN2 output to. Rows execute in order, and row 1 uses the first_image you feed in; row 2 gets row 1's output image - or the last frame of row 1's video if it made one. That last detail is what makes this pack interesting for the "endless video" crowd: chain a Wan or LTX i2v block per row and you get a long, continuous-feeling video out of clips the models can only do individually.
Under the hood it's not a normal node at all - it's a graph-expansion node. It parses the CSV, then for each row it copies the nodes downstream of the matching Input Image node into a fresh execution graph, substituting that row's column values, and chains each row's output image forward. Your original nodes never move; the pack just builds a bigger graph that contains the loop, runs it, and hands you the results. Frames get saved to ComfyUI/temp as lossless PNGs along the way, then stitched back into one image batch at the end.
The inputs and outputs that matter
Only two inputs, and you'll set one by hand:
spreadsheet- comma-separated values with a header row, pasted as text. If you're working with a real file instead, feed the output of theSpreadsheet2Video Load Spreadsheetnode in here instead of typing.first_image(optional) - the starting image for row 1. The author's own note: use anEmptyImagenode if you don't need one. For pure text-to-video, an empty image is exactly right.
Outputs are IMAGE (every row's frames concatenated - this is what you save or preview) and AUDIO (per-row audio, stitched together if you captured any).
Installing it
ComfyUI Manager → search "Spreadsheet2Video" → install, then restart ComfyUI. Or the manual route:
cd ComfyUI/custom_nodes
git clone https://github.com/niknah/Spreadsheet2Video-ComfyUI
Then restart ComfyUI. The pack's only hard Python dependency is pandas (pulled automatically from its requirements.txt); add pip install odfpy only if you want to load .ods spreadsheets. No models to download, no API keys. Do note it's built on ComfyUI's newer node API plus graph expansion, so if the nodes don't appear, update ComfyUI before you blame the pack.
Where people get burned
- Seeds. If you set a KSampler seed to "randomize", it changes once per run - so every row gets the same seed. Add a seed column to your spreadsheet and connect it to the sampler instead.
- Resolution mismatch. All rows' outputs must end up the same pixel size or the final stitch fails with "All images must be the same size". If your video nodes resize things, put a resize node just before the Output Image node to normalize.
- No header row and the loop silently does nothing - you'll get a "No rows done" warning in the log.
It's a niche pack, self-promoted by its author in the endless-video and batch-processing threads, and it won't hold your hand. But if you're tired of hand-stitching long videos or typing the same prompt grid into twenty KSamplers, a CSV is a much nicer place to drive it from.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| spreadsheet | STRING | Comma separated values with a header row. Can use Spreadsheet2Video Load Spreadsheet node. | |
| first_imageopt | IMAGE | First image to send to the S2VInputImage node. Use EmptyImage if you don't need it |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |
| AUDIO | AUDIO | — |