Repository: modin-project/modin

Issue:
BUG: Type Error when reading  excel sheet in 0.23.0rc0
### Modin version checks

- [X] I have checked that this issue has not already been reported.

- [X] I have confirmed this bug exists on the latest released version of Modin.

- [ ] I have confirmed this bug exists on the main branch of Modin. (In order to do this you can follow [this guide](https://modin.readthedocs.io/en/stable/getting_started/installation.html#installing-from-the-github-master-branch).)


### Reproducible Example

```python
import modin.pandas as modin_pd

path = os.path.join(pathlib.Path(__file__).parent.resolve(), "example.xlsx")
modin_pd.read_excel(path, sheet_name="Sheet1")
```


### Issue Description

In the simple code above, I try to read the first sheet of the xlsx file containing two sheets ("Sheet1" and "Sheet2"). It raises a TypeError in `modin\core\io\text\excel_dispatcher.py:151`

```
TypeError: WorksheetReader.__init__() got an unexpected keyword argument 'rich_text'
```

Since I cannot upload the xlsx file "example.xlsx", here is its content:

**Content of Sheet1:** 
<html>
<body>

id | integer | txt
-- | -- | --
Ibelfu5 | 584 | This is the first row
h89653fu5 | 7 | This is the second row
hdds23 | 275 | This is the third row
q68423 | 754 | This is the fourth row
qqf8 | 10 | This is the fifth row

</body>
</html>

**Content of Sheet2:** 
<html>
<body>

id | integer | txt
-- | -- | --
5sqf8 | 11778 | This is the sixth row
5458 | 95 | This is the seventh row
569ggg8 | 466 | This is the 8th row
kus458 | 635 | This is the 9th row
5kuds458 | 9 | This is the last row

</body>
</html>



### Expected Behavior

I am expecting `modin_pd.read_excel` to be able to read one sheet of an excel file.

### Error Logs

<details>

```python-traceback
test_exhibit_modin_error.py:15: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
..\..\..\..\..\.virtualenvs\taipy-core-_89MM_bd\lib\site-packages\modin\logging\logger_decorator.py:128: in run_and_log
    return obj(*args, **kwargs)
..\..\..\..\..\.virtualenvs\taipy-core-_89MM_bd\lib\site-packages\modin\pandas\io.py:449: in read_excel
    intermediate = FactoryDispatcher.read_excel(**kwargs)
..\..\..\..\..\.virtualenvs\taipy-core-_89MM_bd\lib\site-packages\modin\core\execution\dispatching\factories\dispatcher.py:225: in read_excel
    return cls.get_factory()._read_excel(**kwargs)
..\..\..\..\..\.virtualenvs\taipy-core-_89MM_bd\lib\site-packages\modin\core\execution\dispatching\factories\factories.py:273: in _read_excel
    return cls.io_cls.read_excel(**kwargs)
..\..\..\..\..\.virtualenvs\taipy-core-_89MM_bd\lib\site-packages\modin\logging\logger_decorator.py:128: in run_and_log
    return obj(*args, **kwargs)
..\..\..\..\..\.virtualenvs\taipy-core-_89MM_bd\lib\site-packages\modin\core\io\file_dispatcher.py:159: in read
    query_compiler = cls._read(*args, **kwargs)
..\..\..\..\..\.virtualenvs\taipy-core-_89MM_bd\lib\site-packages\modin\logging\logger_decorator.py:128: in run_and_log
    return obj(*args, **kwargs)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'modin.core.execution.dask.implementations.pandas_on_dask.io.io.'>
io = 'C:\\Users\\jeanrobin\\workspace\\taipy-core\\tests\\core\\data\\data_sample/example.xlsx'
kwargs = {'_header': b'<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n<worksheet xmlns="http://schemas.openxmlforma..."><v>1</v></c><c r="C1" s="2" t="s"><v>2</v></c></row>', 'comment': None, 'converters': None, 'date_format': None, ...}
ZipFile = <class 'zipfile.ZipFile'>
Worksheet = <class 'openpyxl.worksheet.worksheet.Worksheet'>
WorksheetReader = <class 'openpyxl.worksheet._reader.WorksheetReader'>
ExcelReader = <class 'openpyxl.reader.excel.ExcelReader'>
PandasExcelParser = <class 'modin.core.storage_formats.pandas.parsers.PandasExcelParser'>
io_file = <_io.BufferedReader name='C:\\Users\\jeanrobin\\workspace\\taipy-core\\tests\\core\\data\\data_sample/example.xlsx'>
ex = <openpyxl.reader.excel.ExcelReader object at 0x0000017E50995000>

    @classmethod
    def _read(cls, io, **kwargs):
        """
        Read data from `io` according to the passed `read_excel` `kwargs` parameters.
    
        Parameters
        ----------
        io : str, bytes, ExcelFile, xlrd.Book, path object, or file-like object
            `io` parameter of `read_excel` function.
        **kwargs : dict
            Parameters of `read_excel` function.
    
        Returns
        -------
        new_query_compiler : BaseQueryCompiler
            Query compiler with imported data for further processing.
        """
        if (
            kwargs.get("engine", None) is not None
            and kwargs.get("engine") != "openpyxl"
        ):
            return cls.single_worker_read(
                io,
                reason="Modin only implements parallel `read_excel` with `openpyxl` engine, "
                + 'please specify `engine=None` or `engine="openpyxl"` to '
                + "use Modin's parallel implementation.",
                **kwargs
            )
    
        from zipfile import ZipFile
        from openpyxl.worksheet.worksheet import Worksheet
        from openpyxl.worksheet._reader import WorksheetReader
        from openpyxl.reader.excel import ExcelReader
        from modin.core.storage_formats.pandas.parsers import PandasExcelParser
    
        sheet_name = kwargs.get("sheet_name", 0)
        if sheet_name is None or isinstance(sheet_name, list):
            return cls.single_worker_read(
                io,
                reason="`read_excel` functionality is only implemented for a single sheet at a "
                + "time. Multiple sheet reading coming soon!",
                **kwargs
            )
    
        warnings.warn(
            "Parallel `read_excel` is a new feature! If you run into any "
            + "problems, please visit https://github.com/modin-project/modin/issues. "
            + "If you find a new issue and can't file it on GitHub, please "
            + "email bug_reports@modin.org."
        )
    
        # NOTE: ExcelReader() in read-only mode does not close file handle by itself
        # work around that by passing file object if we received some path
        io_file = open(io, "rb") if isinstance(io, str) else io
        try:
            ex = ExcelReader(io_file, read_only=True)
            ex.read()
            wb = ex.wb
    
            # Get shared strings
            ex.read_manifest()
            ex.read_strings()
            ws = Worksheet(wb)
        finally:
            if isinstance(io, str):
                # close only if it were us who opened the object
                io_file.close()
    
        pandas_kw = dict(kwargs)  # preserve original kwargs
        with ZipFile(io) as z:
            from io import BytesIO
    
            # Convert index to sheet name in file
            if isinstance(sheet_name, int):
                sheet_name = "sheet{}".format(sheet_name + 1)
            else:
                sheet_name = "sheet{}".format(wb.sheetnames.index(sheet_name) + 1)
            if any(sheet_name.lower() in name for name in z.namelist()):
                sheet_name = sheet_name.lower()
            elif any(sheet_name.title() in name for name in z.namelist()):
                sheet_name = sheet_name.title()
            else:
                raise ValueError("Sheet {} not found".format(sheet_name.lower()))
            # Pass this value to the workers
            kwargs["sheet_name"] = sheet_name
    
            f = z.open("xl/worksheets/{}.xml".format(sheet_name))
            f = BytesIO(f.read())
            total_bytes = cls.file_size(f)
    
            # Read some bytes from the sheet so we can extract the XML header and first
            # line. We need to make sure we get the first line of the data as well
            # because that is where the column names are. The header information will
            # be extracted and sent to all of the nodes.
            sheet_block = f.read(EXCEL_READ_BLOCK_SIZE)
            end_of_row_tag = b"</row>"
            while end_of_row_tag not in sheet_block:
                sheet_block += f.read(EXCEL_READ_BLOCK_SIZE)
            idx_of_header_end = sheet_block.index(end_of_row_tag) + len(end_of_row_tag)
            sheet_header_with_first_row = sheet_block[:idx_of_header_end]
    
            if kwargs["header"] is not None:
                # Reset the file pointer to begin at the end of the header information.
                f.seek(idx_of_header_end)
                sheet_header = sheet_header_with_first_row
            else:
                start_of_row_tag = b"<row"
                idx_of_header_start = sheet_block.index(start_of_row_tag)
                sheet_header = sheet_block[:idx_of_header_start]
                # Reset the file pointer to begin at the end of the header information.
                f.seek(idx_of_header_start)
    
            kwargs["_header"] = sheet_header
            footer = b"</sheetData></worksheet>"
            # Use openpyxml to parse the data
            common_args = (
                ws,
                BytesIO(sheet_header_with_first_row + footer),
                ex.shared_strings,
                False,
            )
            if cls.need_rich_text_param:
>               reader = WorksheetReader(*common_args, rich_text=False)
E               TypeError: WorksheetReader.__init__() got an unexpected keyword argument 'rich_text'

..\..\..\..\..\.virtualenvs\taipy-core-_89MM_bd\lib\site-packages\modin\core\io\text\excel_dispatcher.py:151: TypeError

```

</details>


### Installed Versions

<details>

INSTALLED VERSIONS
------------------
commit           : 763cdd5ec32921c37c9ab9e76fd5bb46144d1e1d
python           : 3.10.4.final.0
python-bits      : 64
OS               : Windows
OS-release       : 10
Version          : 10.0.19044
machine          : AMD64
processor        : Intel64 Family 6 Model 165 Stepping 2, GenuineIntel
byteorder        : little
LC_ALL           : None
LANG             : None
LOCALE           : fr_FR.cp1252

Modin dependencies
------------------
modin            : 0.23.0rc0+17.g763cdd5e
ray              : None
dask             : 2023.6.1
distributed      : 2023.6.1
hdk              : None

pandas dependencies
-------------------
pandas           : 2.0.3
numpy            : 1.25.0
pytz             : 2023.3
dateutil         : 2.8.2
setuptools       : 68.0.0
pip              : 23.1.2
Cython           : None
pytest           : 7.4.0
hypothesis       : None
sphinx           : None
blosc            : None
feather          : None
xlsxwriter       : None
lxml.etree       : None
html5lib         : None
pymysql          : None
psycopg2         : None
jinja2           : 3.1.2
IPython          : None
pandas_datareader: None
bs4              : None
bottleneck       : None
brotli           : None
fastparquet      : None
fsspec           : 2023.6.0
gcsfs            : None
matplotlib       : 3.7.1
numba            : None
numexpr          : None
odfpy            : None
openpyxl         : 3.0.7
pandas_gbq       : None
pyarrow          : 10.0.1
pyreadstat       : None
pyxlsb           : None
s3fs             : None
scipy            : 1.11.1
snappy           : None
sqlalchemy       : 2.0.16
tables           : None
tabulate         : None
xarray           : None
xlrd             : None
zstandard        : None
tzdata           : 2023.3
qtpy             : None
pyqt5            : None


</details>



Discussion:

Resolving patch:
diff --git a/modin/core/io/text/excel_dispatcher.py b/modin/core/io/text/excel_dispatcher.py
--- a/modin/core/io/text/excel_dispatcher.py
+++ b/modin/core/io/text/excel_dispatcher.py
@@ -147,7 +147,7 @@ def _read(cls, io, **kwargs):
                 ex.shared_strings,
                 False,
             )
-            if cls.need_rich_text_param:
+            if cls.need_rich_text_param():
                 reader = WorksheetReader(*common_args, rich_text=False)
             else:
                 reader = WorksheetReader(*common_args)
diff --git a/modin/core/storage_formats/pandas/parsers.py b/modin/core/storage_formats/pandas/parsers.py
--- a/modin/core/storage_formats/pandas/parsers.py
+++ b/modin/core/storage_formats/pandas/parsers.py
@@ -557,8 +557,8 @@ def _convert_cell(cls, cell, convert_float):
 
         return cell.value
 
-    @property
-    def need_rich_text_param(self):
+    @staticmethod
+    def need_rich_text_param():
         """
         Determine whether a required `rich_text` parameter should be specified for the ``WorksheetReader`` constructor.
 


Test patch: