Skip to content

Export Data

Export Data
Export

Export Data writes a data file about the pictures in your graph: a CSV, a JSON file, or text you shape yourself, such as XML, CSS, or code. Wire images, batches, texture sets, or atlases into it, pick a Preset or choose the Columns, and press Export.

Like Export Image, Export Batch, and Export Texture, it never writes while the graph cooks: a file appears only when you press Export, or run Export Selected or Export All.

This page is the reference. For recipes and a real output sample for every preset, read Exporting Data.

The Input pin is an array: wiring the last pin adds another, so several sources can go into one file, each adding rows in pin order.

  • An image is one row.
  • A batch is one row per frame, in batch order. A frame that failed to load, or whose name is blocked, is left out with a note, but it still counts toward {data:position} and {index}, so the numbers keep matching the exported file names.
  • A texture set is one row per set or one row per map, chosen by Texture Sets (Each Set or Each Map). On Each Map rows {channel} names the map (base_color, normal, …).
  • An atlas from Arrange, Sprite Sheet, or Trim Sheet (its Sheet output), wired straight in, is one row per sprite or one row for the whole sheet, chosen by Atlases (Each Sprite or Each Atlas). An Export Batch with Generate Sprite Sheet on is an atlas too: wire the batch it packs.

Atlases and Texture Sets appear only when the wired inputs give them meaning. They combine for an Arrange of texture sets: Each Map with Each Sprite gives one row per map of each placed set.

Rows decides what one row is: Each Image (the default), or Each Written File, one row per file an export writes. With Each Written File, an image that a PNG export and a WebP export both write gives two rows, and on each row {data:file} and the export tokens read that row’s own export; an image no export writes has no row, with a note.

You never wire an export node into Export Data. Wire the same image or batch into both, and any Export Image, Export Batch, or Export Texture writing it is a found export, wherever it sits (a Tag, Reroute, or Collect in between is fine). While the node is selected, dashed lines run on the canvas from each found export to it.

{data:file} is the easy column for “the file this image became”: the exported file when an export writes the image, else the source file it was read from, decided row by row. Before a write the export tokens give the files the export will write; after it, the files it actually wrote, including a name changed by a collision suffix.

The Found Exports section lists each export with its kind, row count, and status, which {data:export_status} also writes:

StatusMeaning
SavedThe files are on disk and match the graph, also after closing and reopening the project.
Not saved yetThe export has not written these images, or the graph changed since it did.
Updating…The graph is still cooking; rows read Updating… instead of an old value.
FailedThe last export could not write some files, or was cancelled.

When one image is written by several exports, an export token reads the one created first; name another by its Node ID after the token, as in {data:export_filename:ExportBatch2}. The picker lists each export with its custom label beside its Node ID and inserts the Node ID, which never changes. A label also works there when exactly one export carries it, and renaming that node rewrites such a reference for you; two exports sharing the label leave the cell empty with a note naming both.

Placement comes from the node that packed the sheet: Arrange (two or more inputs), Sprite Sheet, Trim Sheet (each trim is one region, with its name and color), or a sheet-mode Export Batch.

  • Trimmed sprites. With Sprite Sheet’s Trim Transparency on, {data:w} and {data:h} are the placed, trimmed size, {data:offset_x} and {data:offset_y} say how far trimming moved the corner, {data:trimmed} reads true, and {width} and {height} stay the untrimmed size.
  • Grid cells. {data:grid_column} and {data:grid_row} answer for an Arrange in Grid direction and a Sprite Sheet in Grid mode.
  • UVs. {data:u0} to {data:v1} give the rectangle as 0 to 1 fractions of the sheet from the top-left corner; {data:v0_from_bottom} and {data:v1_from_bottom} measure the top and bottom edges from the bottom, and {data:y_from_bottom} the pixel Y, for tools whose v or Y axis points up. {data:uv_w} and {data:uv_h} give the rectangle’s size as fractions.
  • Colors. {color} writes the row image’s swatch color (a Palette Remap variant’s, or a Trim Sheet trim’s) as hex; {data:color_r}, _g, _b write it as sRGB 0 to 1 and {data:color_linear_r}, _g, _b as linear 0 to 1.
  • The atlas picture is whatever export writes the packer’s output; {data:atlas_filename} and {data:atlas_relative_path} name its file.

Preset sets a whole look (format, Rows, columns, Advanced choices, Atlases, Texture Sets, and Custom Text) but never Split, Folder, or File Name. Change anything afterward and the menu reads Custom. The line under it says what the preset is for, and amber notes say when the wired inputs cannot fill it (no atlas, no texture set, or more than one atlas for a one-atlas format, which offers a Split: One per Atlas button).

