diff --git a/docs/modules/indexes/document_loaders/examples/example_data/stanley-cups.xlsx b/docs/modules/indexes/document_loaders/examples/example_data/stanley-cups.xlsx
new file mode 100644
index 00000000000..ebc66599b2a
Binary files /dev/null and b/docs/modules/indexes/document_loaders/examples/example_data/stanley-cups.xlsx differ
diff --git a/docs/modules/indexes/document_loaders/examples/excel.ipynb b/docs/modules/indexes/document_loaders/examples/excel.ipynb
new file mode 100644
index 00000000000..ecb3628eec0
--- /dev/null
+++ b/docs/modules/indexes/document_loaders/examples/excel.ipynb
@@ -0,0 +1,79 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "22a849cc",
+ "metadata": {},
+ "source": [
+ "# Microsoft Excel\n",
+ "\n",
+ "The `UnstructuredExcelLoader` is used to load `Microsoft Excel` files. The loader works with both `.xlsx` and `.xls` files. The page content will be the raw text of the Excel file. If you use the loader in `\"elements\"` mode, an HTML representation of the Excel file will be available in the document metadata under the `text_as_html` key."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "e6616e3a",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from langchain.document_loaders import UnstructuredExcelLoader"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "a654e4d9",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Document(page_content='\\n \\n \\n Team\\n Location\\n Stanley Cups\\n \\n \\n Blues\\n STL\\n 1\\n \\n \\n Flyers\\n PHI\\n 2\\n \\n \\n Maple Leafs\\n TOR\\n 13\\n \\n \\n', metadata={'source': 'example_data/stanley-cups.xlsx', 'filename': 'stanley-cups.xlsx', 'file_directory': 'example_data', 'filetype': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'page_number': 1, 'page_name': 'Stanley Cups', 'text_as_html': '
\\n \\n \\n Team | \\n Location | \\n Stanley Cups | \\n
\\n \\n Blues | \\n STL | \\n 1 | \\n
\\n \\n Flyers | \\n PHI | \\n 2 | \\n
\\n \\n Maple Leafs | \\n TOR | \\n 13 | \\n
\\n \\n
', 'category': 'Table'})"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "loader = UnstructuredExcelLoader(\n",
+ " \"example_data/stanley-cups.xlsx\",\n",
+ " mode=\"elements\"\n",
+ ")\n",
+ "docs = loader.load()\n",
+ "docs[0]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "9ab94bde",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.13"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/langchain/document_loaders/__init__.py b/langchain/document_loaders/__init__.py
index 6153bcccb10..3ec4db3534a 100644
--- a/langchain/document_loaders/__init__.py
+++ b/langchain/document_loaders/__init__.py
@@ -32,6 +32,7 @@ from langchain.document_loaders.email import (
)
from langchain.document_loaders.epub import UnstructuredEPubLoader
from langchain.document_loaders.evernote import EverNoteLoader
+from langchain.document_loaders.excel import UnstructuredExcelLoader
from langchain.document_loaders.facebook_chat import FacebookChatLoader
from langchain.document_loaders.figma import FigmaFileLoader
from langchain.document_loaders.gcs_directory import GCSDirectoryLoader
@@ -223,6 +224,7 @@ __all__ = [
"UnstructuredAPIFileLoader",
"UnstructuredEPubLoader",
"UnstructuredEmailLoader",
+ "UnstructuredExcelLoader",
"UnstructuredFileIOLoader",
"UnstructuredFileLoader",
"UnstructuredHTMLLoader",
diff --git a/langchain/document_loaders/excel.py b/langchain/document_loaders/excel.py
new file mode 100644
index 00000000000..94e6fb1bd9c
--- /dev/null
+++ b/langchain/document_loaders/excel.py
@@ -0,0 +1,22 @@
+"""Loader that loads Microsoft Excel files."""
+from typing import Any, List
+
+from langchain.document_loaders.unstructured import (
+ UnstructuredFileLoader,
+ validate_unstructured_version,
+)
+
+
+class UnstructuredExcelLoader(UnstructuredFileLoader):
+ """Loader that uses unstructured to load Microsoft Excel files."""
+
+ def __init__(
+ self, file_path: str, mode: str = "single", **unstructured_kwargs: Any
+ ):
+ validate_unstructured_version(min_unstructured_version="0.6.7")
+ super().__init__(file_path=file_path, mode=mode, **unstructured_kwargs)
+
+ def _get_elements(self) -> List:
+ from unstructured.partition.xlsx import partition_xlsx
+
+ return partition_xlsx(filename=self.file_path, **self.unstructured_kwargs)
diff --git a/tests/integration_tests/document_loaders/test_excel.py b/tests/integration_tests/document_loaders/test_excel.py
new file mode 100644
index 00000000000..c8fbe07f692
--- /dev/null
+++ b/tests/integration_tests/document_loaders/test_excel.py
@@ -0,0 +1,15 @@
+import os
+from pathlib import Path
+
+from langchain.document_loaders import UnstructuredExcelLoader
+
+EXAMPLE_DIRECTORY = file_path = Path(__file__).parent.parent / "examples"
+
+
+def test_unstructured_excel_loader() -> None:
+ """Test unstructured loader."""
+ file_path = os.path.join(EXAMPLE_DIRECTORY, "stanley-cups.xlsx")
+ loader = UnstructuredExcelLoader(str(file_path))
+ docs = loader.load()
+
+ assert len(docs) == 1
diff --git a/tests/integration_tests/examples/stanley-cups.xlsx b/tests/integration_tests/examples/stanley-cups.xlsx
new file mode 100644
index 00000000000..ebc66599b2a
Binary files /dev/null and b/tests/integration_tests/examples/stanley-cups.xlsx differ