How to Upload Data into SAP from Excel

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:

MethodHow it reaches SAPFits
PostNow.ai, an Excel add-in over BAPIsThe sheet stays in Excel; the add-in maps, validates against the live system and posts through the BAPI under the user's own loginRecurring loads run by the business, corrections, month end batches.
BAPIA published function module, for example BAPI_ACC_DOCUMENT_POST for journal entries or BAPI_MATERIAL_SAVEDATA for materials, with a return table per recordAny 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 rowObjects with no BAPI. Breaks when screens change, which they did in S/4HANA
LSMW or Migration CockpitSAP's migration tools, which wrap one of the two above with mapping and stagingOne time cutover loads. LSMW is restricted use in S/4HANA; the Migration Cockpit is the current tool
Start your 14 day free trial of PostNow.ai: post SAP data directly from Excel and validate every row before it posts

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.

SAP BAPI Tutorial: Excel to SAP FB50 Automation | BAPI_ACC_DOCUMENT_POST
Watch: posting FB50 journal entries from Excel into SAP through BAPI_ACC_DOCUMENT_POST.

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.

  1. 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.

  2. 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. BUKRS beats "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.

  3. 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 as YYYYMMDD), a value translation (the sheet says "Debit", SAP wants S), 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. 100000 in a cell is 0000100000 in SAP, and a load that sends 100000 either 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_POST takes amounts on the CURRENCYAMOUNT table 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.

  4. 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_CHECK for 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.

  5. 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.

  6. 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.

  7. 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.

  8. 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 FBL3N or 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:

AreaObjectsTemplate
FinanceJournal entries, vendor invoices, customer invoices, asset postings, cost center plansFinance and controlling templates
Master dataMaterials, cost centers, profit centers, assets, BOMs, pricing conditions, banks, equipmentMaster data templates
Materials managementPurchase requisitions, purchase orders, goods movements, invoice receipts, physical inventoryMaterials management templates
SalesSales orders, deliveries, billing, credit limits, customer material infoSales and distribution templates
Production, maintenance, qualityProduction orders, confirmations, maintenance orders, notifications, inspection lotsProduction, 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.

AreaECCS/4HANAWhat it means for the upload
Customer and vendorXD01, XK01, separate objectsBusiness Partner, one object with rolesCustomer and vendor sheets become a Business Partner load; recordings of XD01 and XK01 no longer work, BAPIs do
Material number18 characters18, or 40 where the extended material number is activeCheck the field length in the sheet and the mapping
Journal entriesClassic G/L, BSEGUniversal journal, ACDOCA; cost elements are G/L accountsEvery P&L line needs a valid cost object; the account type carries the cost element
Asset postingsClassic Asset AccountingNew Asset Accounting, ledger basedDepreciation 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:

  1. Leading zeros dropped by Excel on account, cost center and material columns. Format as text before entering data, or pad in the mapping.
  2. Dates in the regional format of the PC rather than the format the interface expects. Map to YYYYMMDD explicitly.
  3. Descriptions instead of codes. "Raw material" is not a material type; ROH is. Every coded field needs the code, and the mapping holds the translation.
  4. 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.
  5. Posting the whole batch on retry. Duplicate documents. Filter to failed rows.
  6. Running under a technical user so that every document says it was created by BATCHUSER. Run under the person.
  7. 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.