Skip to main content

CircleCI Coverage Status Documentation

Introduction

from htmxl.compose import Workbook

workbook = Workbook()
workbook.add_sheet_from_template(
    template="""
    <head>{{ title }}</head>
    <body>
      <div>
        Hello down there, {{ name }}!
      </div>
      <div>
        <table>
          <thead>
            <tr>
              {% for column_name in column_names %}
                <th>{{ column_name }}</th>
              {% endfor %}
            </tr>
          </thead>
          <tbody>
            {% for row in rows %}
              <tr>
                <td>{{ row.a }}</td>
                <td>{{ row.b }}</td>
              </tr>
            {% endfor %}
          </tbody>
        </table
      </div>
    </body>
    """,
    data=dict(
        title="Hello World",
        name='Bob',
        column_names=['A', 'B'],
        rows=[{'a': 'a', 'b': 2}, {'a': 'b', 'b': 2}, {'a': 'c', 'b': 3}],
    )
)

workbook.compose('hello_world.xlsx')

example

The Pitch

Essentially, HTM(x)L is an attempt to allow the declaration of Excel files in a (mostly) declarative manner that separates the format that the document should take from the data being added to it.

The "normal" manner of producing Excel files essentially amounts to a series of imperitive statements about what cells to modify to get the excel file you want. For any file of moderate complexity, this leads to there being very little intuition about what the resulting Excel file will actually look like.

Particularly once you start adding cell styling, or finding yourself inserting dynamically-sized data (requiring a bunch of cell offset math), the relative ease of designing and visualizing the template using a familiar idiom, HTML, can be make it much much easier to author and maintain these kinds of templates.

Features

General features include:

  • HTML elements as metaphors for structures in the resulting Excel document

    Due to the obviously grid-oriented structure of Excel, the metaphors can sometimes be approximate, but should hopefully make intuitive sense!

    For example:

    • <span>: An inline-block element which pushes elements after it to the right
    • <div>: An block element which push elements after it downward
    • <table>: Self-explanatory!

    See the documentation about elements for more details

  • Styling

    Some commonly/obviously useful and style options like width/height (style="width: 50px") or rowspan/colspan colspan="2" have been implemented, but there's no reason that various different options that make intuitive sense (like colors) could be implemented also

    See the documentation about styling for more details

  • Classes

    While inline color styles are not (yet) implemented, one can supply classes normally, class="class1 class2" and supply the definitions for those classes as inputs to the Workbook

    styles = [
        {"name": "odd", "pattern_fill": {"patternType": "solid", "fgColor": "FBEAFB"}},
    ]
    Workbook(styles=styles)
    

Installation

There is no default parser (for HTML) included with a default installation of the package. We do this for both backwards compatibility and future compatibility reasons.

In order to keep the base package lean when one opts to use one or the other parser, we include a set of bundled parser-adaptor implementations for known supported parser libraries

To opt into the installation of the dependent library for the parser you chose:

# Slower, but more permissive
pip install htmxl[beautifulsoup]

# Faster, but more strict
pip install htmxl[lxml]

By default, the package will detect installed parser libraries and choose the first one we find, so a vanilla Workbook() instantiation should Just Work.

However, we encourage users to explicitly select their parser to avoid inadvertant selection of the "wrong" parser at runtime (given that they have template compatibility issues)

from htmxl.compose import Workbook

workbook = Workbook(parser='beautifulsoup')
workbook = Workbook(parser='lxml')

Release files for htmxl 0.8.7

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for htmxl 0.8.7
File Size Uploaded
htmxl-0.8.7.tar.gz 15.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for htmxl 0.8.7
File Interpreter ABI Platform
htmxl-0.8.7-py3-none-any.whl Python 3 none any Details

Total release size: 33.9 kB

Release files / htmxl-0.8.7.tar.gz

Download URL htmxl-0.8.7.tar.gz
Size 15.8 kB
Tags Source
SHA-256 checksum
How to use checksums
68f014ce4088933cab025fce52f7fc81904e8c0f13300eec7f58a3d2ee590e46
BLAKE2b-256 checksum
How to use checksums
616aafdb6b31c8db69fac14f611834c33149012ecbbe4b5fd696757ec4bc698e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.1.8 CPython/3.8.6 Darwin/20.6.0

Release files / htmxl-0.8.7-py3-none-any.whl

Download URL htmxl-0.8.7-py3-none-any.whl
Size 18.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
bc8437c084404f87173c46fd64b98aa1f5f5c1315f9c625f0aa9aa5207851ec1
BLAKE2b-256 checksum
How to use checksums
e50724119cdedce793e2bb8e53857a286a1d7fa7d6380e610b8ba9ae5413e17c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.1.8 CPython/3.8.6 Darwin/20.6.0

Release history Release notifications | RSS feed

This release

0.8.7 This release

2 release files

0.8.6

2 release files

0.8.5

2 release files

0.8.4

2 release files

0.8.3

2 release files

0.8.2

2 release files

0.8.1

2 release files

0.8.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page