Hey n8n community,
A user recently asked whether the extractor Iβm using can handle full data tables, not just single fields like an invoice total. So I took a nasty 22-row tax table (multi-line addresses, empty cells, a row split across a page break) and got it to 100%, clean across every run. Sharing the setup plus a small workflow that validates the extraction for you.
The thing that mattered most was how you shape the response structure. One list per column breaks, because nothing links position 4 in the name list to position 4 in the email list. The moment one column has an empty cell, everything below it shifts and you get βa value jumped in from another row.β The fix: model the table as a single records field, marked as an array of type object, with each column nested inside. One entry per row, values that cannot drift apart.
A few things that saved me:
- One array of objects, not one array per column. The only array you want is
recordsitself. - βNULLβ means two things. A literal value in an empty cell, but a real place name in βNULL City.β Spell out the difference or the model guesses.
- Leading-zero IDs must be strings, or the zero silently drops.
I also built a tiny validation workflow that checks every extracted cell against a reference, flags mismatches, and logs how long extraction took, so you can confirm accuracy holds across runs and compare the two engines.
Where to get it: guide and workflow together in one folder:
Part of my repo with 20+ other n8n templates I have built with this community. A star helps other builders find it.
What is the messiest table you have run through an extractor?
Best,
Felix
