Back to blog
September 7, 20267 min readbank-statementsexceltroubleshooting

Convert a Bank Statement to Excel Without Losing the Running Balance

Multi-page statements are where conversion quietly falls apart: repeated headers land in the data, carried-forward lines become transactions, and the balance column stops reconciling. Here is what breaks at a page break and how to fix it.

By Saurav Agarwal

The running balance breaks in conversion because most tools treat each PDF page as a separate table. Repeated column headers land inside the data, carried-forward balance lines become fake transactions, and the sequence that makes the balance column meaningful is severed at every page boundary. All three are detectable and repairable.

Key takeaways

  • Page-by-page extraction is the root cause. One transaction list becomes several disconnected blocks.

  • Three specific artefacts appear at seams: header rows, carried-forward lines, and footer text.

  • The running balance is the most valuable column you have — it is a checksum on every row.

  • If your balance column reconciles end to end, your extraction is almost certainly correct.

Why is the running balance worth protecting?

Because it is the only column that validates the others.

Each row's balance should equal the previous row's balance, plus that row's credit, minus that row's debit. That relationship holds for every row in a correct statement. It means the balance column is a per-row checksum on the amounts and their signs.

Once you have a complete, correctly ordered balance column, you can verify an entire statement in one formula. Lose it — or let it break at page boundaries — and you are back to checking rows by eye.

This is also why a converter that discards the balance column, or emits it inconsistently, has taken something more valuable than one column of data.

What breaks at a page break?

A four-page statement is one logical transaction list interrupted three times. Between the last transaction on one page and the first on the next, the PDF contains page furniture: a footer, a page number, often a bank address block, usually a repeated column header, and frequently a balance carried forward line.

A general converter that processes each page as its own table has no reason to treat any of that as different from data. Three artefacts result.

Artefact 1: header rows inside the data

The repeated "Date | Description | Debit | Credit | Balance" header appears as a transaction row, part-way down your spreadsheet, once per page. It is easy to spot and easy to delete — the risk is that a bulk import runs before anyone looks.

Artefact 2: carried-forward lines as transactions

More damaging. A line reading "Balance brought forward 4,182.55" gets extracted as a transaction with an amount of 4,182.55 and no counterpart.

If you total the amount column, you have now added the account balance to your transaction totals, once per page. On a twelve-page statement that is eleven spurious additions, and the total is wildly wrong in a way that is not obviously attributable to a conversion error.

Artefact 3: severed ordering

The subtler problem. Even with headers and carried-forward lines removed, if the converter emitted pages as separate blocks, the rows may not be in a single continuous sequence — page 3's transactions can precede page 2's. The balance column is then non-monotonic in a way that makes reconciliation fail even though every individual value is correct.

How do I tell whether continuity survived?

Three checks, in order of speed.

1. Scan the balance column. In a correct extraction the balance changes by exactly each row's amount, row after row, with no jumps. Sort nothing first — the check depends on original order.

2. Search for header text. Search the sheet for "Balance" or "Description". Matches outside row 1 are embedded headers.

3. Reconcile end to end. Opening balance from the statement, apply every extracted transaction in order, compare to the printed closing balance. This is the definitive test.

If check 3 passes, continuity survived and the data is trustworthy. If it fails, checks 1 and 2 usually reveal why.

How do I repair a broken balance column?

Assuming the transactions themselves extracted correctly and only the structure is damaged:

  1. Delete embedded header rows. Filter or sort to find rows where the date column contains the word "Date" or is non-numeric, and remove them. Do this first — they interfere with everything else.

  2. Remove carried-forward and brought-forward rows. Filter the description column for "forward", "b/f", "c/f", "brought" and "carried". Verify each before deleting; a genuine transaction description could theoretically contain those words.

  3. Restore ordering. Sort by date ascending. This works when the statement is chronological, which most are. Be careful if several transactions share a date — sorting can reorder within a day, which changes the balance sequence even though the day's net change is correct.

  4. Rebuild the balance column. With rows in correct order, put the statement's opening balance in a cell above the first transaction, then in the balance column use a formula that adds the credit and subtracts the debit from the row above. Drag it down.

  5. Compare with the extracted balance. If your rebuilt column matches the extracted one row for row, both are right. Where they diverge is where an amount or sign is wrong — and the first divergent row is the error.

Step 5 is the payoff. Comparing a rebuilt balance against the extracted one localises the error to a single row rather than telling you only that something, somewhere, is off.

What does a converter need to do to avoid this?

Recognise that page furniture is structure, not content.

  • Repeated headers identified as headers by their position and repetition, and excluded.

  • Carried-forward and brought-forward lines recognised as balance assertions, used to verify continuity across the seam rather than emitted as transactions.

  • Footers, page numbers and address blocks excluded by position.

  • One continuous transaction list assembled across all pages, in document order.

  • The balance chain checked across page boundaries, so a broken seam is reported rather than silently passed through.

The fourth point is what "multi-page continuity" means in practice, and the fifth is what turns it from a claim into something verifiable.

Converting multi-page statements here

This converter treats a statement as one document rather than a series of pages: repeated headers and carried-forward lines are recognised as page furniture, the transaction list is assembled continuously across pages, and output is a fixed schema of date, description, debit, credit and balance as CSV or Excel.

Batch upload takes up to 10 files at a time, with a 50 MB per-file limit signed in and 10 MB anonymously. Pricing is per page with no subscription — 50 free credits on signup.

Whatever you use, run the end-to-end reconciliation. A statement that reconciles to the cent is verified; one that does not is not, however clean the sheet looks. Try a multi-page statement.

Frequently asked questions

Why does my converted statement have the column headers repeated in the middle?

The converter processed each PDF page as a separate table, so the header row printed at the top of each page was extracted as data. Filter the date column for non-date values to find and remove them. It is cosmetic damage rather than data loss, but it will break an import if not cleaned first.

What is a balance brought forward line and why is it a problem after conversion?

It is the account balance carried from the previous page, printed so each page reads independently. Converters that do not recognise it extract it as a transaction with a large amount and no counterpart. Totalling the amount column then adds the account balance once per page, producing a badly wrong figure.

How do I rebuild a running balance in Excel?

Put the statement's opening balance in a cell above the first transaction, then in each balance cell add that row's credit and subtract its debit from the balance in the row above, and fill down. Compare the result against the extracted balance column — the first row where they diverge is where the extraction error is.

Why does my balance column not match the statement's closing balance?

Something is wrong in the transactions: a dropped or duplicated row, an inverted sign, a misread amount, or extra rows such as carried-forward lines counted as transactions. The size of the discrepancy is diagnostic — matching exactly one transaction's value suggests a dropped row; exactly twice a value suggests an inverted sign.

Should I convert a long statement page by page or all at once?

All at once, with a tool that handles continuity. Splitting the PDF creates the very problem described here — separate blocks with headers embedded and no continuous balance chain — and then requires you to stitch them back together manually.