Repository: pandas-dev/pandas-stubs (language: python)

Issue:
Literal "calamine" missing from ExcelFile engine attribute
**Describe the bug**

#898 missed the [`engine` attribute of the `ExcelFile` class](https://github.com/pandas-dev/pandas-stubs/blob/b6ae6e8babd2432b681956f109b5c06af779a7c5/pandas-stubs/io/excel/_base.pyi#L249C1-L249C75).


**To Reproduce**

```python
import pandas as pd

with pd.ExcelFile("path.xlsx", engine="calamine") as xlsx:
   pass
```

using mypy I got

```
error: Argument "engine" to "ExcelFile" has incompatible type "Literal['calamine']"; expected "Literal['xlrd', 'openpyxl', 'odf', 'pyxlsb'] | None"  [arg-type]
```

**Please complete the following information:**
I don't think it matters, but:
 - OS: Windows 10 22H2
 - python v3.10
 - mypy v1.13.0
 - `pandas-stubs`  v2.2.3.241126



Discussion / hints:
That is correct, it was missed there! Seems like a small addition to be made in the `pandas-stubs/io/excel/_base.pyi`. Open to PR with tests in `tests/test_io.py`.

Fix patch:
diff --git a/pandas-stubs/io/excel/_base.pyi b/pandas-stubs/io/excel/_base.pyi
index 21085daf..f03bdd08 100644
--- a/pandas-stubs/io/excel/_base.pyi
+++ b/pandas-stubs/io/excel/_base.pyi
@@ -246,7 +246,7 @@ class ExcelFile:
     def __init__(
         self,
         io: FilePath | ReadBuffer[bytes] | bytes,
-        engine: Literal["xlrd", "openpyxl", "odf", "pyxlsb"] | None = ...,
+        engine: ExcelReadEngine | None = ...,
         storage_options: StorageOptions = ...,
     ) -> None: ...
     def __fspath__(self): ...


Test patch:
diff --git a/tests/test_io.py b/tests/test_io.py
index 17c702d2..68279885 100644
--- a/tests/test_io.py
+++ b/tests/test_io.py
@@ -1109,6 +1109,14 @@ def test_read_excel_dtypes():
         check(assert_type(read_excel(path, dtype=dtypes), pd.DataFrame), pd.DataFrame)
 
 
+def test_excel_reader():
+    with ensure_clean(".xlsx") as path:
+        check(assert_type(DF.to_excel(path), None), type(None))
+        with pd.ExcelFile(path, engine="calamine") as ef:
+            check(assert_type(ef, pd.ExcelFile), pd.ExcelFile)
+            check(assert_type(pd.read_excel(ef), pd.DataFrame), pd.DataFrame)
+
+
 def test_excel_writer():
     with ensure_clean(".xlsx") as path:
         with pd.ExcelWriter(path) as ew: