Skip to main content

Excel to publication-ready LaTeX tables

Project description

pubtab

pubtab logo

PyPI Version Python Versions License Downloads

Language: English | 中文

Convert Excel tables to publication-ready LaTeX (and back) with stable roundtrip behavior.

Highlights

  • Roundtrip Consistency — Designed for tex -> xlsx -> tex workflows with minimal structural drift.
  • All-Sheets by Defaultxlsx2tex exports every sheet as *_sheetNN.tex when --sheet is not set.
  • Style Fidelity — Preserves merged cells, colors, rich text, rotation, and common table semantics.
  • Publication Preview — Generate PNG/PDF directly from .tex via one CLI entry.
  • Overleaf-Ready Output — Generated .tex starts with commented \usepackage{...} hints.

Examples

Showcase

Example table4 Example table7

Example table8 Example table10

Full Gallery (11 examples)

table1 table2 table3

table4 table5 table6

table7 table8 table9

table10 table11

Example A: Excel -> LaTeX (all sheets)

pubtab xlsx2tex ./tables/benchmark.xlsx -o ./out/benchmark.tex

Output files (when workbook has multiple sheets):

  • ./out/benchmark_sheet01.tex
  • ./out/benchmark_sheet02.tex
  • ...

Example B: LaTeX -> Excel (multi-table to multi-sheet)

pubtab tex2xlsx ./paper/tables.tex -o ./out/tables.xlsx

Example C: LaTeX -> PNG / PDF preview

pubtab preview ./out/benchmark_sheet01.tex -o ./out/benchmark_sheet01.png --dpi 300
pubtab preview ./out/benchmark_sheet01.tex --format pdf -o ./out/benchmark_sheet01.pdf

Generated .tex header includes package hints (comments only):

% Theme package hints for this table (add in your preamble):
% \usepackage{booktabs}
% \usepackage{multirow}
% \usepackage[table]{xcolor}

Quick Start

pip install pubtab

Latest PyPI release: pubtab on PyPI

CLI Quick Start

# 1) Excel -> LaTeX
pubtab xlsx2tex table.xlsx -o table.tex

# 2) LaTeX -> Excel
pubtab tex2xlsx table.tex -o table.xlsx

# 3) Preview
pubtab preview table.tex -o table.png --dpi 300

# 4) Native batch pipeline (directory input)
pubtab tex2xlsx ./tables_tex -o ./out/xlsx
pubtab xlsx2tex ./out/xlsx -o ./out/tex
pubtab preview ./out/tex -o ./out/png --format png --dpi 300

Python Quick Start

import pubtab

# Excel -> LaTeX
pubtab.xlsx2tex("table.xlsx", output="table.tex", theme="three_line")

# LaTeX -> Excel
pubtab.tex_to_excel("table.tex", "table.xlsx")

# Preview (.png by default)
pubtab.preview("table.tex", dpi=300)

# Native batch pipeline (directory input)
pubtab.tex_to_excel("tables_tex", "out/xlsx")
pubtab.xlsx2tex("out/xlsx", output="out/tex")
pubtab.preview("out/tex", output="out/png", format="png", dpi=300)

Parameter Guide

pubtab xlsx2tex

Parameter Type / Values Default Description Typical Use
INPUT_FILE path (file or directory) required Source .xlsx / .xls file, or a directory containing them Main input / batch conversion
-o, --output path required Output .tex path or output directory; when INPUT_FILE is a directory, this must be a directory Set destination
-c, --config path none YAML config file Team presets
--sheet sheet name / 0-based index all sheets Export only one sheet Single-sheet export
--theme string three_line Rendering theme Switch style
--caption string none Table caption Paper-ready table
--label string none LaTeX label Cross-reference
--header-rows int auto Number of header rows Override detection
--span-columns flag false Use table* Two-column papers
--preview flag false Generate PNG preview(s) Fast visual check
--position string htbp Float position Layout tuning
--font-size string theme default Set table font size Compact layout
--resizebox string none Wrap with \resizebox{...}{!}{...} Wide tables
--with-resizebox flag false Enable \resizebox wrapper Force width control
--without-resizebox flag false Disable \resizebox wrapper Keep raw tabular width
--resizebox-width string \linewidth Width used by --with-resizebox Custom scaling
--col-spec string auto Explicit tabular col spec Manual alignment
--dpi int 300 Preview DPI (--preview) Sharper PNG
--header-sep string auto Custom separator under header Custom rule line
--upright-scripts flag false Render sub/superscript as upright \mathrm{} Typographic preference

pubtab tex2xlsx

Parameter Type / Values Default Description Typical Use
INPUT_FILE path (file or directory) required Source .tex file, or a directory containing .tex files Main input / batch conversion
-o, --output path required Output .xlsx path or output directory; when INPUT_FILE is a directory, this must be a directory Export workbook

pubtab preview

