All nodes/Data/DataFrame I/O
Write XLSX
Writes a DataFrame to an Excel file (xlsx) in the connected file_store. Overwrites the target file if it exists.
Type in the graph: df_write_xlsx
Exec
An error branch can be enabled (expose_error_output) to handle failures on their own path.
Ports can be split into separate execution and data handles.
Try it
Minimal working workflow
- Execute + Data
Runs as pasted
When to use it
Saves a table as an Excel workbook. The store and path mechanics are the same as in Write CSV; what differs is who receives the file.
Pick XLSX when a person will open it: numbers stay numbers and dates stay dates, and there are no encoding or delimiter questions at all — the format has none. CSV is still the better choice when another system reads the file, or when it is very large: xlsx is heavier and slower to build.
How it works
The “DataFrame” port carries both the trigger and the data — there is no separate execution input. As with the CSV writer, a list of objects or CSV text is accepted too: the node coerces it into a table itself.
“Sheet name” is a template; a blank value becomes Sheet1. The workbook is built from scratch
every time, so it holds exactly one sheet.
The path is a template as well: reports/{{ variables.session_id }}.xlsx gives one workbook
per session. The output is path, bytes_written and rows_written (data rows, header
excluded).
Common mistakes
- Expecting a sheet to be added to an existing workbook. The file at that path is replaced whole: old sheets, formulas and formatting disappear. To keep history, write each run to its own path.
- Counting on formatting. The node writes data: column widths, styles, frozen headers and formulas are not configurable. If a branded look is required, prepare a template workbook outside Flow.
- The WebDAV folder does not exist. The workspace store creates missing directories itself; on WebDAV a write into a non-existent folder fails.
- One table across several sheets. A single DataFrame cannot be spread over sheets. Split the data earlier in the graph and write separate files, or assemble the report as CSV.
- An empty table. You get a workbook with the header alone and
rows_written: 0— a successful run, not an error.
Inputs
| Port | Wire | Payload | Notes |
|---|---|---|---|
DataFramedf | Execute + Dataexecute_data | dataframe | |
File storefile_store | Datadata | — | shown when connection_source ≠ "auto" |
Outputs
| Port | Wire | Payload | Notes |
|---|---|---|---|
Successoutput | Execute + Dataexecute_data | object | |
Erroron_error | Execute + Dataexecute_data | — | shown when expose_error_output = true |
Configuration
| Field | Type | Default | Description |
|---|---|---|---|
File pathpath | string | "" | Path relative to the store root. Jinja templates are rendered per run, so ``reports/{{ variables.session_id }}.csv`` writes one file per session. supports templates |
Sheet namesheet_name | string | Sheet1 | Name of the worksheet to create. Supports Jinja. supports templates |
Include header rowinclude_header | boolean | true | Write the column names as the first row. |
Connection sourceconnection_source | string | auto | Where this node gets its connection. 'From the run context' uses what the platform already knows (the Telegram bot this workflow is deployed to / this workspace's own file store) and needs no wiring. 'External connection' shows the resource port so a config node can be wired into it. Options: |
Subfolderstore_subfolder | string | "" | Optional folder inside this workspace's store to treat as the root, e.g. `reports` or `sessions/{{ variables.session_id }}`. Blank = the store root. supports templates shown when connection_source = auto |
| Advanced | |||
Max bytesmax_bytes | integer | 52428800 | Refuse to transfer more than this many bytes. |
Shared fields
Every node has these three — the platform adds them, not the node author.
expose_error_output— When enabled, show an execution output to connect nodes that run if this step fails.split_ports_in— Show separate execution and data input handles instead of one combined port.split_ports_out— Show separate execution and data output handles instead of one combined port.