Skip to main content

High-performance Excel writer with automatic type detection (pandas, polars, CSV)

Project description

xlsxturbo

High-performance Excel writer with automatic type detection. Written in Rust, usable from Python.

Features

  • Direct DataFrame support for pandas and polars
  • Excel tables - filterable tables with 61 built-in styles (banded rows, autofilter)
  • Auto-fit columns - automatically adjust column widths to fit content
  • Custom column widths - set specific widths per column
  • Custom row heights - set specific heights per row
  • Freeze panes - freeze header row for easier scrolling
  • Multi-sheet workbooks - write multiple DataFrames to one file
  • Constant memory mode - minimize RAM usage for very large files
  • Parallel CSV processing - optional multi-core parsing for large files
  • Automatic type detection from CSV strings and Python objects:
    • Integers and floats → Excel numbers
    • true/false → Excel booleans
    • Dates (2024-01-15, 15/01/2024, etc.) → Excel dates with formatting
    • Datetimes (ISO 8601) → Excel datetimes
    • NaN/Inf → Empty cells (graceful handling)
    • Everything else → Text
  • ~25x faster than pandas + openpyxl
  • Memory efficient - streams data with 1MB buffer
  • Available as both Python library and CLI tool

Installation

pip install xlsxturbo

Or build from source:

pip install maturin
maturin develop --release

Python Usage

DataFrame Export (pandas/polars)

import xlsxturbo
import pandas as pd

# Create a DataFrame
df = pd.DataFrame({
    'name': ['Alice', 'Bob'],
    'age': [30, 25],
    'salary': [50000.50, 60000.75],
    'active': [True, False]
})

# Export to XLSX (preserves types: int, float, bool, date, datetime)
rows, cols = xlsxturbo.df_to_xlsx(df, "output.xlsx")
print(f"Wrote {rows} rows and {cols} columns")

# Works with polars too!
import polars as pl
df_polars = pl.DataFrame({'x': [1, 2, 3], 'y': [4.0, 5.0, 6.0]})
xlsxturbo.df_to_xlsx(df_polars, "polars_output.xlsx", sheet_name="Data")

Excel Tables with Styling

import xlsxturbo
import pandas as pd

df = pd.DataFrame({
    'Product': ['Widget A', 'Widget B', 'Widget C'],
    'Price': [19.99, 29.99, 39.99],
    'Quantity': [100, 75, 50],
})

# Create a styled Excel table with autofilter, banded rows, and auto-fit columns
xlsxturbo.df_to_xlsx(df, "report.xlsx",
    table_style="Medium9",   # Excel's default table style
    autofit=True,            # Fit column widths to content
    freeze_panes=True        # Freeze header row for scrolling
)

# Available styles: Light1-Light21, Medium1-Medium28, Dark1-Dark11
xlsxturbo.df_to_xlsx(df, "dark_table.xlsx", table_style="Dark1", autofit=True)

Custom Column Widths and Row Heights

import xlsxturbo
import pandas as pd

df = pd.DataFrame({
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Department': ['Engineering', 'Marketing', 'Sales'],
    'Salary': [75000, 65000, 55000]
})

# Set specific column widths (column index -> width in characters)
xlsxturbo.df_to_xlsx(df, "report.xlsx", 
    column_widths={0: 20, 1: 25, 2: 15}
)

# Set specific row heights (row index -> height in points)
xlsxturbo.df_to_xlsx(df, "report.xlsx",
    row_heights={0: 25}  # Make header row taller
)

# Combine with other options
xlsxturbo.df_to_xlsx(df, "styled.xlsx",
    table_style="Medium9",
    freeze_panes=True,
    column_widths={0: 20, 1: 30, 2: 15},
    row_heights={0: 22}
)

Multi-Sheet Workbooks

import xlsxturbo
import pandas as pd

# Write multiple DataFrames to separate sheets
df1 = pd.DataFrame({'product': ['A', 'B'], 'sales': [100, 200]})
df2 = pd.DataFrame({'region': ['East', 'West'], 'total': [500, 600]})

xlsxturbo.dfs_to_xlsx([
    (df1, "Products"),
    (df2, "Regions")
], "report.xlsx")

# With styling applied to all sheets
xlsxturbo.dfs_to_xlsx([
    (df1, "Products"),
    (df2, "Regions")
], "styled_report.xlsx", table_style="Medium2", autofit=True, freeze_panes=True)

