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 \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n
TeamLocationStanley Cups
BluesSTL1
FlyersPHI2
Maple LeafsTOR13
', '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