Bank Statement PDF to Tally XML — Free online

Upload a statement PDF and download an XML file for TallyPrime and Tally.ERP 9. Replace its two placeholder ledger names with ledgers your company has, then import it: money out becomes a Payment voucher, money in a Receipt, and every voucher balances to zero — which is the thing Tally checks before it accepts anything.

A month of rows arriving in TallyPrime as finished Payment and Receipt vouchers.

Vouchers, not a list to retype

Tally does not import a spreadsheet of transactions. It imports vouchers, each with a date, a narration and two balancing ledger entries, and that is what this writes.

The ledger names are yours to set

Tally refuses a voucher naming a ledger that does not exist in your company, and nothing in a bank statement says what you call yours. The file uses clearly marked placeholders you replace with your own — an invented name would import into the wrong account.

Every voucher balances

Debits negative, credits positive, summing to zero, which is Tally's own convention and the reason an import gets rejected when it is got wrong.

What the Tally XML file contains

Field by field, where each part of the download comes from.

On the statementIn the Tally XMLHow
Date<DATE>, <EFFECTIVEDATE>Written YYYYMMDD, with the day-month order read off the whole column.
WithdrawalPayment voucherYour ledger debited (ISDEEMEDPOSITIVE Yes, a negative amount) and the bank ledger credited.
DepositReceipt voucherThe bank ledger debited and your ledger credited.
Narration, Ref<NARRATION>The bank's narration, then "| Ref" and the reference where the statement prints one in its own column.
Not on a statement<LEDGERNAME>Two placeholders, STATEMENT LEDGER and BANK LEDGER, which you replace with ledgers your company has.
Not on a statementREMOTEIDAn id for each voucher that is the same every time this statement is converted.
Opening balance lineNothingIt moves no money, so it is not a voucher.
Not on a statementNo voucher numberTally numbers vouchers itself; a number written here could collide with one you have.

Sample output

Made by this converter's own code from a made-up statement table like the one the PDF reader produces. The output is the file it writes, not retyped.

The input: Statement table

A made-up Indian statement table, as the PDF reader hands it to the file writer. Reading the PDF itself is not part of this sample.

Date        Narration                        Ref       Withdrawal  Deposit      Balance
01/04/2026  OPENING BALANCE                                                     1,52,400.00
02/04/2026  NEFT CR-EXAMPLE TRADERS PVT LTD  N0926001              1,25,000.00  2,77,400.00
07/04/2026  UPI-SAMPLE STATIONERS            U0926014  2,360.00                 2,75,040.00
15/04/2026  RENT APRIL-MADE-UP PROPERTIES    C000417   45,000.00                2,30,040.00
18/04/2026  BANK CHARGES                               118.00                   2,29,922.00

The output: Tally XML

One of the 4 vouchers in the file, the first Payment, exactly as written. Before the vouchers the file has the XML declaration, a comment listing what to set before importing, and Tally's ENVELOPE, HEADER and IMPORTDATA wrapper.

<TALLYMESSAGE xmlns:UDF="TallyUDF">
 <VOUCHER REMOTEID="858f78e0-abbe-5de3-9cfe-7e3554b90427" VCHTYPE="Payment" ACTION="Create" OBJVIEW="Accounting Voucher View">
  <DATE>20260407</DATE>
  <EFFECTIVEDATE>20260407</EFFECTIVEDATE>
  <VOUCHERTYPENAME>Payment</VOUCHERTYPENAME>
  <PARTYLEDGERNAME>STATEMENT LEDGER - REPLACE WITH A LEDGER FROM YOUR COMPANY</PARTYLEDGERNAME>
  <PERSISTEDVIEW>Accounting Voucher View</PERSISTEDVIEW>
  <NARRATION>UPI-SAMPLE STATIONERS | Ref U0926014</NARRATION>
  <ALLLEDGERENTRIES.LIST>
   <LEDGERNAME>STATEMENT LEDGER - REPLACE WITH A LEDGER FROM YOUR COMPANY</LEDGERNAME>
   <ISDEEMEDPOSITIVE>Yes</ISDEEMEDPOSITIVE>
   <AMOUNT>-2360.00</AMOUNT>
  </ALLLEDGERENTRIES.LIST>
  <ALLLEDGERENTRIES.LIST>
   <LEDGERNAME>BANK LEDGER - REPLACE WITH THE BANK LEDGER FROM YOUR COMPANY</LEDGERNAME>
   <ISDEEMEDPOSITIVE>No</ISDEEMEDPOSITIVE>
   <AMOUNT>2360.00</AMOUNT>
  </ALLLEDGERENTRIES.LIST>
 </VOUCHER>
</TALLYMESSAGE>

Questions about converting a statement to Tally XML

How do I import the XML into TallyPrime?

Replace the two placeholder ledger names with ledgers from your company first. Then open the company and choose Import, Transactions, and select the file. In Tally.ERP 9 the same import is under Gateway of Tally, Import of Data, Vouchers.

Why does Tally say a ledger does not exist?

Every voucher names two ledgers, and Tally will not import a voucher naming one your company does not have. The file still names STATEMENT LEDGER or BANK LEDGER, or a replacement not spelled exactly as Tally shows it.

Will importing the file twice create every voucher twice?

Only if Tally is set to add rather than overwrite. Each voucher's REMOTEID is the same every time the statement is converted, so with "Overwrite voucher when a voucher with same GUID exists" set to Yes (in TallyPrime, Alt+O Import, Configuration), a second import replaces the first.

Is the currency written into the amounts?

No. Tally reads a currency symbol in an amount against a currency set up in the company, and one it does not have fails the import. The amounts are plain figures, which Tally takes to be in the company's base currency; the comment at the top of the file names the statement's currency so you can check the two match.

Related guides