Tutorials

How to Convert a PDF Bank Statement or Invoice into a Spreadsheet (and Prove It's Right)

We gave an AI a two-page bank statement as a PDF, then a scanned copy of the same thing. Both came back as a table that reconciled to the penny, and it found an £89 charge taken twice. Here's the prompt and the three checks that make the result trustworthy.

The SheetAI Team7 min read
PDF statement to spreadsheet: lines of text on a page turning into rows of a table, with one row highlighted. Cover image from the SheetAI blog.

Key takeaways

  • Attach the PDF and say what columns you want. You don't need a converter, and you don't need to know whether the PDF is a scan.
  • Ask for real dates and numbers, and ask it to drop the brought forward and carried forward lines. Those two sentences prevent most of the errors.
  • A statement checks itself: opening plus money in minus money out must equal closing, and every balance must follow from the row above. Make the AI build those checks into the sheet.
  • Reconciliation can't catch a duplicate charge, because a payment taken twice really did leave the account. Ask a second question for that.
  • Scanned statements work too. Our scanned copy came out identical, confirmed by the same balance checks.

Every accountant, bookkeeper and small business owner knows this job. The bank gives you a PDF. Your accounting software, your budget or your accountant wants a spreadsheet. In between there's an hour of copying, pasting, splitting columns and retyping the numbers that pasted as text.

We wanted to see how much of that hour an AI could take away, and how you'd know whether to trust what it gave you. So we took a two-page business bank statement for September (37 transactions, card payments, direct debits, a payroll run and a dozen incoming invoice payments), attached it to SheetAI, and asked for a table. Then we printed it, scanned it, and did it again with the scan. Every screenshot below is from that session.

Why copying out of a PDF goes wrong

A PDF isn't a table. It's a set of instructions for drawing text at positions on a page. The columns you can see are an illusion created by spacing, and the moment you copy the text out, the spreadsheet has to guess where one column ends and the next begins.

Four cards showing what breaks when a PDF table is pasted into a spreadsheet: columns collapse into one cell; amounts like 1,702.34 arrive as text that SUM ignores; page breaks add balance carried forward and brought forward lines that look like transactions; and dates like 06 Sep arrive without a year.
The four problems we see every time. The third one is the sneakiest: two extra rows that look exactly like transactions.

The page-break lines deserve a special mention. A statement that runs over two pages ends page one with BALANCE CARRIED FORWARD and starts page two with BALANCE BROUGHT FORWARD. They carry a balance, they sit in the transaction list, and if you count them as transactions your totals are wrong in a way that looks plausible.

Step 1: Attach the PDF and describe the table you want

Open a blank sheet in the web app, click the paperclip under the chat box, and pick the PDF. It doesn't go into the grid. It sits next to the conversation as something the AI can read. Then say what you want in the grid:

Turn this bank statement into a table on this sheet: Date, Description, Type (card payment, direct debit and so on), Paid out, Paid in, Balance. Real dates and numbers, not text. Leave out the brought forward and carried forward lines. Then check it: opening balance plus money in minus money out should equal the closing balance, and every row's balance should follow from the row above.

An empty SheetAI sheet. In the chat panel, the PDF fenwick-studio-statement is attached as a 5 KB file chip above the prompt box, and the prompt asking for a table with Date, Description, Type, Paid out, Paid in and Balance columns is typed in.
The whole setup: a blank sheet, the PDF attached, one paragraph of instructions.

Every sentence in that prompt is there for a reason. Naming the columns means you get your structure, not the bank's. "Real dates and numbers" prevents the text problem. Excluding the forward lines handles the page break. And the last sentence asks it to prove its own work, which matters more than anything else in this post.

Step 2: Read what came back

It took a minute and a half and cost 7 credits.

The finished table in SheetAI: Date, Description, Type, Paid out, Paid in, Balance and Row balance check columns, with dates like 01 Sep 2026, descriptions like STAPLETON OFFICE SUPPLY and INV-2211 HARLOW & CO, types like card payment, faster payment and direct debit, amounts in pounds, and OK in every check cell. The chat summary lists 37 transactions in A1:G38, money in £36,917.89, money out £12,917.75, closing balance £42,420.69, overall reconciliation OK and every row balance check OK.
37 transactions, a Type column the PDF never had, and an OK on every row.

A few things it did without being asked twice. It split the bank's description ("CARD PAYMENT STAPLETON OFFICE SUPPLY") into a Type and a Description, which is what makes the table sortable. It added the year the statement didn't print. And the amounts are real numbers in pounds, which you can see because they're right-aligned and formatted, not left-aligned text.

Step 3: Check it the way the bank does

This is the part to remember even if you never use AI for it. You don't have to compare the table with the PDF line by line, because a bank statement has three checks built into it.

Three numbered checks. One, count the rows: rows in the table equal transactions on the statement, which catches a skipped page or a carried forward line counted as a payment. Two, reconcile the totals: opening plus money in minus money out equals closing, which catches misread amounts and missing rows. Three, walk the balances: each balance equals the previous balance plus in minus out, which shows exactly which row is wrong. A yellow note says none of these catch a duplicate charge.
If all three pass, nothing was dropped, doubled or misread. The yellow box is the catch.

Because we asked for it, SheetAI built checks 2 and 3 into the sheet as formulas rather than just telling us they passed: a small reconciliation block under the table, and a check on every row.

The bottom of the table, rows 27 to 38, followed by a reconciliation block: opening balance £18,420.55, money in £36,917.89, money out £12,917.75, calculated closing £42,420.69, statement closing £42,420.69, closing balance difference £0.00, and two green OK cells for the overall check and the row-by-row check.
A difference of £0.00. These are live formulas, so if you edit a row they'll tell you.

Step 4: Ask what a person would ask

The checks prove the table matches the statement. They can't tell you whether the statement itself has a problem. A direct debit taken twice reconciles perfectly, because the money really did leave the account twice. So we switched to Ask mode, which reads and answers without changing anything, and asked:

Anything on this statement I should query with the bank or a supplier? Look for duplicate charges, odd amounts, anything that doesn't fit the pattern. Point me at the rows.

The table scrolled to rows 17 to 38, with two CLOUDHOST PRO PLAN direct debits of £89.00 visible on 15 Sep (row 23) and 17 Sep (row 25). The chat panel reads: Query the bank or supplier. Possible duplicate direct debit, sheet rows 23 and 25, Cloudhost Pro Plan, £89.00 each, 15 Sep and 17 Sep, only two days apart. Query Cloudhost and the bank whether both debits were authorised. Below it, an unusually large Printworks charge on row 28.
Rows 23 and 25: the same £89 subscription, two days apart. It also cites the PDF page each finding came from.

It found the double Cloudhost charge, which we had planted, and pointed at the exact rows. It also flagged a £326.55 Printworks charge as larger than the business's other Printworks payments (£118 to £220), and two Oakridge payments on the same day. It didn't overstate those: it noted they had different invoice numbers and so weren't duplicates on the statement. That answer took 27 seconds and 3 credits.

Is the Printworks charge a problem? Probably not, as a print shop sends a big invoice now and then. But that's the right kind of flag: unusual, explained, left for a person to decide.

What about a scanned statement?

Lots of statements and invoices only exist on paper, or as a scan someone emailed you. Those PDFs have no text in them at all, just a picture of a page, so there's nothing to copy. To test this we turned our statement into a scanned PDF (images only, slightly tilted and grainy, like a real office scanner) and started again on a fresh sheet.

Two cards. Text PDF, downloaded from online banking: the text is read straight out of the file; in our test 37 rows, reconciled to the penny, 7 credits. Scanned PDF, photographed or scanned on paper: each page is turned into an image and the AI reads the image; in our test the same 37 rows and closing balance, 4 credits.
You don't have to know which kind you have. The difference is what happens behind the scenes.

The prompt was the same, with one sentence added at the end: "Tell me any value you couldn't read clearly." It's a good habit on any scan, because it asks the AI to flag anything worth a second look.

A second SheetAI sheet titled Bank statement reconciliation, built from the scanned PDF: the same transactions with Type in capitals, and a reconciliation block in column H. The chat summary reads: opening £18,420.55, paid in £36,917.89, paid out £12,917.75, closing £42,420.69, closing difference £0.00, balance sequence failures 0, overall status OK, sources p.1 and p.2 of the scanned PDF, no values were unclear. 4 credits, 1 minute 23 seconds.
From a scan: the same 37 rows, the same £42,420.69 closing balance, zero balance failures, and "no values were unclear".

Same result, slightly different layout: the types came out in capitals and the reconciliation went beside the table rather than under it. The balance walk passed on all 37 rows, which is the strongest evidence you can get: if a single digit had been misread, the running balance would have broken at that row.

Invoices work the same way

We used a bank statement because it has built-in checks, but the same approach works on invoices, receipts and remittance advice. The difference is what you check against. An invoice has a subtotal, tax and total, so ask for line items in a table and a check that the lines add up to the subtotal and that subtotal plus tax equals the total. If you have a folder of invoices, attach them one at a time and ask for one row per invoice (supplier, invoice number, date, net, tax, gross) appended to the same table.

Prompts you can paste

ForPrompt
Bank statementTurn this statement into a table: Date, Description, Type, Paid out, Paid in, Balance. Real dates and numbers. Skip brought/carried forward lines. Add a reconciliation block and a balance check on every row.
Scanned statementSame as above, then: tell me any value you couldn't read clearly.
InvoicePut the line items in a table: Description, Quantity, Unit price, Line total. Add a check that the lines add up to the subtotal and that subtotal + tax = total.
Many invoicesAdd one row for this invoice to the table: Supplier, Invoice number, Date, Net, Tax, Gross. Don't change the existing rows.
ReviewAnything here I should query? Look for duplicate charges, odd amounts and anything that breaks the pattern. Point me at the rows.
CategoriseAdd a Category column (rent, payroll, software, travel, supplies, tax, income) and a summary of money out by category.

What we'd tell a colleague

For a statement downloaded from online banking, this is now a two-minute job instead of an hour, and the checks make it more reliable than retyping, because retyping has no checks at all. The scanned copy came out identical, without a single misread digit.

The habit worth keeping is the one in the middle: make it prove the table reconciles, in the sheet, as formulas. Then ask the human question that reconciliation can't answer. That's how we found the £89 double charge, and it's what turns a converted PDF into something you'd actually send to your accountant.

Convert your next statement

Open a blank sheet, attach the PDF, and paste the first prompt from the table above.

Open SheetAI

Frequently asked questions

How do I convert a PDF bank statement to Excel?

›
Attach the PDF to SheetAI's chat, describe the columns you want (Date, Description, Paid out, Paid in, Balance), and ask for real dates and numbers with the brought forward and carried forward lines left out. Ask it to add a reconciliation and a balance check on every row, then export the sheet as .xlsx.

Can AI read a scanned PDF?

›
Yes. When a PDF page has no text in it, SheetAI turns the page into an image and the AI reads it visually. In our test, a scanned two-page statement came out identical to the original, and the running balance check confirmed every row.

How do I know the converted table is correct?

›
Use the checks a bank statement already has: the row count should match, opening balance plus money in minus money out should equal the closing balance, and every row's balance should equal the previous balance plus that row's movement. If all three pass, nothing was dropped, doubled or misread.

Why do numbers from a PDF not add up in Excel?

›
Pasted amounts usually arrive as text, often with a thousands separator, and SUM ignores text. Ask for real numbers when converting, or check with =ISNUMBER() on a cell. Our [CSV guide](/blog/csv-to-excel-without-breaking-data) covers the same problem in more detail.

Can it find duplicate charges on a statement?

›
Yes, but you have to ask, because a duplicate charge doesn't break the reconciliation. In our test, asking which rows to query with the bank found an £89 subscription taken twice, two days apart, and named the rows.

Does this work for invoices and receipts?

›
Yes. Ask for the line items in a table and a check that lines add up to the subtotal and that subtotal plus tax equals the total. For many invoices, add one summary row per invoice to the same table.

How much does it cost?

›
Our two-page statement took 7 credits to convert and check from a text PDF, 4 credits from the scanned copy, and 3 credits for the review question. Cost depends on the length of the document and how much checking you ask for.

Written by The SheetAI Team

We build SheetAI, an AI spreadsheet assistant that reads your data, writes the formulas, and shows its work. We write about the spreadsheet problems we keep running into.

Get started

Put this to work on your own spreadsheet

Upload a file, ask in plain English, and watch SheetAI write the formulas into the sheet, with every step visible so you can check the work.

All articles

Works in your browser and Google Sheets · Setup in 30 seconds