# With column widths applied to all sheets
xlsxturbo.dfs_to_xlsx([
    (df1, "Products"),
    (df2, "Regions")
], "report.xlsx", column_widths={0: 20, 1: 15})

Constant Memory Mode (Large Files)

For very large files (millions of rows), use constant_memory=True to minimize RAM usage:

import xlsxturbo
import polars as pl

# Generate a large DataFrame
large_df = pl.DataFrame({
    'id': range(1_000_000),
    'value': [i * 1.5 for i in range(1_000_000)]
})

# Use constant_memory mode for large files
xlsxturbo.df_to_xlsx(large_df, "big_file.xlsx", constant_memory=True)

# Also works with dfs_to_xlsx
xlsxturbo.dfs_to_xlsx([
    (large_df, "Data")
], "multi_sheet.xlsx", constant_memory=True)

Note: Constant memory mode disables some features that require random access:

  • table_style (Excel tables)
  • freeze_panes
  • row_heights
  • autofit

Column widths still work in constant memory mode.

CSV Conversion

import xlsxturbo

# Convert CSV to XLSX with automatic type detection
rows, cols = xlsxturbo.csv_to_xlsx("input.csv", "output.xlsx")
print(f"Converted {rows} rows and {cols} columns")

# Custom sheet name
xlsxturbo.csv_to_xlsx("data.csv", "report.xlsx", sheet_name="Sales Data")

# For large files (100K+ rows), use parallel processing
xlsxturbo.csv_to_xlsx("big_data.csv", "output.xlsx", parallel=True)

CLI Usage

xlsxturbo input.csv output.xlsx [--sheet-name "Sheet1"] [-v]

Options

  • -s, --sheet-name: Name of the Excel sheet (default: "Sheet1")
  • -v, --verbose: Show progress information

Example

xlsxturbo sales.csv report.xlsx --sheet-name "Q4 Sales" -v

Performance

Benchmarked on 525,684 rows x 98 columns:

Method Time Speedup
xlsxturbo 28.5s 26.7x
PyExcelerate 107s 7.1x
pandas + xlsxwriter 374s 2.0x
pandas + openpyxl 762s 1.0x
polars.write_excel 1039s 0.7x

Type Detection Examples

CSV Value Excel Type Notes
123 Number Integer
3.14159 Number Float
true / FALSE Boolean Case insensitive
2024-01-15 Date Formatted as date
2024-01-15T10:30:00 DateTime ISO 8601 format
NaN Empty Graceful handling
hello world Text Default

Supported date formats: YYYY-MM-DD, YYYY/MM/DD, DD-MM-YYYY, DD/MM/YYYY, MM-DD-YYYY, MM/DD/YYYY

Building from Source

Requires Rust toolchain and maturin:

# Install maturin
pip install maturin

# Development build
maturin develop

# Release build (optimized)
maturin develop --release

# Build wheel for distribution
maturin build --release

Benchmarking

Run the included benchmark script:

# Default: 100K rows x 50 columns
python benchmark.py

# Custom size
python benchmark.py --rows 500000 --cols 100

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

