From 4752f9fa8cf82134d553e0fc9ce69fafd17b216c Mon Sep 17 00:00:00 2001 From: Andrew Chen <48723787+chuenchen309@users.noreply.github.com> Date: Thu, 16 Jul 2026 19:14:50 +0800 Subject: [PATCH] fix(rag): ExcelKnowledge._load must handle headerless sheets and multi-sheet workbooks (#3137) Co-authored-by: Claude Opus 4.8 --- .../src/dbgpt_ext/rag/knowledge/excel.py | 3 +- .../rag/knowledge/tests/test_excel.py | 44 +++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 packages/dbgpt-ext/src/dbgpt_ext/rag/knowledge/tests/test_excel.py diff --git a/packages/dbgpt-ext/src/dbgpt_ext/rag/knowledge/excel.py b/packages/dbgpt-ext/src/dbgpt_ext/rag/knowledge/excel.py index d71167a1d..3dc985577 100644 --- a/packages/dbgpt-ext/src/dbgpt_ext/rag/knowledge/excel.py +++ b/packages/dbgpt-ext/src/dbgpt_ext/rag/knowledge/excel.py @@ -175,6 +175,7 @@ class ExcelKnowledge(Knowledge): ) else: data_rows = unmerged_data + df_start_row_index = 0 logging.info( f"Sheet '{sheet_name}': No clear header row found. " f"All rows considered data." @@ -261,7 +262,7 @@ class ExcelKnowledge(Knowledge): ) docs.append(doc) - return docs + return docs @classmethod def support_chunk_strategy(cls) -> List[ChunkStrategy]: diff --git a/packages/dbgpt-ext/src/dbgpt_ext/rag/knowledge/tests/test_excel.py b/packages/dbgpt-ext/src/dbgpt_ext/rag/knowledge/tests/test_excel.py new file mode 100644 index 000000000..5370ae48e --- /dev/null +++ b/packages/dbgpt-ext/src/dbgpt_ext/rag/knowledge/tests/test_excel.py @@ -0,0 +1,44 @@ +import openpyxl +import pytest + +from ..excel import ExcelKnowledge + + +@pytest.fixture +def multi_sheet_xlsx(tmp_path): + path = tmp_path / "multi_sheet.xlsx" + wb = openpyxl.Workbook() + ws1 = wb.active + ws1.title = "Sheet1" + ws1.append(["name", "value"]) + ws1.append(["a", 1]) + ws2 = wb.create_sheet("Sheet2") + ws2.append(["name", "value"]) + ws2.append(["b", 2]) + wb.save(path) + return str(path) + + +@pytest.fixture +def numeric_only_xlsx(tmp_path): + path = tmp_path / "numeric_only.xlsx" + wb = openpyxl.Workbook() + ws = wb.active + ws.title = "NumericSheet" + for r in range(6): + ws.append([r, r + 1, r + 2]) + wb.save(path) + return str(path) + + +def test_load_reads_all_sheets(multi_sheet_xlsx): + knowledge = ExcelKnowledge(file_path=multi_sheet_xlsx) + docs = knowledge._load() + sheets_seen = {doc.metadata["sheet_name"] for doc in docs} + assert sheets_seen == {"Sheet1", "Sheet2"} + + +def test_load_does_not_crash_without_header_row(numeric_only_xlsx): + knowledge = ExcelKnowledge(file_path=numeric_only_xlsx) + docs = knowledge._load() + assert len(docs) == 6