Skip to main content

Fast XLSX to CSV converter (C++ core with Python bindings)

Project description

TurboXL

TurboXL Logo

Fast, read-only XLSX to CSV converter with C++20 core and Python bindings.

Performance

Real-world benchmarks on Chicago Crime dataset (21.9MB, 146,574 rows):

Metric TurboXL OpenPyXL Improvement
Speed 2.4s 63.1s 26.7x faster
Memory 33.5MB 66.9MB 2.0x less
Throughput 62,040 rows/sec 2,321 rows/sec 26.7x faster

Dataset: Chicago Crimes 2025

🚀 Recent Optimizations Implemented:

  • zlib-ng integration - Up to 2.5x faster ZIP decompression
  • Release build optimizations - -O3 -march=native -flto for GCC/Clang, /O2 /GL /arch:AVX2 for MSVC
  • Arena-based shared strings - Memory-efficient string storage
  • Chunked ZIP reading - 512 KiB buffer optimization

What It Does

  • ✅ Read XLSX files and convert to CSV
  • ✅ Handle shared strings, numbers, dates, booleans
  • ✅ Process multiple worksheets
  • ✅ Memory-efficient streaming (33.5MB for 146k rows)
  • ✅ Cross-platform (Linux, macOS, Windows)

What It Doesn't Do

  • ❌ Write or modify XLSX files
  • ❌ Formula evaluation (uses cached values)
  • ❌ Charts, images, pivot tables
  • ❌ Password-protected files

Quick Start

Python

import turboxl

# Convert first sheet
csv_data = turboxl.read_sheet_to_csv("data.xlsx")

# Convert specific sheet
csv_data = turboxl.read_sheet_to_csv("data.xlsx", sheet="Sheet2")

# Custom options
csv_data = turboxl.read_sheet_to_csv(
    "data.xlsx",
    sheet=0,
    delimiter=";",
    date_mode="iso"
)

# Save to file
with open("output.csv", "w", encoding="utf-8") as f:
    f.write(csv_data)

C++

#include <xlsxcsv.hpp>
#include <iostream>

int main() {
    try {
        std::string csv = xlsxcsv::readSheetToCsv("data.xlsx");
        std::cout << csv << std::endl;
    } catch (const std::exception& e) {
        std::cerr << "Error: " << e.what() << std::endl;
    }
    return 0;
}

Building

Prerequisites

Install system dependencies (used via pkg-config/CMake):

# macOS (Recommended for best performance)
brew install libxml2 minizip-ng zlib-ng cmake pybind11 pkg-config

# Ubuntu/Debian (Recommended for best performance)
sudo apt-get install -y libxml2-dev libminizip-dev cmake build-essential pkg-config
# For zlib-ng on Ubuntu/Debian, build from source:
# git clone https://github.com/zlib-ng/zlib-ng.git
# cd zlib-ng && cmake -B build && cmake --build build -j && sudo cmake --install build

# Windows (vcpkg)
vcpkg install libxml2 minizip-ng zlib-ng

Performance Note: Installing zlib-ng provides significant performance improvements (up to 2.5x faster decompression). The build system automatically detects and uses zlib-ng if available, falling back to standard zlib otherwise.

Build C++ Core (library only)

Build the C++ core without Python bindings (no Python/pybind11 required):

# From repo root
cmake -S . -B build \
  -DCMAKE_BUILD_TYPE=Release \
  -DBUILD_TESTS=OFF \
  -DBUILD_PYTHON=OFF \
  -DBUILD_CLI=OFF
cmake --build build -j4

Artifacts:

  • Static library: build/libturboxl_core.a

Build Modes:

  • Release (Recommended): Enables -O3 -march=native -flto optimizations
  • Debug: Enables debugging symbols and assertions

Build Options

  • BUILD_TESTS=ON/OFF - Build test suite (default: ON)
  • BUILD_PYTHON=ON/OFF - Build Python bindings (default: ON)
  • BUILD_CLI=ON/OFF - Build command-line tool (default: OFF)

Python Wheel

TurboXL ships a PEP 517/518 build powered by scikit-build-core. The wheel builds the C++ core and Python extension in Release mode using CMake.

Python prerequisites

python3 -m pip install -U pip build scikit-build-core pybind11

System dependencies listed above (libxml2, minizip-ng, zlib-ng, cmake, compiler) must be installed and discoverable by CMake/pkg-config.

Build the wheel

# From repo root
python3 -m build -w

Outputs go to dist/, for example:

  • dist/turboxl-0.1.0-<python>-<abi>-<platform>.whl

Install the built wheel locally:

pip install python/dist/turboxl-*.whl

Tips:

  • Parallel CMake build: CMAKE_BUILD_PARALLEL_LEVEL=4 python3 -m build -w
  • macOS arch (defaults to arm64 via pyproject.toml): to override, you can pass --config-setting=cmake.define.CMAKE_OSX_ARCHITECTURES="arm64;x86_64" to python -m build.

Requirements

  • C++: C++20 compiler (GCC 10+, Clang 12+, MSVC 2019+)
  • Build: CMake 3.20+
  • Python: 3.8-3.12 (for Python bindings)