xlsxturbo-0.4.0.tar.gz (28.9 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

xlsxturbo-0.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (865.9 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ ARM64

xlsxturbo-0.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (870.1 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ ARM64

xlsxturbo-0.4.0-cp38-abi3-win_amd64.whl (886.4 kB view details)

Uploaded CPython 3.8+Windows x86-64

xlsxturbo-0.4.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (931.5 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ x86-64

xlsxturbo-0.4.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (869.5 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARM64

xlsxturbo-0.4.0-cp38-abi3-macosx_11_0_arm64.whl (843.7 kB view details)

Uploaded CPython 3.8+macOS 11.0+ ARM64

xlsxturbo-0.4.0-cp38-abi3-macosx_10_12_x86_64.whl (895.3 kB view details)

Uploaded CPython 3.8+macOS 10.12+ x86-64

File details

Details for the file xlsxturbo-0.4.0.tar.gz.

File metadata

  • Download URL: xlsxturbo-0.4.0.tar.gz
  • Upload date:
  • Size: 28.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for xlsxturbo-0.4.0.tar.gz
Algorithm Hash digest
SHA256 0c2ae325e1df5b8e0a8502717555a613cfc0378bf97182ea0959382a1312a5b9
MD5 3f8590fb70df9b9d9a9ab6bb78ade3eb
BLAKE2b-256 51430948cfe74f5f7169093afef7b6b2cffddebae1d75227f4276e9f91fe0977

See more details on using hashes here.

Provenance

The following attestation bundles were made for xlsxturbo-0.4.0.tar.gz:

Publisher: release.yml on tstone-1/xlsxturbo

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xlsxturbo-0.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for xlsxturbo-0.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c413aa52c6cf17c9c21360d7f1508fab2e7af77dd7ec04f351cb25237277ea75
MD5 47de3657fbcc9aac982b3841207bc6c9
BLAKE2b-256 2a2668f7b1158375d558d88ddba63848a018537572eda5395924e5ff9b6bb4e0

See more details on using hashes here.

Provenance

The following attestation bundles were made for xlsxturbo-0.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on tstone-1/xlsxturbo

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xlsxturbo-0.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for xlsxturbo-0.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e2003c53baff3f0d1e399d8448acf609ee0e1eaf21dbe7a890345c112830db11
MD5 2d0f10a328d27ff059cfe395217f55ab
BLAKE2b-256 8dc374aa08946c61a8a5d50e9b861faca08116e661955d075ff714c1bb07ef62

See more details on using hashes here.

Provenance

The following attestation bundles were made for xlsxturbo-0.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on tstone-1/xlsxturbo

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xlsxturbo-0.4.0-cp38-abi3-win_amd64.whl.

File metadata

  • Download URL: xlsxturbo-0.4.0-cp38-abi3-win_amd64.whl
  • Upload date:
  • Size: 886.4 kB
  • Tags: CPython 3.8+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for xlsxturbo-0.4.0-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 3f610b7f216ff95d7774dea09654fc8a48bc2b78f11d554577ca984af60a850c
MD5 ae18c12421447e1de311dccab6e3f861
BLAKE2b-256 af0ddb05b79fbd8707f4808f24611f6f942e7530573414a7671c10162f342135

See more details on using hashes here.

Provenance

The following attestation bundles were made for xlsxturbo-0.4.0-cp38-abi3-win_amd64.whl:

Publisher: release.yml on tstone-1/xlsxturbo

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xlsxturbo-0.4.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for xlsxturbo-0.4.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3b592bba9aa9cc1418c9f20ca7418388e1728628fc1f675776467614c5f927ed
MD5 d6c1ffd1ac39ec6a91dc685fab07ddbb
BLAKE2b-256 770e19a257a3eed02b5359ba12baebbda82fec3b27a59908f2acffc94f98557a

See more details on using hashes here.

Provenance

The following attestation bundles were made for xlsxturbo-0.4.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on tstone-1/xlsxturbo

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xlsxturbo-0.4.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for xlsxturbo-0.4.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 72b46fe03529185e1cecb9c403681b2bbf0e92d1a1b80944def9400c7f0d201d
MD5 e46ed495e8465ffade225c03a16ea965
BLAKE2b-256 0d16c66e371e06e5c70d3141f30d8e50c8db0977fdd2b09920a58e4c2751a6ef

See more details on using hashes here.

Provenance

The following attestation bundles were made for xlsxturbo-0.4.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on tstone-1/xlsxturbo

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xlsxturbo-0.4.0-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for xlsxturbo-0.4.0-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6c240c706c332ca967160f9499b52036215e4454273fc1dcf38f6ce495ba7ac0
MD5 4fd176850b2f02bcf00dd8f8d126b1e5
BLAKE2b-256 82ad6fe23f7e71e83d7d8923bc95c78af854d74c413747f4b3696559168a84de

See more details on using hashes here.

Provenance

The following attestation bundles were made for xlsxturbo-0.4.0-cp38-abi3-macosx_11_0_arm64.whl:

Publisher: release.yml on tstone-1/xlsxturbo

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xlsxturbo-0.4.0-cp38-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for xlsxturbo-0.4.0-cp38-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 974d6ab54f959a58e943a121dfc53b5515f999a593be7c2ac29e60945cda8aca
MD5 82b9b464772a60c7fdc01a53845f4eea
BLAKE2b-256 b41217f4f87ad5ee81b92826267fe229602dd20036ebfaf5803f2c48f815b710

See more details on using hashes here.

Provenance

The following attestation bundles were made for xlsxturbo-0.4.0-cp38-abi3-macosx_10_12_x86_64.whl:

Publisher: release.yml on tstone-1/xlsxturbo

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page