From a8212b5a7f3b86147d4644806ac7e1f33e21cd90 Mon Sep 17 00:00:00 2001 From: Luka Peschke Date: Mon, 17 Nov 2025 11:39:51 +0100 Subject: [PATCH 1/2] fix(dtype): consider #DIV/0! cells to be null when guessing a column's dtype Signed-off-by: Luka Peschke --- python/tests/test_dtypes.py | 41 +++++++++++++++++++++++++++++++++++++ src/types/dtype/mod.rs | 3 ++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/python/tests/test_dtypes.py b/python/tests/test_dtypes.py index a5a071e7..46277b33 100644 --- a/python/tests/test_dtypes.py +++ b/python/tests/test_dtypes.py @@ -508,3 +508,44 @@ def item_to_polars(item: Any): assert cell_errors is not None error_positions = [err.offset_position for err in cell_errors.errors] assert error_positions == expected_error_positions + + +def test_guess_dtypes_with_div0_error() -> None: + excel_reader = fastexcel.read_excel(path_for_fixture("div0.xlsx")) + sheet = excel_reader.load_sheet(0) + assert sheet.available_columns() == [ + fastexcel.ColumnInfo( + name="dividend", + index=0, + dtype="float", + dtype_from="guessed", + column_name_from="looked_up", + ), + fastexcel.ColumnInfo( + name="divisor", + index=1, + dtype="float", + dtype_from="guessed", + column_name_from="looked_up", + ), + fastexcel.ColumnInfo( + name="quotient", + index=2, + dtype="float", + dtype_from="guessed", + column_name_from="looked_up", + ), + ] + expected_data = { + "dividend": [42.0, 43.0, 44.0, 45.0], + "divisor": [0.0, 1.0, 2.0, 3.0], + "quotient": [None, 43.0, 22.0, 15.0], + } + + pd_df = sheet.to_pandas() + pd_expected_data = pd.DataFrame(expected_data) + pd_assert_frame_equal(pd_df, pd_expected_data) + + pl_df = sheet.to_polars() + pl_expected_data = pl.DataFrame(expected_data) + pl_assert_frame_equal(pl_df, pl_expected_data) diff --git a/src/types/dtype/mod.rs b/src/types/dtype/mod.rs index e25ea4e1..014c2b64 100644 --- a/src/types/dtype/mod.rs +++ b/src/types/dtype/mod.rs @@ -175,7 +175,8 @@ fn get_cell_dtype( | CellErrorType::Value | CellErrorType::Null | CellErrorType::Ref - | CellErrorType::Num, + | CellErrorType::Num + | CellErrorType::Div0, ) => Ok(DType::Null), Some(err) => Err(FastExcelErrorKind::CalamineCellError(err.to_owned()).into()), None => Err(FastExcelErrorKind::Internal(format!( From 4e56e2e0b55ef6fa16ba4179c0f3e7395ed2373c Mon Sep 17 00:00:00 2001 From: Luka Peschke Date: Mon, 17 Nov 2025 11:44:26 +0100 Subject: [PATCH 2/2] missing fixture Signed-off-by: Luka Peschke --- tests/fixtures/div0.xlsx | Bin 0 -> 5778 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/fixtures/div0.xlsx diff --git a/tests/fixtures/div0.xlsx b/tests/fixtures/div0.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..32d0054c3ed9ba3331284cb83f7b4c71de8e55a2 GIT binary patch literal 5778 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 MSIBt_KK|+TA4~zlEdT%j literal 0 HcmV?d00001