GroupPresets
ListsImage List, Review Spreadsheet, XML Image List, Markdown Table
Sprite AtlasesAtlas Coordinates, Atlas JSON (Hash), Atlas XML, CSS Sprites, ZenUV Trim Sheet
CodeC# Sprite Table, GDScript Regions, TypeScript Image Module
Web and DataWeb Image Manifest, Dataset Metadata
Texture SetsMaterial Maps

Save as Preset… at the end of the Yours group saves the look (never Folder or File Name) for every Export Data node in every project; Manage Presets… renames, deletes, exports, and imports them. Each preset has a recipe and a sample in Exporting Data. To pass a setup to a teammate, see Sharing your setup.

Each column has a Header (the name at the top of a CSV, the JSON key, or the name Custom Text uses) and a Value: text with tokens in braces, such as {name} or {width}x{height}. Drag a column’s grip to reorder it (right-click the grip for Move, Remove, and Write as).

  • Add Column appends one.
  • Paste Keys and Values builds the list from two comma-separated lines.
  • Copy Keys and Values copies the list as those two lines.

The </> button at the end of a Value opens the token picker, grouped by where each value comes from (This node, Image, Source, Atlas, Texture Set, Exported files, Document, and Variables), with a live sample from the first row beside each token. A token that needs something you have not wired is grayed with the reason, and typing { offers matching tokens. Every token field in ArcBrush opens the same picker; see Naming with Tokens.

A column’s Value mixes text and tokens. For example, on the row for icon_heart:

  • {name} writes icon_heart; on a packed atlas, {data:x},{data:y} writes where the sheet placed it, such as 64,0.
  • {data:export_path:ExportImage2|relative} writes sprites/icon_heart.png, the file Export Image 2 wrote for that image, relative to the data file.

The {data:...} tokens are Export Data’s own: the row, the atlas placement, the texture set, and the files found exports write. Values are data, not file names: they are never cleaned up the way file names are, and paths use / unless you add |backslash. Padding works on Export Data’s numbers ({data:position:3} writes 007), and |or: gives a missing value a default ({data:x|or:0}). An unknown token is written as typed, with a note, so a typo shows in the preview instead of vanishing. Every token is in the Token Reference.

FormatWhat it writesExtension
CSVComma separated, with a header line when Include Header is on.csv
CSV for ExcelCSV with Windows line endings, a UTF-8 byte order mark, and formula protection.csv
TSVTab separated.tsv
JSONAn array of objects keyed by the headers; JSON numbers are written as numbers unless a column’s Write as says otherwise.json
JSON Keyed by First ColumnOne object keyed by the first column, which must be present and unique on every row.json
Custom TextYour own text around the rowsYou choose

Advanced, collapsed by default, holds what each format sets for you: Delimiter (Comma, Semicolon, Tab, or Pipe), Protect Spreadsheet Formulas, Line Endings, and Write UTF-8 BOM. Picking a Format resets them to its convention. For CSV and TSV, a note says when values in the first column repeat.

Write as, in a column’s right-click menu, sets how JSON writes it: Auto (a JSON number as a number, anything else as a string), Text (always a string, so an id like 007 stays intact), Number, or True or False (from true, yes, 1 or false, no, 0, empty). A value that does not fit is written as a string, with a note. A typed column shows a TEXT, NUM, or BOOL chip after its header; other formats gray the choices (“only JSON writes types”).

Custom Text builds the file from four boxes:

  • Before Rows once at the top.
  • Each Row for every row (where {header} is that column).
  • Between Rows between two rows (\n for a line break).
  • After Rows once at the end.

Escape Values (None, As JSON or C# Strings, As XML, As CSV) escapes only the substituted values, never your typed text. Extension offers data and code types only; a file your computer would run when opened is never offered.

A brace starts a token only when a letter follows it and a } closes it on the same line, so code and JSON need no escaping; {{name}} writes {name}. Add Second Pass adds Middle and a second Each Row and Between Rows: the rows are written again, in the same order, after the first pass, so one file can hold an enum and a matching array. See Custom Text from scratch.

The Preview shows the first 200 rows as a Table or as Raw text exactly as it will be written, with the row count, size, line endings, and byte order mark on the line below.

Problems in red stop Export and Copy. Notes in amber explain every empty cell and every token written as typed, with the column, the token, the reason, and how many rows it affects, for example "x": {data:x} is empty: needs an atlas. The node body on the canvas reads the row count and format, such as 3 rows · CSV, with a badge for notes.

Export writes the file to the Writes path shown under Folder and File Name; the extension comes from the format. A new node’s File Name is {this.label|or:this.id}, so the file is named for the node: an Export Data labeled “icons_atlas” writes icons_atlas.json, an unlabeled one ExportData1.json. Export Data reads several inputs, so {input.label} is grayed here; Naming with Tokens shows the atlas recipe.

Split writes One File, One per Input, or One per Atlas. Put {name} in the File Name to name each file for its input or atlas; without it Export is off with a note. With a Split, the Writes line lists the files, the preview shows the first one, the button reads Export N Files, and the files are written together: if one cannot be written, none is. Copy puts the same text on the clipboard. An existing file asks before it is overwritten, as with every export.

Save Them First. If a found export has not saved the images this file lists, Export asks first; it never saves images silently.

  • Save Them First (the default) exports those images, then writes the data file with their actual names, as one run.
  • This File Only writes just the data file with the planned names.
  • Cancel does nothing.

Export Selected and Export All write Export Data nodes last, after every image export in the run, so a data file lists the files just written. A node with no rows is skipped, so no header-only file is written. Reveal in Explorer (Reveal in Finder on macOS) in the node’s right-click menu shows the file it last wrote.

A file holds at most 1,000,000 rows and 64 MiB. The same graph and settings always write the same bytes, whatever the computer’s language settings, and numbers never use a comma for the decimal point.

Pins

Input 1, Input 2, ...Batch
InputOptionalVariable count

Data

PresetChoice
Default: Image List

A starting look for the whole file: format, columns and options. Changing anything afterward shows Custom. A preset never changes Folder or File Name

  • Image ListCSV of every image: name, file, width, height, and position. The default. Wire any images or batches.
  • Review SpreadsheetCSV for Excel with each image's source file, its SHA-256, size, channels, bit depth, the export node that writes it, and whether it is saved.
  • XML Image ListOne self-closing image element per row, values XML escaped.
  • Markdown TableA table with a preview of each image, for a README or a wiki.
  • Atlas CoordinatesCSV of each sprite's atlas, rectangle, untrimmed size, trim offset, UVs, and sheet size. Wire an Arrange, Sprite Sheet, or Trim Sheet.
  • Atlas JSON (Hash)The frames and meta JSON that Phaser and PixiJS load, frames keyed by name. One atlas per file.
  • Atlas XMLA Starling TextureAtlas with one SubTexture per sprite. One atlas per file.
  • CSS SpritesA .sprite class naming the sheet, then one class per sprite with its position and size. One atlas per file.
  • ZenUV Trim SheetFor Blender's ZenUV add-on: press Copy, then Paste Trims from Clipboard in ZenUV's Trim List menu. A trimsheet JSON object with each trim's rectangle (v measured from the bottom) and linear color, keyed by name. Wire a Trim Sheet, Arrange, or Sprite Sheet. One atlas per file.
  • C# Sprite TableA static C# class with a named rectangle per sprite and a list of them all, in file order.
  • GDScript RegionsFor Godot: a REGIONS dictionary of Rect2 by name and the atlas path. One atlas per file.
  • TypeScript Image ModuleAn images object keyed by camelCase name with each file and size, plus an ImageName type.
  • Web Image ManifestJSON keyed by name with each image's file, size, and format.
  • Dataset MetadataA metadata.csv of exported file paths and labels, as dataset tools read. The label is a label tag set with the Tag node.
  • Material MapsJSON with one entry per texture map: its set, map, file, and size. Wire a texture set.
  • CustomShown once the look no longer matches a preset. Picking a preset again resets the whole look.
FormatChoice
Default: CSV

The file convention

  • CSVComma separated, one line per row, with a header line when Include Header is on. The default.
  • CSV for ExcelCSV with Windows line endings, a UTF-8 byte order mark, and formula protection, so Excel opens it correctly.
  • TSVTab separated.
  • JSONAn array with one object per row, keyed by the headers. Numbers are written as numbers.
  • JSON Keyed by First ColumnOne object whose keys are the first column's values, each holding the other columns. The first column must be present and unique on every row.
  • Custom TextYour own text before, around, and after the rows, with the extension you choose: XML, YAML, CSS, code, or anything else.
RowsChoice
Default: Each Image

What one row is

  • Each ImageOne row per image. The default.
  • Each Written FileOne row per file an export writes, so an image a PNG and a WebP export both write gives two rows, each reading its own export. An image no export writes has no row.
Include HeaderToggle
Default: true
Format = CSV, CSV for Excel or TSV

Write the column names as the first line

ColumnsText
Default: name, file, width, height, position
Edited in the column list

The file's columns, in order, each a Header and a Value with tokens such as {name}. Edited in the Columns list, never as text

AtlasesChoice
Default: Each Sprite
An input is an Arrange, Sprite Sheet or Trim Sheet output

Rows for an Arrange, Sprite Sheet or Trim Sheet input: one per sprite, or one per atlas

  • Each SpriteOne row per placed image, with its rectangle, trim, and UVs. The default.
  • Each AtlasOne row per atlas, with the sheet size and sprite count.
Texture SetsChoice
Default: Each Set
An input carries texture sets

Rows for a texture set input: one per set, or one per map

  • Each SetOne row per texture set. The default.
  • Each MapOne row per map of each set, with the map's role in {channel} and the file Export Texture writes for it.

Advanced

DelimiterChoice
Default: Comma Range: Comma / Semicolon / Tab / Pipe
Format = CSV, CSV for Excel or TSV

The character between fields

Protect Spreadsheet FormulasToggle
Default: false
Format = CSV, CSV for Excel or TSV

Start a value that begins with = + - or @ with an apostrophe, so a spreadsheet does not run it as a formula

Line EndingsChoice
Default: LF Range: LF / CRLF

What ends each line: LF, or CRLF for older Windows tools

Write UTF-8 BOMToggle
Default: false

Start the file with a byte order mark so Excel reads it as UTF-8

Custom Text

Before RowsText
Format = Custom Text

Text written once before the first row. Tokens such as {data:row_count} work here

Each RowText
Format = Custom Text

Text written for every row. {key} is the column with that header; any other name is read as a token

Between RowsText
Format = Custom Text

Text written between two rows, on one line. Use \n for a new line and \t for a tab

After RowsText
Format = Custom Text

Text written once after the last row

Second PassToggle
Default: false
Format = Custom Text

Write the rows a second time after the first pass, so one file can hold two lists in the same order, such as an enum and an array

MiddleText
Format = Custom Text

Text written once between the first pass and the second

Second Pass Each RowText
Format = Custom Text

Text written for every row in the second pass. {key} is the column with that header

Second Pass Between RowsText
Format = Custom Text

Text written between two rows in the second pass, on one line. Use \n for a new line

Escape ValuesChoice
Default: None
Format = Custom Text

How substituted values are escaped. Your typed text is never changed

  • NoneValues are written as they are. For plain text, Markdown, INI, and numbers.
  • As JSON or C# StringsA backslash before quotes and backslashes, control characters as escapes. For values inside quotes in JSON, C#, TypeScript, GDScript, Lua, Python, or CSS.
  • As XMLAmpersands, angle brackets, and quotes written as entities. For XML and HTML fragments.
  • As CSVA value holding the delimiter, a quote, or a line break is quoted, with quotes doubled.
ExtensionChoice
Default: .txt Range: .csv / .tsv / .json / .txt / .xml / .yaml / .yml / .md / .ini / .cfg / .lua / .cs / .gd / .h / .hpp / .js / .ts / .py / .css / .jsonl
Format = Custom Text

The file extension. Only data and code extensions are offered

Output

SplitChoice
Default: One File

How many files Export writes. Put {name} in the File Name to give each file its own name

  • One FileEvery row in one file. The default.
  • One per InputA file for each wired input pin, named for what is wired into it.
  • One per AtlasA file for each atlas the rows come from, for formats that describe one atlas, such as Atlas JSON or GDScript Regions.
FolderText

Folder the Export action writes into. Tokens work; add a transform such as {graph|snake}

File NameText
Default: {this.label|or:this.id}

File name without the extension, which comes from the Format. The default is this node's label, else its Node ID. Tokens work; with Split on, {name} is each file's input or atlas

  • For a game atlas, wire the Sprite Sheet or Arrange output itself into Export Data, not an image after it, and pick an Atlas preset.
  • For Blender’s ZenUV add-on, the simplest route is the Trim Sheet node’s own Copy Trims for ZenUV. Export Data writes the same text when you want it as a file or from trims you edited: wire the Sheet output into Export Data, pick ZenUV Trim Sheet, and press Copy (or set Folder and press Export for a .json file), then in Blender choose Paste Trims from Clipboard from the Trim List’s dropdown menu. Trims are keyed by name, so a repeated name earns a note.
  • Formats that describe one sheet (Atlas JSON, Atlas XML, CSS Sprites, GDScript Regions) write one file per atlas: set Split to One per Atlas and put {name} in the File Name.
  • Use a Tag node upstream to add labels or other metadata as {tag:key} columns.
  • Build a look once and save it with Save as Preset… so it is one pick in every project.