Fix: Excel parser emits a spurious header-only chunk at exact chunk_rows multiples (#15490)

### What problem does this PR solve?

`RAGFlowExcelParser.html()` iterates `(len(rows) - 1) // chunk_rows + 1`
times. `rows[0]` is the header, so `len(rows) - 1` is the data-row
count. When that count is an exact multiple of `chunk_rows`, the `+ 1`
over-counts by one: the final iteration's data slice is empty, but the
header row is still appended — producing a chunk that contains only the
table header and no data.

This is reachable via `rag/app/naive.py` (`html4excel`, `chunk_rows=12`)
and `rag/app/one.py`. A sheet with 12/24/36… data rows (or 256/512… with
the default `chunk_rows=256`) produces an extra
`<table><caption>…</caption><tr><th>…</th></tr></table>` chunk. It is
non-empty, so it passes the `if _` filter and gets indexed as a real
(empty) chunk.

| data rows (chunk_rows=12) | before | after |
|---|---|---|
| 12 | 2 chunks (1 header-only) | 1 |
| 24 | 3 chunks (1 header-only) | 2 |
| 13 | 2 (unchanged) | 2 |

### Fix

Iterate `ceil(n_data / chunk_rows)` times instead of `n_data //
chunk_rows + 1`. Adds
`test/unit_test/deepdoc/parser/test_excel_parser.py`; the
header-only-chunk cases fail before this change and pass after.

### Type of change

- [x] Bug Fix (non-breaking change which fixes an issue)

Used the Claude CLI while working on this.
This commit is contained in:
Yash Raj Pandey
2026-06-08 05:16:45 -04:00
committed by GitHub
parent 68b9360536
commit 14c460a525
2 changed files with 98 additions and 1 deletions

View File

@@ -229,7 +229,12 @@ class RAGFlowExcelParser:
tb_rows_0 += f"<th>{escape(_fmt(t.value))}</th>"
tb_rows_0 += "</tr>"
for chunk_i in range((len(rows) - 1) // chunk_rows + 1):
# rows[0] is the header; split the remaining data rows into
# ceil(n_data / chunk_rows) chunks. Using +1 here over-counts by one
# when the data-row count is an exact multiple of chunk_rows and emits
# a spurious header-only chunk.
n_data_rows = len(rows) - 1
for chunk_i in range((n_data_rows + chunk_rows - 1) // chunk_rows):
tb = ""
tb += f"<table><caption>{sheetname}</caption>"
tb += tb_rows_0