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.44-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.44-cp314-cp314t-manylinux_2_28_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.28+ ARM64

turboxl-0.1.44-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.44-cp314-cp314-manylinux_2_28_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ ARM64

turboxl-0.1.44-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.44-cp313-cp313-manylinux_2_28_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

turboxl-0.1.44-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.44-cp312-cp312-manylinux_2_28_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

turboxl-0.1.44-cp311-cp311-win_amd64.whl (984.5 kB view details)

Uploaded CPython 3.11Windows x86-64

turboxl-0.1.44-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.44-cp311-cp311-manylinux_2_28_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.11macOS 11.0+ x86-64

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

Uploaded CPython 3.11macOS 11.0+ ARM64

turboxl-0.1.44-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.44-cp310-cp310-manylinux_2_28_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ ARM64

turboxl-0.1.44-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.44-cp39-cp39-manylinux_2_28_aarch64.whl (3.5 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.28+ ARM64

File details

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

File metadata

File hashes

Hashes for turboxl-0.1.44-cp314-cp314t-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9bbed0bffe798e405979d37102567b85092e47751196ca3e7d602049cb738dad
MD5 1e4661cc59ea8194a371a1943f3d0440
BLAKE2b-256 76159eae7c59bb26be973cd14c190123114507841fce54616745af67b86fc7a3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for turboxl-0.1.44-cp314-cp314t-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 973465dd564cf6978083bf4b7723051e85fed4028d362aff6783348ade7b501f
MD5 01ef40b28686ef7fa80e2d2fed758e4c
BLAKE2b-256 a153278d66c44cce96f6f7be7cb03256972573fd49906c675aeb241938254a33

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for turboxl-0.1.44-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 bbbbbcfb343cf1641ce8ebf2cd374e71b0048d3a9d53756eeadbdfab99d02e3d
MD5 e2e65740c508c0547d4476ec02f956a7
BLAKE2b-256 af98d5516a6e258c2053106016497c7e285d73ee361056f6f6c210131b17ceab

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for turboxl-0.1.44-cp314-cp314-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5261576cd76d140a439257d3cffbdcd8341ec29755243738dedd0841300ba5e4
MD5 24b497690e2fd559888a1a82b09ea669
BLAKE2b-256 59a46fd90242f048d764b8e585a539342cb5485b400d736011d2713fbac85665

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for turboxl-0.1.44-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b9b51882d7e32c14eb0f5e88478b16bfa6fdbc67bbcb69ebd9fe9dbb1892b5af
MD5 7ca46ebc7a5c6bad8e654b6716cae235
BLAKE2b-256 ad1ed62dd45448564eb4ccc2bc8eac80d79fe18283b787dcb0ec62b1c4bce39c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for turboxl-0.1.44-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5b4bcec5fe8835f4961cfad36a1ab29835bd7e8ebf8801ae0aa6acd334b7f90c
MD5 942caaf3287f3ba8b99240a71f2cd3b8
BLAKE2b-256 491b930f9627f402b6ccd16dac659993e5fec3606ce670c398d87262f9e06343

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for turboxl-0.1.44-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a5502bfba72149781fe53f5e48cb897897bc3d35cbbeb4f94743c9e0f46b923a
MD5 63eea585d3f074185c3dc1cd4f46858a
BLAKE2b-256 49b7488972a28444a10a348841457583bc2279c433092aa264690b86cd2cc33a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for turboxl-0.1.44-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 279c3b5658e79622da26ce7950896cae911dd7a1406eee46f0d73dbfdaadf763
MD5 035997e8e9576100bbad0cd046b46c63
BLAKE2b-256 bf31d9bccb7643b1a55e0366ebfb7841db28829e44a4632a397fc4a0d9da8b0a

See more details on using hashes here.

File details

Details for the file turboxl-0.1.44-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: turboxl-0.1.44-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 984.5 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for turboxl-0.1.44-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 a8817bff3dd3d02f5606bad8f3da0da42e8ea050745ba1b3f71e4d4c07cb4a6c
MD5 f1f0bf614ce3d233d223f0bee27b8d58
BLAKE2b-256 e3059997d2e25e857b12e4b21dba3862b8b6ca80ed53a82cdec91eece20847cb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for turboxl-0.1.44-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 cb8bc0a355cabb7fb89ffa43b22e33cc1dfd1d3edb4a54b4e3755fcb3de4d807
MD5 d12e54a16374670df5275bec3df9ef2d
BLAKE2b-256 85d2cb3b3e07ce9755f1c23e77ea619ac089e00867b65f855afc30078dd9d0c2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for turboxl-0.1.44-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 8187fe204bb7a4758bc06a5817f0aa3cd56f57f26b52fab1ea98da315c4574df
MD5 d388a55c58933ad342e69d6f1881d455
BLAKE2b-256 6f32c41e63093671c65bf4ece6dd1b491584c1fd52acbc6f7780e6719fc499f2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for turboxl-0.1.44-cp311-cp311-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 84e36c3d13d83434aba8b43d7674a95fe3dc25e4f8418b7f499180265ad25100
MD5 5e0970467245fd4f90b19851a2c6d76e
BLAKE2b-256 23e08966d5df1771963feed07bf9136df88670a08019029ee32e7a3dda5b9020

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for turboxl-0.1.44-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 767da758cdcb53993215502553c282e82e2823f2edf97d70d6057d0861e36810
MD5 f511acc5e7c28ef415f2f020eda397c7
BLAKE2b-256 fff71abdd284801215c6c2a1a4541a2f3fe1ee52853e67442467705961a4796a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for turboxl-0.1.44-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6cf3bddad9d490f1121b0a21316d6704ffdb8704ed90abc06777217e788b6114
MD5 f5a06b4acfd622b55ea5e13c0985f086
BLAKE2b-256 e215142589cbb935ffcde5202569d5c2e2ec8356b392bc7ff78f38e2a3b6c5f1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for turboxl-0.1.44-cp310-cp310-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a9f5d2ba3a84e74d9116edc64593e9e8ae5d8835d2c87560ba52babfcf662f2d
MD5 047c3c2459ec2a85fbe36988c39a7a27
BLAKE2b-256 f29c289ef8079e763288f35996b87a2f4c2a66e64d4def755fafddf5fd0edb6f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for turboxl-0.1.44-cp39-cp39-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c3bf8db68e093e739f17306db6dec4234b91c5f2759a430100a23e6f2c7cadc4
MD5 8ea2c98fbf82b54104f36b63059074fc
BLAKE2b-256 bc9a8f46423ca722372b31e09b3b45ea7d427264a63c05ff16bce6a1e29f66e6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for turboxl-0.1.44-cp39-cp39-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6dd2ef75b873cdb784c1a28f1713bf21c8406f815b8b430fe8422ce68e3358fc
MD5 0cdcdae00d460e4ace973dbca3895f1b
BLAKE2b-256 698bdd541ded9071978e3335a41b39f2299800c4590b5de06d845f946244dfd2

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