Parameter Type / Values Default Description Typical Use
TEX_FILE path (file or directory) required Input .tex file, or a directory containing .tex files Main input / batch conversion
-o, --output path auto by extension Output file path or output directory; when TEX_FILE is a directory, this must be a directory Set output name
--theme string three_line Theme package set for compile Match render theme
--dpi int 300 PNG resolution Image quality
--format png / pdf png Output format PDF for paper assets
--preamble string none Extra LaTeX preamble commands Custom macros

Common Command Recipes

# Export all sheets (default)
pubtab xlsx2tex report.xlsx -o out/report.tex

# Export a specific sheet only
pubtab xlsx2tex report.xlsx -o out/report.tex --sheet "Main"

# Two-column table + preview
pubtab xlsx2tex report.xlsx -o out/report.tex --span-columns --preview --dpi 300

Features by Workflow

1) Excel -> LaTeX

  • Reads .xlsx (openpyxl) and .xls (xlrd), then renders via Jinja2 themes.
  • Preserves rich formatting: merged cells, colors, bold/italic/underline, rotation, diagbox, and multi-line cells.
  • Applies table-level logic: header rule generation, section/group separators, and trailing-empty-column trimming.
  • Supports all-sheet export by default and deterministic *_sheetNN file naming.

2) LaTeX -> Excel

  • Parses multiple tables from one .tex file and writes each table to separate worksheet(s).
  • Handles commands including \multicolumn, \multirow, \textcolor, \cellcolor, \rowcolor, \diagbox, and \rotatebox.
  • Expands macros (\newcommand/\renewcommand) and resolves \definecolor variants.
  • Improves robustness for row/cell splitting around escaped separators and nested wrappers.

3) Preview Pipeline

  • pubtab preview compiles .tex to PNG/PDF using available local LaTeX tooling.
  • If system pdflatex is unavailable, TinyTeX auto-install can bootstrap compilation.
  • On missing .sty errors, pubtab can parse the missing package, run tlmgr install <package>, and retry compile automatically.
  • TinyTeX download uses cert-friendly SSL handling and now provides actionable hints for certificate failures.
  • PNG conversion works out of the box after pip install pubtab (bundled pdf2image + PyMuPDF backends).

Configuration

Use a YAML file to define repeatable defaults. CLI arguments always take precedence over config values.

theme: three_line
caption: "Experimental Results"
label: "tab:results"
header_rows: 2
sheet: null
span_columns: false
position: htbp
font_size: footnotesize
resizebox: null
col_spec: null
header_sep: null
preview: false
dpi: 300
spacing:
  tabcolsep: "4pt"
  arraystretch: "1.2"
group_separators: [3, 6]
pubtab xlsx2tex table.xlsx -o output.tex -c config.yaml

Theme System

pubtab uses a Jinja2-based theme system. The built-in three_line theme targets academic booktabs-style tables.

Custom theme layout:

my_theme/
├── config.yaml    # packages, spacing, font_size, caption_position
└── template.tex   # Jinja2 template

List available themes:

pubtab themes

Project Structure

View project structure
pubtab/
├── pyproject.toml
├── README.md
├── README.zh-CN.md
├── LICENSE
└── src/pubtab/
    ├── __init__.py        # Public API: xlsx2tex, preview, tex_to_excel
    ├── cli.py             # CLI (click)
    ├── models.py          # Data models
    ├── reader.py          # Excel reader (.xlsx/.xls)
    ├── renderer.py        # LaTeX renderer (Jinja2)
    ├── tex_reader.py      # LaTeX parser (tex -> TableData)
    ├── writer.py          # Excel writer
    ├── _preview.py        # PNG/PDF preview helpers
    ├── config.py          # YAML config loader
    ├── utils.py           # Escape and color helpers
    └── themes/
        └── three_line/
            ├── config.yaml
            └── template.tex

References

Contributing

Issues and pull requests are welcome at GitHub.

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

pubtab-1.0.2.tar.gz (7.0 MB view details)

Uploaded Source

Built Distribution

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

pubtab-1.0.2-py3-none-any.whl (57.5 kB view details)

Uploaded Python 3

File details

Details for the file pubtab-1.0.2.tar.gz.

File metadata

  • Download URL: pubtab-1.0.2.tar.gz
  • Upload date:
  • Size: 7.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.6

File hashes

Hashes for pubtab-1.0.2.tar.gz
Algorithm Hash digest
SHA256 f5f713d6e626046c9ef245f59f40aa1a61fef129958af3c2ed118ecf4969f764
MD5 41a5ae6979da36dfe5029e829c79ff1e
BLAKE2b-256 f29a078529c372f3f90773d1daea3bfdab604669b0dbbac8be259c560e5700f1

See more details on using hashes here.

File details

Details for the file pubtab-1.0.2-py3-none-any.whl.

File metadata

  • Download URL: pubtab-1.0.2-py3-none-any.whl
  • Upload date:
  • Size: 57.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.6

File hashes

Hashes for pubtab-1.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 6b5000c3ced2888491270350bbde20006e83c6297a3fe8203153dcd9e00e944e
MD5 a06614738099887f419acc868c774d74
BLAKE2b-256 1a720de853e5cfc057a47725d1e5570f1824bf4ea50ef1c4bd6567726088b5a1

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