> ## Documentation Index
> Fetch the complete documentation index at: https://jetxl.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Dictionary functions

> The legacy dictionary interface, kept for backward compatibility

<Note>
  These predate the Arrow interface and support far fewer options. Use `write_sheet_arrow` unless you specifically need to avoid a DataFrame dependency.
</Note>

## write\_sheet

```python theme={null}
jet.write_sheet(columns, filename, sheet_name=None, charts=None) -> None
```

<ParamField path="columns" type="dict[str, list]" required>
  Column name to list of values. Every list must be the same length.
</ParamField>

<ParamField path="filename" type="str" required>Output path.</ParamField>
<ParamField path="sheet_name" type="str | None" default="None">Tab label.</ParamField>
<ParamField path="charts" type="list[dict] | None">Charts, same shape as the Arrow functions.</ParamField>

```python theme={null}
jet.write_sheet(
    {
        "Name":   ["Alice", "Bob", "Charlie"],
        "Age":    [25, 30, 35],
        "Salary": [50000.0, 60000.0, 75000.0],
    },
    "output.xlsx",
)
```

## write\_sheets

```python theme={null}
jet.write_sheets(sheets_data, filename, num_threads) -> None
```

<ParamField path="sheets_data" type="list[dict]" required>
  Each with `name` and `columns`.
</ParamField>

<ParamField path="filename" type="str" required>Output path.</ParamField>
<ParamField path="num_threads" type="int" required>Required and positional.</ParamField>

```python theme={null}
jet.write_sheets(
    [
        {"name": "Sales",    "columns": sales_data},
        {"name": "Expenses", "columns": expense_data},
    ],
    "output.xlsx",
    num_threads=2,
)
```

## What you give up

<CardGroup cols={2}>
  <Card title="Formatting" icon="ban">
    No `column_formats`, `cell_styles`, `conditional_formats`, tables, images or validation. Charts are the one extra supported.
  </Card>

  <Card title="Speed" icon="gauge-simple">
    Values come from Python lists rather than Arrow buffers, so the zero-copy advantage doesn't apply. The published benchmark puts this path at roughly twice the time of the Arrow one.
  </Card>
</CardGroup>

## Supported types

`str`, `int`, `float`, `bool`, `datetime`, and `None`.

<Note>
  `NaN` and infinity become empty cells here too, matching the Arrow path. See [Data types](/guides/data-types).
</Note>
