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.71-cp312-cp312-win_amd64.whl (8.8 MB view details)

Uploaded CPython 3.12Windows x86-64

turboxl-0.1.71-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (3.7 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

turboxl-0.1.71-cp312-cp312-macosx_15_0_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.12macOS 15.0+ x86-64

turboxl-0.1.71-cp312-cp312-macosx_15_0_arm64.whl (998.5 kB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

turboxl-0.1.71-cp311-cp311-win_amd64.whl (8.8 MB view details)

Uploaded CPython 3.11Windows x86-64

turboxl-0.1.71-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (3.7 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

turboxl-0.1.71-cp311-cp311-macosx_15_0_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.11macOS 15.0+ x86-64

turboxl-0.1.71-cp311-cp311-macosx_15_0_arm64.whl (997.5 kB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

turboxl-0.1.71-cp310-cp310-win_amd64.whl (8.8 MB view details)

Uploaded CPython 3.10Windows x86-64

turboxl-0.1.71-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (3.7 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

turboxl-0.1.71-cp310-cp310-macosx_15_0_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.10macOS 15.0+ x86-64

turboxl-0.1.71-cp310-cp310-macosx_15_0_arm64.whl (996.2 kB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

File details

Details for the file turboxl-0.1.71-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: turboxl-0.1.71-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 8.8 MB
  • Tags: CPython 3.12, 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.71-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 7ff4b7eb27ab3cfa59d4d6a2ad583b569ebe1242b6b6c754b2b0eec9253c2592
MD5 638e537547d1952e26546daf7f40a9ca
BLAKE2b-256 ec08a7ac2ccce1aa69ec7b3fce6407b9d0de728f0b026dbe432cc9f8109c158d

See more details on using hashes here.

File details

Details for the file turboxl-0.1.71-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.71-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 90f713a41d49cdbbc513afe18e62087e67517f2902c12a28b0018934b315e0c9
MD5 490e8c9690f80c590ce3ee2a7766c430
BLAKE2b-256 62628ebd72e258ea1db095381181e86fa72964201d1dd9635ef48a9ebfaed48d

See more details on using hashes here.

File details

Details for the file turboxl-0.1.71-cp312-cp312-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.71-cp312-cp312-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 e0b9f47dd16365c74c69d84f30674d269092180f24fcd3957944b58eee475c2a
MD5 4928c894420ff2e1bf9a87cd7015a2ea
BLAKE2b-256 e8361c5579460fd42ed7ecbc391d25fea49b586083cecea12c3eac04e6558d31

See more details on using hashes here.

File details

Details for the file turboxl-0.1.71-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.71-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 e11f9c4a4083ee2542afbf0947a7dc2c6a68a0122a25dd921dbdbecdb1bf7b7f
MD5 abdf500f54e5aae46357ec26e7081ae9
BLAKE2b-256 939aa54587b57cd8e3acb81ad2a46a4ded6866a2b3e592f0abcad0fe8c4492be

See more details on using hashes here.

File details

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

File metadata

  • Download URL: turboxl-0.1.71-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 8.8 MB
  • 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.71-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 e21ab2e44eb3e80185730c0543c92ce3a75deb5b13596c05c8f157da55bc26ab
MD5 7557ec5243de63f90dc372a62c1473f3
BLAKE2b-256 d99c80a4b92f23cab70708a5415e841edb930cb99e33cdfb039c661508846bd0

See more details on using hashes here.

File details

Details for the file turboxl-0.1.71-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.71-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 44df566a5bf85af47d9a44f2045f01359127eebfde82c2ec04b76ecba6454f2e
MD5 9ff519ed2ffda9623a883d80c421a237
BLAKE2b-256 d1a269d3cf0dd89666da27f04cf3fcbd9dc3eed0b83559325876ade851e1d749

See more details on using hashes here.

File details

Details for the file turboxl-0.1.71-cp311-cp311-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.71-cp311-cp311-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 dae27dfc4b041cd29b96b1d28413c30fb080214956ff9855265dfe1bdad738b3
MD5 727700df0693c35fcd9f6e2d495e86f6
BLAKE2b-256 4aef3089cf519ae6d775737bfb671f1523150d0ab0451fa23c690bde0ba373fe

See more details on using hashes here.

File details

Details for the file turboxl-0.1.71-cp311-cp311-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.71-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 c6e8d1c555a649a4c6c54d4543ed0225249f874d87a6e6bdb7d5edbdc29202ba
MD5 1b405d393ef0f98828404436646f5496
BLAKE2b-256 8f3664236d83004bf045f2c1b1448cea8114c3e3d9e24a990e83253d5412f7da

See more details on using hashes here.

File details

Details for the file turboxl-0.1.71-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: turboxl-0.1.71-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 8.8 MB
  • Tags: CPython 3.10, 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.71-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 ba0450cd0559bc05189380ef3788f83bca970f528dd3730e1044ed1fc11c6be0
MD5 36cac56ebf0bff8eefbdc511db288f96
BLAKE2b-256 271a58e0de128cc2bb92be27f49ab87cbd2d6dd6e9063cc8280534e7e0460e74

See more details on using hashes here.

File details

Details for the file turboxl-0.1.71-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.71-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 e57cc9f99f602ccc61eff9dfc502d36a0496555da3d2f461f63d562db0eb00c0
MD5 fb12f0e5a68571ba480a0b20e53eb202
BLAKE2b-256 dc5382c279d8514695cdafbac141f49dbfda45316bb45f3cc81b60b47d46fe82

See more details on using hashes here.

File details

Details for the file turboxl-0.1.71-cp310-cp310-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.71-cp310-cp310-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 554efcb3496038022389ee92bf8147b598909c87d6401236d73097ee2308086a
MD5 d6ecd0497cd2d803693cf5dd9140db9b
BLAKE2b-256 4a3992f8bb6a7c830ed607e69153306ecc5cd2e3a81799d46252c88866081227

See more details on using hashes here.

File details

Details for the file turboxl-0.1.71-cp310-cp310-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for turboxl-0.1.71-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 17e5624ddc578fcce85cd6ac929dd9028d999ff9f0852ba74b3f7c485e65c92a
MD5 05f5cb2f1c5f4f3d655038241e0c076d
BLAKE2b-256 80ec1eaab65f36622fc04382dbbab2f0be26d74921909e6e6cc6ff34d340565a

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