Skip to main content

Excelify: Create Excel spreadsheets using DataFrame-like API

Python tests

Excelify is a DataFrame-like library that lets users create Excel spreadsheets.

To learn more, read Getting Started. TODO: Add a link.

Demo

excelify-viewer

(Click the image above to go to a demo video.)

Example

We'll create a table that demonstrates compounded interest. We first define an "emtpy table" using el.ExcelFrame:

import excelify as el
df = el.ExcelFrame.empty(
    columns=["year", "boy_amount", "annual_return", "eoy_amount"],
    height=3,
)

Printing df will show the following:

>>> df
shape: (3, 4)
+---+----------+----------------+-------------------+----------------+
|   | year (A) | boy_amount (B) | annual_return (C) | eoy_amount (D) |
+---+----------+----------------+-------------------+----------------+
| 1 |          |                |                   |                |
| 2 |          |                |                   |                |
| 3 |          |                |                   |                |
+---+----------+----------------+-------------------+----------------+

The letters A, B, C, D,... in each column after the column name represents the column index, similar to Excel.

Excelify has a Polars-like API that lets you define the formula for all the cells in a given column. For example, we can define static integer value representing the number of years elapsed using el.lit():

df = df.with_columns(
   el.lit([i for i in range(3)]).alias("year"),
)

However, unlike DataFrame, you can define a formula that'll be evaluated lazily, just like Excel spreadsheets.

For example, suppose you'd like to define annual return to be 10% every year. You can either use above el.lit function, or you can define a static value on the first row cell and make subsequent rows refer to the previous row's value using el.map and el.col().prev(1):

def annual_return_formula(idx: int):
    if idx == 0:
        return 0.10
    else:
        return el.col("annual_return").prev(1)

df = df.with_columns(
    el.map(annual_return_formula).alias("annual_return")
)

This way, you can edit only the first row cell of annual_return to change the annual return value for all the years.

Similarly, you can define the amount of money in the beginning and end of the year as follows:

df = df.with_columns(
    el.map(
        # You can also use lambda expression to make it more concise.
        lambda idx: 100.0
        if idx == 0
        else el.col("eoy_amount").prev(1)
    ).alias("boy_amount"),
    (el.col("boy_amount") * (1.0 + el.col("annual_return"))).alias("eoy_amount"),
)

If you print df, you'll get the following:

>>> print(df)
shape: (3, 4)
+---+----------+----------------+-------------------+-------------------+
|   | year (A) | boy_amount (B) | annual_return (C) |  eoy_amount (D)   |
+---+----------+----------------+-------------------+-------------------+
| 1 |   0.00   |     100.00     |       0.10        | (B1 * (1.0 + C1)) |
| 2 |   1.00   |       D1       |        C1         | (B2 * (1.0 + C2)) |
| 3 |   2.00   |       D2       |        C2         | (B3 * (1.0 + C3)) |
+---+----------+----------------+-------------------+-------------------+

Unlike DataFrame, ExcelFrame stores the formula of the cell by default. To see numerical values, you can call df.evaluate() - it'll return a new ExcelFrame where each cell will store the computed value of the formula in df:

>>> print(df.evaluate())
shape: (3, 4)
+---+----------+----------------+-------------------+----------------+
|   | year (A) | boy_amount (B) | annual_return (C) | eoy_amount (D) |
+---+----------+----------------+-------------------+----------------+
| 1 |   0.00   |     100.00     |       0.10        |     110.00     |
| 2 |   1.00   |     110.00     |       0.10        |     121.00     |
| 3 |   2.00   |     121.00     |       0.10        |     133.10     |
+---+----------+----------------+-------------------+----------------+

To export the ExcelFrame to excel, simply call df.to_excel().

Excelify-Viewer

To run excelify-viewer locally, you can run

excelify-viewer --file-path $FILE_NAME

where FILE_NAME points to the python script that constructs the table. The script must end with excelify.display. See files in examples/ directory to see sample scripts.

Metadata

Release files for excelify-lib 0.1.0

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

Source distribution (sdist)

Source distribution for excelify-lib 0.1.0
File Size Uploaded
excelify_lib-0.1.0.tar.gz 22.4 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for excelify-lib 0.1.0
File Interpreter ABI Platform
excelify_lib-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 22.6 MB

Release files / excelify_lib-0.1.0.tar.gz

Download URL excelify_lib-0.1.0.tar.gz
Size 22.4 MB
Tags Source
SHA-256 checksum
How to use checksums
0a66ba9706f804a0c9bacaf72ed0767ddeb02e62977d4041c6963f814c825674
BLAKE2b-256 checksum
How to use checksums
166a65f12bc8a43259c4cae673027b8e4fc2b5628b3a136f77bf7694c03ec3fd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.11.11

Release files / excelify_lib-0.1.0-py3-none-any.whl

Download URL excelify_lib-0.1.0-py3-none-any.whl
Size 137.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
faf9aa1047be918334e12acefa98d9ce6b348cd8736a95be20b67f60784de009
BLAKE2b-256 checksum
How to use checksums
ee6d5a5a3492a3ec7fb49ce1aa91018a95916eeaaf8176cad6c64f51a3e7bd2c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.11.11

Release history Release notifications | RSS feed

This release

0.1.0 This release

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