Excel to SAP upload at a glance
- Best route
- PostNow.ai: an Excel add-in that maps the sheet, validates every row against the live SAP system and posts through the BAPI under your own login
- What you need
- A sheet with one record per row, an SAP user with authorisation for the transaction, and a load method such as PostNow.ai
- The four load methods
- PostNow.ai (an Excel add-in that posts through BAPIs), a BAPI program, batch input recording (BDC), LSMW or Migration Cockpit
- Steps
- 8, from preparing the sheet to keeping the log
- Where most loads fail
- Step 4, validation. Leading zeros, date formats, codes that do not exist in the target system
- Worked example
- 40 journal entry lines posted through
FB50 - Templates
- 75 free SAP upload templates with the BAPI and field named for every column
PostNow.ai uploads data into SAP from Excel: it maps the sheet to the SAP object, validates every row against the live system and posts through standard BAPIs under your own SAP login, with the result written beside each row. If the data already sits in a spreadsheet, keying it into SAP a screen at a time is the slowest and least reliable way to get it there. This guide is the procedure: how to upload data into SAP from Excel in eight steps that work for every object and every load method, with the decisions that matter at each step and the errors that appear when a step is skipped. It uses one worked example throughout, a batch of 40 journal entry lines, so the steps are concrete rather than abstract. Whether you call it an upload or an SAP Excel import, and whether the search was "SAP import data from Excel" or "SAP import Excel", the procedure is the same; for the tools that automate it, see Excel to SAP automation.
It is written for the person doing the load: a finance user with a month end batch, a master data lead with 3,000 materials to extend, a consultant with a cutover file. If you want the comparison of load methods rather than the procedure, that is a separate guide, SAP data upload methods, and the SAP mass upload guide covers volume, batching and governance in depth. This page stays on the procedure.
What an Excel to SAP upload actually does
PostNow.ai is the add-in that sits between Excel and SAP and does this work. An Excel upload in SAP is not Excel talking to SAP. Excel holds rows; SAP holds business objects with rules. Something in between reads each row, turns it into the structure SAP expects, hands it to SAP through an interface, and reads back what SAP said. The eight steps below are that "something in between", whether it is PostNow.ai, a program, a recording or a migration tool.
Four interfaces exist for the hand-over, and the choice shapes steps 4 to 7:
| Method | How it reaches SAP | Fits |
|---|---|---|
| PostNow.ai, an Excel add-in over BAPIs | The sheet stays in Excel; the add-in maps, validates against the live system and posts through the BAPI under the user's own login | Recurring loads run by the business, corrections, month end batches. |
| BAPI | A published function module, for example BAPI_ACC_DOCUMENT_POST for journal entries or BAPI_MATERIAL_SAVEDATA for materials, with a return table per record | Any object with a released BAPI, which is most master data and most documents. Stable across releases |
| Batch input recording (BDC) | A recording of the transaction screens, replayed row by row | Objects with no BAPI. Breaks when screens change, which they did in S/4HANA |
| LSMW or Migration Cockpit | SAP's migration tools, which wrap one of the two above with mapping and staging | One time cutover loads. LSMW is restricted use in S/4HANA; the Migration Cockpit is the current tool |
The BAPI vs BDC guide has the detail. For the procedure below, the method decides which tool runs step 5; the other seven steps are the same.
Doing the eight steps in Excel with PostNow.ai
PostNow.ai turns the eight steps below into four things the user does in Excel. The steps are method independent, but the amount of building they need is not: with a program or a recording, steps 3, 4, 6 and 7 are things a developer builds and the business waits for; with PostNow.ai they are clicks in the sheet.