API Reference

Python

turboxl.read_sheet_to_csv(
    xlsx_path: str,
    sheet: Union[str, int] = None,  # First sheet if None
    delimiter: str = ",",
    newline: Literal["LF", "CRLF"] = "LF",
    include_bom: bool = False,
    date_mode: Literal["iso", "rawNumber"] = "iso"
) -> str

C++

struct CsvOptions {
    std::string sheetByName;
    int sheetByIndex = -1;
    char delimiter = ',';
    bool includeBom = false;
    // ... more options
};

std::string readSheetToCsv(
    const std::string& xlsxPath,
    const CsvOptions& opts = {}
);

License

MIT License - see LICENSE file for details.

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

turboxl-0.1.16-cp314-cp314t-manylinux_2_28_x86_64.whl (3.6 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.28+ x86-64

turboxl-0.1.16-cp314-cp314t-manylinux_2_28_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.28+ ARM64

turboxl-0.1.16-cp314-cp314-manylinux_2_28_x86_64.whl (3.6 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

turboxl-0.1.16-cp314-cp314-manylinux_2_28_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ ARM64

turboxl-0.1.16-cp313-cp313-manylinux_2_28_x86_64.whl (3.6 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

turboxl-0.1.16-cp313-cp313-manylinux_2_28_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

turboxl-0.1.16-cp312-cp312-manylinux_2_28_x86_64.whl (3.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

turboxl-0.1.16-cp312-cp312-manylinux_2_28_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

turboxl-0.1.16-cp311-cp311-manylinux_2_28_x86_64.whl (3.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

turboxl-0.1.16-cp311-cp311-manylinux_2_28_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ ARM64

turboxl-0.1.16-cp311-cp311-macosx_11_0_x86_64.whl (712.4 kB view details)

Uploaded CPython 3.11macOS 11.0+ x86-64

turboxl-0.1.16-cp311-cp311-macosx_11_0_arm64.whl (602.4 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

turboxl-0.1.16-cp310-cp310-manylinux_2_28_x86_64.whl (3.6 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

turboxl-0.1.16-cp310-cp310-manylinux_2_28_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ ARM64

turboxl-0.1.16-cp39-cp39-manylinux_2_28_x86_64.whl (3.6 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.28+ x86-64

turboxl-0.1.16-cp39-cp39-manylinux_2_28_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.28+ ARM64

turboxl-0.1.16-cp38-cp38-manylinux_2_28_x86_64.whl (3.6 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.28+ x86-64

turboxl-0.1.16-cp38-cp38-manylinux_2_28_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.28+ ARM64

File details

Details for the file turboxl-0.1.16-cp314-cp314t-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.16-cp314-cp314t-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 73c91402a8ea029636ea85a08b2225377c08e281e64cf4b7505aea154b640edd
MD5 b617f29eb42440e93da292fc7f917b12
BLAKE2b-256 0d5bc35a62747fc6fb9dfb47cd017a9169cd15e4723921f89c007cc6ce859cb8

See more details on using hashes here.

File details

Details for the file turboxl-0.1.16-cp314-cp314t-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.16-cp314-cp314t-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 21afdd6289eb6027c266e79e14bdc8e8bd62217bca8f82896d39ee002e6b37b9
MD5 dfcda98bd0b47c4c9dbeac42a3f2040b
BLAKE2b-256 983738c4cb347f430b238d658d15d62421c69d58b025be7cb032d85b8f2b13a5

See more details on using hashes here.

File details

Details for the file turboxl-0.1.16-cp314-cp314-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.16-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1c9b2f16925036cc267c7fbb8dd9266b5fe25d572bf961f6ae1bb31217ad3c9f
MD5 9a3101e42890ede1ca80ee69432f9dc7
BLAKE2b-256 7df0b3f1232b7c09d0f930eda5efd132989c8c4da4db65ded4619d920a2300d8

See more details on using hashes here.

File details

Details for the file turboxl-0.1.16-cp314-cp314-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.16-cp314-cp314-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a566813e7c3432d4e93c0a8d589e8952e9691fad5af4514606bc2206a01eb69b
MD5 8e8cf7934328dcb8309ea4cf6c04b493
BLAKE2b-256 608bc3dbcb45d1a1878ee8882263b23dd0e7474e217839a233b37b6af1187def

See more details on using hashes here.

File details

Details for the file turboxl-0.1.16-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.16-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 451c283d2c92896e9a854a49832066bf2a5ecc7a6a9e8cb3eb9381527d8a9d48
MD5 9d4fcfe44e3da85b1b7cd1e146309b2d
BLAKE2b-256 1d3102630ad6063557072503b7206ee348c4a2cdd2584e80c94abdd5b13dbb56

See more details on using hashes here.

File details

Details for the file turboxl-0.1.16-cp313-cp313-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.16-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6e222bdcd514b94c5d76106743f2fb94ea9988920d735fbd437b652b8644912c
MD5 4fe364cdd7c5693a707ecdc32127055b
BLAKE2b-256 559c9068476556842650e788cf9ac887846a4828c47cf929605291059f90f3c8

See more details on using hashes here.

File details

Details for the file turboxl-0.1.16-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.16-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d07f3c62d918682f0379b9c4fee1c1e40eedb139e432a7b608641918a0ab59b3
MD5 99b02f4f7273316226091f0dc926fc52
BLAKE2b-256 19cd5051b7f480f9eaca43c1c7b72e47869dc63fd73d2b8cff85fc14fd7529e0

See more details on using hashes here.

File details

Details for the file turboxl-0.1.16-cp312-cp312-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.16-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a0708b10ba845b9203491e1f47200ee75a6d986ed19029bde4c1fd0ee35ada65
MD5 4c6fdb52baf14f9c328cbd46312f8e7d
BLAKE2b-256 b34deb49fc201de7fbf8c0b958d237f393ce6204e3eced323de1699fa3c23352

See more details on using hashes here.

File details

Details for the file turboxl-0.1.16-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.16-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5497b11d3a9a9ed79355414bf3bd6d9fc4e10e6c63361c193baa1bfec321a7bf
MD5 5ddcce4366c14b9ee3c7de2281ea2ab7
BLAKE2b-256 792e902fabf7ae218490c6ec7ff2b0a7056a64965d85594128bbce0a18121056

See more details on using hashes here.

File details

Details for the file turboxl-0.1.16-cp311-cp311-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.16-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 15d600243dd12bcd8028416565cb47c20e1aa90da36d1b20a99ac84c4bef297b
MD5 fe4bb2697a09a050ec2a6706b615217b
BLAKE2b-256 853a2c33ba3828a01f8eb2ef8287a0457b56abf140d1a02fd51c239483ad2162

See more details on using hashes here.

File details

Details for the file turboxl-0.1.16-cp311-cp311-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.16-cp311-cp311-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 669ab17f1fdf87383af47473718b364424aed420be6ecd11e9802cd664d54dd1
MD5 d8c7967729ff1a2500bc7869a4dde3cb
BLAKE2b-256 b1125b7f7df7e1250e190b89dc4c46c968384f41628c7d69edf1d9ebe85487ac

See more details on using hashes here.

File details

Details for the file turboxl-0.1.16-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.16-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5fb8db0812c31867d01e80f32378b4cc344a2eb8826160dc5d29fe0ab846ab80
MD5 180609d856eb76ce32830bd27d795bec
BLAKE2b-256 71ce5e72cec8f6588b5324f594a2b160885b5eaa7d0f23f22b643b46314acc7f

See more details on using hashes here.

File details

Details for the file turboxl-0.1.16-cp310-cp310-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.16-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9d76d24eb1bae29de3f0e1161826fa9b16dcdfff5cd2e1943c1089025df27746
MD5 491d586c7269265cc6f551552f006560
BLAKE2b-256 7d6e60db97ed17f81abd6965d388df1ebbba3f2a5967ea743f3527c33d95c247

See more details on using hashes here.

File details

Details for the file turboxl-0.1.16-cp310-cp310-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.16-cp310-cp310-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 be0381c21e35766c9f04aa1ed410e7757d436650d0a2667ad1d84c85486ab811
MD5 ba7bcf0edfb0562796a7cd02da209594
BLAKE2b-256 a31fa871f5407f24d705aa181196f6f0988feff6f6f765be577cfdd0712e6873

See more details on using hashes here.

File details

Details for the file turboxl-0.1.16-cp39-cp39-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.16-cp39-cp39-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7f3a4be21f61a2ee53361326d5fdd065186c08dd7e100fa080c735702ce10be1
MD5 a71a5211ac32d4500ea8913ed5c705bc
BLAKE2b-256 00ef6ef086b01d7c4354ca601bf0cddd4e8ff2f8114c0e7cc1a2e693340860a3

See more details on using hashes here.

File details

Details for the file turboxl-0.1.16-cp39-cp39-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.16-cp39-cp39-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 06139852c9dc686377144393827521bc812ee64ddccbdbbb2e4e911f7246d2d6
MD5 9e193ab73c68b6e64f3b6599bcc083b1
BLAKE2b-256 111d43cfede4816f4376782c4133d814536065455f0bd012ff222810496d4629

See more details on using hashes here.

File details

Details for the file turboxl-0.1.16-cp38-cp38-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.16-cp38-cp38-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d68506baaede3250f88d762de99bd1c59fdc086cc8e73b500e44d1f3b669db73
MD5 744b4ebf498cfdd00403f29e8f2c6676
BLAKE2b-256 54b20c66a4f76549f45449ba333627e801c72b6fa18b7bdec041d91c8b018e09

See more details on using hashes here.

File details

Details for the file turboxl-0.1.16-cp38-cp38-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.16-cp38-cp38-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 49979f339183c976fa47e8766bf0475a5f9f3b0e10a244420ea790f32df83ff9
MD5 6e463b06b1056756f9fc3b6c2e5e0659
BLAKE2b-256 60a748c32a1dbcf989e310e2651468d20e8b43245bc346c9f75b776f9b7e0262

See more details on using hashes here.

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