Skip to main content

messy-xlsx

Tests PyPI version

Parse messy Excel files (XLSX, XLS, CSV) to clean pandas DataFrames with intelligent structure detection, merged cell handling, and type normalization.

Install

pip install messy-xlsx

# Optional: formula evaluation
pip install messy-xlsx[formulas]

# Optional: legacy .xls support
pip install messy-xlsx[xls]

# Everything
pip install messy-xlsx[all]

Quick Start

from messy_xlsx import MessyWorkbook, SheetConfig, read_excel

# Quick read
df = read_excel("data.xlsx")

# With options
df = read_excel("data.xlsx", sheet="Sheet1", skip_rows=2, normalize=False)

# Workbook API
with MessyWorkbook("data.xlsx") as wb:
    df = wb.to_dataframe(sheet="Sheet1")
    all_dfs = wb.to_dataframes()  # All sheets
    structure = wb.get_structure()

# From bytes (S3, cloud storage)
import io
with MessyWorkbook(io.BytesIO(content), filename="data.xlsx") as wb:
    df = wb.to_dataframe()

messy-xlsx does not close caller-owned binary streams. For each library operation, a seekable stream is borrowed from byte zero and restored to the cursor position that operation received, including when parsing fails. Supply a non-seekable stream before any bytes have been consumed; it is read once into an internal snapshot, remains open, and leaves the original exhausted. filename= supplies or overrides .name for diagnostics and extension fallback.

Configuration

from messy_xlsx import SheetConfig, MergeStrategy, HeaderDetectionMode

config = SheetConfig(
    # Row handling
    skip_rows=0,
    header_rows=1,
    skip_footer=0,
    cell_range=None,                       # "A1:F100"

    # Detection
    auto_detect=True,
    header_detection_mode="smart",         # or HeaderDetectionMode.SMART
    header_confidence_threshold=0.7,

    # Parsing
    merge_strategy="fill",                 # or MergeStrategy.FILL
    include_hidden=False,

    # Normalization
    normalize=True,
    normalize_dates=True,
    normalize_numbers=True,
    normalize_whitespace=True,
    sanitize_column_names=True,            # BigQuery-compatible names

    # DataFrame formula cells: cached results (True) or expressions (False)
    evaluate_formulas=True,
)

with MessyWorkbook("data.xlsx", sheet_config=config) as wb:
    df = wb.to_dataframe()

All string-based config values accept both raw strings and enum types:

from messy_xlsx import MergeStrategy

# These are equivalent:
SheetConfig(merge_strategy="fill")
SheetConfig(merge_strategy=MergeStrategy.FILL)

# Enums compare equal to strings:
assert MergeStrategy.FILL == "fill"  # True

Invalid values raise ValueError at construction time:

SheetConfig(skip_rows=-1)              # ValueError
SheetConfig(merge_strategy="banana")   # ValueError

Multi-Sheet

from messy_xlsx import read_all_sheets, analyze_excel

# Read all sheets
results = read_all_sheets("data.xlsx")
for name, df in results.items():
    print(f"{name}: {len(df)} rows")

# Analyze without loading
info = analyze_excel("data.xlsx")
for sheet in info:
    print(f"{sheet.name}: {sheet.row_count} rows, {sheet.column_count} cols")

Output

Output is compatible with BigQuery/Arrow. Column names are sanitized by default and mixed-type columns are coerced to strings.

Dependencies

  • Python >= 3.11
  • fastexcel >= 0.19
  • openpyxl >= 3.1.5
  • pandas >= 3.0
  • numpy >= 2.4
  • pyarrow >= 23.0

Optional:

  • formulas (formula evaluation fallback for cell access)
  • xlrd (XLS support)

Development

# Install with dev dependencies
make install

# Run tests, lint, type check
make ci

# Run benchmarks
make benchmark

# Serve documentation locally
make docs

License

MIT

Download files

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

Source Distribution

messy_xlsx-0.10.0.tar.gz (57.2 kB view details)

Uploaded Source

Built Distribution

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

messy_xlsx-0.10.0-py3-none-any.whl (70.0 kB view details)

Uploaded Python 3

File details

Details for the file messy_xlsx-0.10.0.tar.gz.

File metadata

  • Download URL: messy_xlsx-0.10.0.tar.gz
  • Upload date:
  • Size: 57.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for messy_xlsx-0.10.0.tar.gz
Algorithm Hash digest
SHA256 681c843593297228d97198ae2f0467959c72c1514933ccb6d8f7c61a4a9aff71
MD5 0dd2bcbd3a0aa42aa9e0d4f7d5cd1db5
BLAKE2b-256 8a3ae2567d6d9a4e8cd321843c0c02105a6c04f30b873e3e5a76ec04d9e22d05

See more details on using hashes here.

Provenance

The following attestation bundles were made for messy_xlsx-0.10.0.tar.gz:

Publisher: publish.yml on ivan-loh/messy-xlsx

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

File details

Details for the file messy_xlsx-0.10.0-py3-none-any.whl.

File metadata

  • Download URL: messy_xlsx-0.10.0-py3-none-any.whl
  • Upload date:
  • Size: 70.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for messy_xlsx-0.10.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a4d421a39e911fb44e7060ee66d9f381df2e19236471dedbf308305200aa97b0
MD5 62511800957b5db03b2fb7dc6a406c97
BLAKE2b-256 7a12494d1e1dd26d9c0354f7aa298a49556847edd9fb3c8efca08cb0a7d7c2f5

See more details on using hashes here.

Provenance

The following attestation bundles were made for messy_xlsx-0.10.0-py3-none-any.whl:

Publisher: publish.yml on ivan-loh/messy-xlsx

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