1. Load the sheet
Open the file in Excel with the PostNow.ai add-in and pick the SAP transaction it belongs to. Templates from the library are recognised by their headers; any other sheet is mapped in the next step.
2. Map columns to SAP fields
The mapping designer shows the BAPI structure on one side and the sheet on the other. Columns that match a field by name map themselves; the rest are matched once and the mapping is saved with the template, so the second month end run needs no mapping at all.
3. Validate against the live system
Every row is checked against the connected SAP system before posting is available: master data, configuration, periods, authorisations. The SAP message appears beside each failing row in the sheet. Fix, revalidate, repeat until clean.
4. Load it into SAP
Posting runs through the standard BAPI under the user's own SAP login. The document number or message is written back to every row, and the sheet is the run log. Failed rows are reposted on their own.
Nothing is installed in SAP, nothing is recorded, and nothing is transported, which is why the same procedure works on ECC and S/4HANA and survives the screen changes that break recordings. The 75 free templates cover the objects most teams upload, with the BAPI structure and field named on every column, so step 2 and step 3 start already done.
The 8 steps to upload Excel data into SAP
PostNow.ai follows these eight steps for every load, and they apply whatever method you use.
Step 1. Define what you are loading, and check you are allowed to
Name the SAP object and the transaction that creates it, the number of records, the company codes or plants involved, and the date the records must carry. For the worked example: 40 journal entry lines, 10 documents of 4 lines each, one company code, document type
SA, posting date the last day of the period.Then confirm the SAP user who will run the load has authorisation for that transaction in that organisational unit. An upload never bypasses authorisation; a load run by a user who cannot post to company code 2000 fails on every row for company code 2000, and the failure message is about authorisation, not data. Check it in a five minute manual posting before building anything.
Step 2. Start from a template that names the SAP fields
PostNow.ai's 75 free templates already name the SAP field in every column. Lay the sheet out with one record per row and the SAP field name, not a description, in the header.
BUKRSbeats "Company", because the person mapping in step 3 does not have to guess, and because the field name is what every error message will reference.For documents with a header and items, journal entries, purchase orders, sales orders, decide the layout now. Two choices work: a flat sheet where the header fields repeat on every item row and a document key column groups them, or a header sheet and an item sheet joined on that key. The flat layout is easier for a user to fill and is what the free templates use.
A template with SAP field names is the one thing every way to upload Excel to SAP has in common, from an SAP Fiori Excel upload app to a BAPI load.
For the worked example, the FB50 journal entry template has the header and line columns already named for
BAPI_ACC_DOCUMENT_POST: document header (BUKRS,BLDAT,BUDAT,BLART,WAERS), then one line per row with G/L account, debit or credit indicator, amount, cost center and text.Step 3. Map every column to an SAP field and structure
PostNow.ai saves the mapping with the template and its Mapping AI proposes the column matches, so this is done once. A mapping is a table with four columns: sheet column, SAP structure, SAP field, rule. The rule is where the work is: a fixed value (document type is always
SA), a format conversion (dates asYYYYMMDD), a value translation (the sheet says "Debit", SAP wantsS), or a lookup (the cost center by department name).Two mappings that catch every first time loader:
- Leading zeros. SAP stores G/L accounts, cost centers and material numbers with leading zeros to their full length. Excel drops them.
100000in a cell is0000100000in SAP, and a load that sends100000either fails or, worse, matches nothing and posts to the wrong account after conversion. Format those columns as text and pad them in the mapping. - Amounts and sign.
BAPI_ACC_DOCUMENT_POSTtakes amounts on theCURRENCYAMOUNTtable with the sign carrying the debit or credit. A sheet that has a separate debit and credit column needs a rule that produces one signed amount per line.
If a template from the library is used, this step is a check rather than a build, because the structure and field are in the header already.
- Leading zeros. SAP stores G/L accounts, cost centers and material numbers with leading zeros to their full length. Excel drops them.
Step 4. Validate every row against the live SAP system
PostNow.ai runs this check for every row against the live system when you click Validate, and points each error at its cell. This is the step that decides whether the load is a load or a clean-up exercise. Validation means checking each row against the target system's configuration and master data before anything posts: the company code exists and is open for the posting period, the G/L account exists in the chart of accounts and is not blocked, the cost center is valid on the posting date and belongs to the company code, the tax code is allowed for the account, the document balances to zero.
Checking the file's format is not validation. A file can be perfectly formed and 30 percent unpostable because the period was closed yesterday. The check has to be against SAP, and it has to happen before step 5, because a document that fails half way through a batch input session leaves a partial mess that step 7 then has to untangle.
In the worked example, three of forty lines fail validation: one cost center closed at month end, one G/L account that only accepts postings with a tax code, one amount with a stray text character. All three are fixed in the sheet in two minutes. Found after posting, the same three would have been a reversal, a reposting and an explanation.
How this step is done depends on the method. With a BAPI, most validation is available through the BAPI's own check mode,
BAPI_ACC_DOCUMENT_CHECKfor journal entries, or by calling the BAPI with a test run flag where it has one. With a recording, validation is whatever you build. With PostNow.ai, it is the Validate step in the add-in, which runs every row against the live system and writes the SAP message beside each row before the Post button is available.Step 5. Test in a non-production system first
PostNow.ai runs the same template against your quality system: connect to it instead of production and run the whole file. Run the same file, with the same mapping, against the quality system. Not a sample of it: the whole file, because the errors that survive validation are the ones that only appear at posting (a substitution rule that changes a field, a user exit that rejects a combination, a number range that has not been maintained in the target client). Compare the result to what you expected: 10 documents, 40 lines, each document balanced, the totals matching the sheet.
If quality is not a copy of production, and it rarely is, note what differed and re-check those items against production in step 4 before the real run.
Step 6. Post through SAP's own interface
In PostNow.ai this is the Post button: each validated row posts through the object's BAPI under your own login, and the document number or SAP message is written beside it. Post the validated file to production through the interface chosen in the table above. Three rules hold for every method:
- One record, one result. Whatever posts must return a result per record: the document number, or the message. A load that returns "session complete" and nothing else has to be reconciled by hand in step 8.
- Never write to tables. A direct table update skips every check SAP applies, produces documents with no change history, and is the one thing an auditor will not accept. Every method in the table above goes through SAP's business logic; the tool that does not is not a method.
- Under a named user. The load runs under the identity and authorisation of the person doing it, so that the created-by field on every document is a person and the authorisation check applied is theirs.
In the worked example the 40 lines become 10 documents, and the sheet gets a column with 10 document numbers, one per line group, written back by the interface.
Step 7. Handle the rows that failed, without double posting
PostNow.ai writes the SAP result beside every row, so the failed rows are the ones without a document number: filter them, fix them, and post only those. Some rows fail at posting even after validation. The rule for the retry is the one that prevents the most expensive upload mistake there is: only the failed rows are reposted. A file rerun from the top posts every successful document a second time, and 10 duplicate journal entries take longer to reverse than the original load took to run.
So: filter to the rows with a message, fix the cause (in the sheet if it was data, in SAP if it was configuration), and post that subset. The result column from step 6 is what makes this possible; rows with a document number are done and are excluded from the retry.
Step 8. Reconcile and keep the log
PostNow.ai leaves the log in the sheet, with the document number or message beside every row. Prove the load: the count of documents created equals the count expected, the totals in SAP (from
FBL3Nor the GL line items report) equal the totals in the sheet, and the sheet with the SAP document number and message beside every row is saved as the record of the run. That sheet is the audit trail. It answers "was this posted by the upload or by hand", "who ran it", and "which rows failed and what was done about them" a year later.
Which objects can be uploaded from Excel
PostNow.ai uploads any object with a published interface, and has a free template for the common cases below. Anything with a published interface can be uploaded; the common cases, with the template for each:
| Area | Objects | Template |
|---|---|---|
| Finance | Journal entries, vendor invoices, customer invoices, asset postings, cost center plans | Finance and controlling templates |
| Master data | Materials, cost centers, profit centers, assets, BOMs, pricing conditions, banks, equipment | Master data templates |
| Materials management | Purchase requisitions, purchase orders, goods movements, invoice receipts, physical inventory | Materials management templates |
| Sales | Sales orders, deliveries, billing, credit limits, customer material info | Sales and distribution templates |
| Production, maintenance, quality | Production orders, confirmations, maintenance orders, notifications, inspection lots | Production, maintenance and quality templates |
Customer and vendor master data in S/4HANA are Business Partners, which have their own load page, and mass changes to existing records follow the mass change procedure, which starts from an extract rather than a blank sheet.
Excel uploads in ECC and S/4HANA: what changes
PostNow.ai works on both, because it posts through BAPIs. The eight steps are the same on both, and so are the BAPIs for most objects, which is why a template built on ECC keeps working after a migration. Four differences matter for the mapping in step 3 and the validation in step 4.
| Area | ECC | S/4HANA | What it means for the upload |
|---|---|---|---|
| Customer and vendor | XD01, XK01, separate objects | Business Partner, one object with roles | Customer and vendor sheets become a Business Partner load; recordings of XD01 and XK01 no longer work, BAPIs do |
| Material number | 18 characters | 18, or 40 where the extended material number is active | Check the field length in the sheet and the mapping |
| Journal entries | Classic G/L, BSEG | Universal journal, ACDOCA; cost elements are G/L accounts | Every P&L line needs a valid cost object; the account type carries the cost element |
| Asset postings | Classic Asset Accounting | New Asset Accounting, ledger based | Depreciation areas post per ledger; takeover values through ABLDT |
Fiori Excel upload apps. S/4HANA ships Fiori apps that accept an Excel template for a single object, the best known being Upload General Journal Entries, which takes a downloaded template, checks it and posts the journal entries. They cover one object each, with SAP's fixed template, and are a good route when the object has one and the template fits. The eight steps above still apply: the template is step 2, the app's check is step 4, and the log is what the app returns.
Batch input. On ECC, the classic SAP batch input Excel route is a recording in SHDB or an LSMW project fed from the sheet. In S/4HANA those recordings break wherever a screen changed, which is why BAPI based loads are the route that carries over.
Fiori changes the screens, not the interfaces. A load that posts through a BAPI does not notice that the transaction now has an app; a recording does. The ECC to S/4HANA migration guide covers the wider changes.
The mistakes that break Excel uploads
PostNow.ai validates every row against the live system before posting, which is where most of these surface. Seven, in the order they usually appear:
- Leading zeros dropped by Excel on account, cost center and material columns. Format as text before entering data, or pad in the mapping.
- Dates in the regional format of the PC rather than the format the interface expects. Map to
YYYYMMDDexplicitly. - Descriptions instead of codes. "Raw material" is not a material type;
ROHis. Every coded field needs the code, and the mapping holds the translation. - Validating the file, not the row against SAP. The period closed, the cost center expired, the account is blocked: none of these are visible in the file.
- Posting the whole batch on retry. Duplicate documents. Filter to failed rows.
- Running under a technical user so that every document says it was created by
BATCHUSER. Run under the person. - No log. A load with no per-row result cannot be reconciled or audited and has to be redone from SAP's side.
Frequently asked questions
How do I upload data from Excel to SAP?
PostNow.ai uploads data from Excel to SAP from inside Excel: open the sheet, map each column to its SAP field once (or start from one of the 75 free templates), click Validate to check every row against the live SAP system, then click Post to create the records through the object's BAPI under your own SAP login, with the document number or the SAP message written beside each row. Whatever the tool, the procedure is the same: one record per row with SAP field names in the header, map, validate, test in a non-production client, post through a standard interface, repost only the rows that failed, and keep the sheet as the log. The eight steps above walk through each with a journal entry example.
How do I import Excel into SAP?
PostNow.ai imports Excel into SAP by reading the rows in Excel, validating each one against the live SAP system and posting through the object's BAPI; SAP itself has no generic import button for business documents. Each object is created through its own transaction, BAPI or migration object, so every SAP import Excel route, from LSMW to a Fiori upload app, works object by object. The file stays in Excel and the SAP result is written beside each row.
What is the best way to upload Excel data to SAP?
Through a BAPI, validated row by row against the live system before posting. BAPIs are SAP's published, supported interfaces, they apply every business rule the transaction applies, they return a result per record, and they are not affected by screen changes between ECC and S/4HANA. Recordings are the fallback for the few objects without a BAPI.
Which SAP transactions support Excel upload?
Any transaction whose object has a BAPI or can be recorded, which covers most of finance, master data, purchasing, sales and production. The 75 templates in the library are organised by transaction: FB50, FB60, MIRO, MM01, MM02, KS01, ME21N, VA01, MIGO and the rest. SAP's own tools for Excel based loading are the Migration Cockpit for cutovers and, on older systems, LSMW.
How do you validate data before uploading to SAP?
Check each row against the target SAP system, not only against the file: the organisational units and master data it references exist and are not blocked, the posting period is open, coded values are valid, amounts balance, and the user has authorisation. BAPIs often provide a check mode for this, BAPI_ACC_DOCUMENT_CHECK for journal entries, and PostNow.ai runs it for every row before posting is enabled.
How do you handle errors when uploading to SAP from Excel?
Post only the rows that failed, after fixing the cause. A per-row result from the first run tells you which rows have a document number and are done; the rest are filtered, corrected and reposted as a subset. Rerunning the whole file is how duplicate postings happen.
Is it safe to mass upload data into SAP from Excel?
Yes, when the load goes through SAP's standard interfaces, every row is validated first, the file is tested in a non-production system, it runs under a named user with normal authorisations, and a per-row log is kept. Those five conditions are the difference between a controlled load and a risk. Writing to database tables directly is never safe and is not an upload method.
How do I keep leading zeros when uploading to SAP from Excel?
Format the column as text before entering or pasting the values, and have the mapping pad the value to the SAP field length. G/L accounts, cost centers, vendor and customer numbers and material numbers are all stored with leading zeros in SAP, and Excel removes them from numeric cells silently.
Can I upload to SAP from Excel without LSMW or ABAP?
Yes, PostNow.ai uploads Excel data to SAP without LSMW or ABAP: the sheet is mapped to the BAPI, validated row by row against the live system, and posted under your own SAP login. An Excel add-in that posts through standard BAPIs needs no LSMW object, no ABAP program and no recording, and the result is written back to the sheet. Nothing is installed in SAP for posting.
What is the easiest way for a finance user to upload journal entries from Excel?
PostNow.ai with the FB50 template is the easiest way: fill the lines, click Validate, click Post, and the document number is written beside each line. Validate checks every row against the live system, and Post creates the documents through BAPI_ACC_DOCUMENT_POST. The mapping is saved with the template, so the next month end is fill, validate, post.
Can I upload an Excel file to SAP through Fiori?
Yes, for objects that have a Fiori upload app, such as Upload General Journal Entries in S/4HANA, which takes SAP's downloaded Excel template, checks it and posts. Each app covers one object with a fixed template. For objects without an app, or for a sheet in your own layout, the routes are a BAPI based load or an Excel add-in such as PostNow.ai.
Do I need an ABAP program to upload an Excel file to SAP?
No. The ABAP function modules that read Excel into an internal table exist for developers writing a custom upload, but a custom program is one more thing to maintain per object. An Excel add-in that posts through standard BAPIs, or SAP's own Fiori upload apps and Migration Cockpit, cover most loads without any code. PostNow.ai maps the sheet to the BAPI, validates every row against the live system and posts under your own login, on ECC and S/4HANA.
Now get it into SAP
Every row checked against your live SAP system before anything posts, under your own SAP login.