From 9d14404ce7a3e355b146ac9126af37d4f7d6d39f Mon Sep 17 00:00:00 2001 From: Dmitriy Date: Fri, 27 Oct 2023 18:48:44 +0600 Subject: [PATCH 1/2] BUG: Comment in ODS-file gets included in string cells --- doc/source/whatsnew/v2.2.0.rst | 1 + pandas/io/excel/_odfreader.py | 4 ++++ .../io/data/excel/test_cell_annotation.ods | Bin 0 -> 10013 bytes pandas/tests/io/excel/test_odf.py | 11 +++++++++++ 4 files changed, 16 insertions(+) create mode 100644 pandas/tests/io/data/excel/test_cell_annotation.ods diff --git a/doc/source/whatsnew/v2.2.0.rst b/doc/source/whatsnew/v2.2.0.rst index ff19ef4eae179..6bee9ef52446f 100644 --- a/doc/source/whatsnew/v2.2.0.rst +++ b/doc/source/whatsnew/v2.2.0.rst @@ -390,6 +390,7 @@ I/O - Bug in :func:`read_excel`, with ``engine="xlrd"`` (``xls`` files) erroring when file contains NaNs/Infs (:issue:`54564`) - Bug in :func:`to_excel`, with ``OdsWriter`` (``ods`` files) writing boolean/string value (:issue:`54994`) - Bug in :meth:`DataFrame.to_hdf` and :func:`read_hdf` with ``datetime64`` dtypes with non-nanosecond resolution failing to round-trip correctly (:issue:`55622`) +- Bug in :meth:`pandas.read_excel` with ``engine="odf"`` (``ods`` files) when string contains annotation (:issue:`55200`) - Bug in :meth:`pandas.read_excel` with an ODS file without cached formatted cell for float values (:issue:`55219`) - Bug where :meth:`DataFrame.to_json` would raise an ``OverflowError`` instead of a ``TypeError`` with unsupported NumPy types (:issue:`55403`) - diff --git a/pandas/io/excel/_odfreader.py b/pandas/io/excel/_odfreader.py index 277f64f636731..69b514da32857 100644 --- a/pandas/io/excel/_odfreader.py +++ b/pandas/io/excel/_odfreader.py @@ -228,8 +228,10 @@ def _get_cell_string_value(self, cell) -> str: """ from odf.element import Element from odf.namespaces import TEXTNS + from odf.office import Annotation from odf.text import S + office_annotation = Annotation().qname text_s = S().qname value = [] @@ -239,6 +241,8 @@ def _get_cell_string_value(self, cell) -> str: if fragment.qname == text_s: spaces = int(fragment.attributes.get((TEXTNS, "c"), 1)) value.append(" " * spaces) + elif fragment.qname == office_annotation: + continue else: # recursive impl needed in case of nested fragments # with multiple spaces diff --git a/pandas/tests/io/data/excel/test_cell_annotation.ods b/pandas/tests/io/data/excel/test_cell_annotation.ods new file mode 100644 index 0000000000000000000000000000000000000000..60246e6c7e4df7e8ae1f920ee7a537473f8be0ec GIT binary patch literal 10013 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 literal 0 HcmV?d00001 diff --git a/pandas/tests/io/excel/test_odf.py b/pandas/tests/io/excel/test_odf.py index 9d49718bec357..46dc751fa499f 100644 --- a/pandas/tests/io/excel/test_odf.py +++ b/pandas/tests/io/excel/test_odf.py @@ -59,3 +59,14 @@ def test_read_unempty_cells(): result = pd.read_excel("test_unempty_cells.ods") tm.assert_frame_equal(result, expected) + + +def test_read_cell_annotation(): + expected = pd.DataFrame( + ["test"], + columns=["Column 1"], + ) + + result = pd.read_excel("test_cell_annotation.ods") + + tm.assert_frame_equal(result, expected) From de386d16a754ebbe6c07ec1f9d4fd8d16264cc8c Mon Sep 17 00:00:00 2001 From: Dmitriy Date: Sat, 28 Oct 2023 15:53:55 +0600 Subject: [PATCH 2/2] test if cell is empty and contains annotation --- .../io/data/excel/test_cell_annotation.ods | Bin 10013 -> 10789 bytes pandas/tests/io/excel/test_odf.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/io/data/excel/test_cell_annotation.ods b/pandas/tests/io/data/excel/test_cell_annotation.ods index 60246e6c7e4df7e8ae1f920ee7a537473f8be0ec..f00a88fe681ef642a644704aa8af15b90563485d 100644 GIT binary patch delta 8301 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
    _ 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⪙?oIBk>)Osw}EmqLfC|AeRtk97Dy=<^300T@xg$T|AAc1=UEC>Y( z$rWYlV0HlMKQInBkBSle5da7N`kOXQ#rhjZ0>1~a|GtL<7Xt9Xj#Ok|Rw@>-=x^MV ziUUSE8QcS4 zmidn9h{4FTxL`CGWHe|PT&RERf#BaWFi}w89y;2;#5xEKF?2UL2Acf;L%V|lbN(+4 zh6Ng&Pm2S7p~d^llZ~Dj#_|uu`0qe@;BGp6Fn|`D;yT@RwbLPAH@L zKMC3BW&eufOV5k;$NS$B6}Xe0LFW(hpWQr^|B7b>4+UlBOlT4M>Vi01EJoZ;D4V0{yqSp{uk#22MWr~!rk4*(aP;VqyN7L1Slwi|ME;C e09O+cfyWq7|617!12GH>CHRhk4xs?>hxk9(+z5UE diff --git a/pandas/tests/io/excel/test_odf.py b/pandas/tests/io/excel/test_odf.py index 46dc751fa499f..f01827fa4ca2f 100644 --- a/pandas/tests/io/excel/test_odf.py +++ b/pandas/tests/io/excel/test_odf.py @@ -63,7 +63,7 @@ def test_read_unempty_cells(): def test_read_cell_annotation(): expected = pd.DataFrame( - ["test"], + ["test", np.nan, "test 3"], columns=["Column 1"], )