#xlsx #polars-dataframe #dataframe #excel #polars #writer #serialization #extension #date-time

polars_excel_writer

A Polars extension to serialize dataframes to Excel xlsx files

15 breaking releases

0.16.0 Jun 29, 2025
0.14.0 May 2, 2025
0.13.0 Mar 15, 2025
0.9.0 Sep 17, 2024
0.4.0 Nov 22, 2023

#726 in Encoding

Download history 144/week @ 2025-03-16 166/week @ 2025-03-23 14/week @ 2025-03-30 5/week @ 2025-04-06 7/week @ 2025-04-13 19/week @ 2025-04-20 99/week @ 2025-04-27 45/week @ 2025-05-04 60/week @ 2025-05-11 36/week @ 2025-05-18 11/week @ 2025-05-25 179/week @ 2025-06-15 74/week @ 2025-06-22 195/week @ 2025-06-29

448 downloads per month
Used in pq2xl

MIT/Apache

96KB
409 lines

polars_excel_writer

The polars_excel_writer crate is a library for serializing Polars dataframes to Excel Xlsx files.

The crate uses rust_xlsxwriter to do the Excel serialization and is typically 5x faster than Polars when exporting large dataframes to Excel.

It provides a primary interface PolarsExcelWriter which is a configurable Excel serializer that resembles the interface options provided by the Polars write_excel() dataframe method.

Example

An example of writing a Polar Rust dataframe to an Excel file using the PolarsExcelWriter interface.

use chrono::prelude::*;
use polars::prelude::*;

use polars_excel_writer::PolarsExcelWriter;

fn main() -> PolarsResult<()> {
    // Create a sample dataframe for the example.
    let df: DataFrame = df!(
        "String" => &["North", "South", "East", "West"],
        "Integer" => &[1, 2, 3, 4],
        "Float" => &[4.0, 5.0, 6.0, 7.0],
        "Time" => &[
            NaiveTime::from_hms_milli_opt(2, 59, 3, 456).unwrap(),
            NaiveTime::from_hms_milli_opt(2, 59, 3, 456).unwrap(),
            NaiveTime::from_hms_milli_opt(2, 59, 3, 456).unwrap(),
            NaiveTime::from_hms_milli_opt(2, 59, 3, 456).unwrap(),
            ],
        "Date" => &[
            NaiveDate::from_ymd_opt(2022, 1, 1).unwrap(),
            NaiveDate::from_ymd_opt(2022, 1, 2).unwrap(),
            NaiveDate::from_ymd_opt(2022, 1, 3).unwrap(),
            NaiveDate::from_ymd_opt(2022, 1, 4).unwrap(),
            ],
        "Datetime" => &[
            NaiveDate::from_ymd_opt(2022, 1, 1).unwrap().and_hms_opt(1, 0, 0).unwrap(),
            NaiveDate::from_ymd_opt(2022, 1, 2).unwrap().and_hms_opt(2, 0, 0).unwrap(),
            NaiveDate::from_ymd_opt(2022, 1, 3).unwrap().and_hms_opt(3, 0, 0).unwrap(),
            NaiveDate::from_ymd_opt(2022, 1, 4).unwrap().and_hms_opt(4, 0, 0).unwrap(),
        ],
    )?;

    // Create a new Excel writer.
    let mut excel_writer = PolarsExcelWriter::new();

    // Write the dataframe to Excel.
    excel_writer.write_dataframe(&df)?;

    // Save the file to disk.
    excel_writer.save("dataframe.xlsx")?;

    Ok(())
}

Output file:

Performance

The table below shows the performance of writing a dataframe using Python Polars, Python Pandas and PolarsExcelWriter.

Test Case Time (s) Relative (%)
Polars 6.49 100%
Pandas 10.92 168%
polars_excel_writer 1.22 19%
polars_excel_writer + zlib 1.08 17%

See the Performance section of the docs for more detail.

See also

Dependencies

~23–33MB
~511K SLoC