Spreadsheet to database: when to move and how to migrate
The signs that a spreadsheet has become a database in disguise, the hard limits of Excel and Google Sheets, and a step-by-step migration plan that keeps your data intact.
Key Takeaways
- Size is rarely the first problem. Excel allows 1,048,576 rows per sheet and Google Sheets up to 20 million cells. Most teams move because of duplicate records, edit collisions and missing permissions long before they hit those limits.
- Repeated data is the clearest signal. If the same customer, product or address is typed on many rows, you are maintaining a relational database by hand.
- Design first, import second. Split the sheet into tables on paper before moving anything. Importing a messy sheet into a database just gives you a messy database.
- Clean in the spreadsheet, not after. Fix spellings, dates and duplicates while the data is still in a tool you know, then export a clean CSV per table.
- Run both for a short overlap. Keep the old sheet read-only for a week or two, compare totals, then retire it so there is one source of truth.
Quick-Start Prioritization Framework
| Your situation | Stay in a spreadsheet? | Suggested move |
|---|---|---|
| One person, one list, mostly reading | Yes | Add data validation and a backup copy |
| Several people editing the same rows daily | Probably not | Shared database tool with record-level history |
| Same customers or products repeated on many rows | No | Relational database with linked tables |
| Customers or staff need their own logins and views | No | An app with a database and accounts |
| Numbers feed invoices, payroll or inventory counts | No | Database with required fields and checks |
Spreadsheets run a remarkable share of small businesses, and for good reason: they are free, flexible and everyone knows how to use them. The trouble starts when a sheet quietly turns into a system. Several people edit it, other sheets pull from it, and one bad paste can wreck a month of records. This guide covers how to tell when it’s time to move, what to move to, and a migration plan you can follow in an afternoon for a small sheet or a week for a messy one.
Signs your spreadsheet has become a database
A spreadsheet is a grid that trusts its users. A database is a set of linked tables with rules. When you find yourself inventing rules by hand, you have outgrown the grid.
You copy the same details onto many rows
An order sheet with the customer’s name, phone and address on every order is the textbook case. Each copy is a chance for a typo, and a change of address means hunting every row. In a database, the customer lives on one row and each order points to it.
People overwrite each other
Sorting while a colleague is typing, pasting over a filtered range, or two people editing the same cell are everyday spreadsheet accidents. Databases write one record at a time and can keep a history of who changed what.
You need different views for different people
If you’ve made copies of the sheet so that each salesperson sees only their accounts, or you are nervous about giving a contractor access to the whole file, you need permissions at the record level. Spreadsheets share files; databases and apps can share rows.
Lookups are holding things together
A web of VLOOKUP or XLOOKUP formulas between tabs is a relationship being simulated. It works until someone inserts a column or renames a tab.
The hard limits worth knowing
Most small businesses move for the reasons above, but the technical ceilings are real, and some catch people by surprise.
| Limit | Excel | Google Sheets |
|---|---|---|
| Rows per sheet | 1,048,576 | No separate row limit stated; counts toward cells |
| Total size | Columns up to 16,384 per sheet | Up to 20 million cells or 100 MB |
| Number precision | 15 significant digits | See Google’s documentation |
| Long text | See Microsoft’s documentation | Cells over 50,000 characters removed when converting from Excel |
The 15-digit trap
Microsoft’s documentation says Excel keeps a maximum of 15 significant digits, and digits past the 15th become zeros. Long account numbers, tracking numbers and card-like IDs can be silently changed. The same page explains that Excel removes leading zeros by default, so a ZIP code like 02139 becomes 2139. A database column defined as text keeps both exactly.
What to move to
There are three broad destinations. The right one depends on who uses the data and whether it needs to power an app.
| Option | Good for | Trade-off |
|---|---|---|
| Spreadsheet-style database tools (Airtable, Baserow, NocoDB) | Teams that want linked tables in a familiar grid | Paid plans usually priced per user, with record limits per plan |
| An app with its own database | Customers or staff who sign in and see their own data | Takes more setup, or an app builder that does it for you |
| A hosted SQL database (PostgreSQL, MySQL) | Developers, or when you already have one | You need someone to build the screens and logins |
Ask who will touch the data
If only your internal team edits records, a spreadsheet-style database is often enough. If customers, drivers or clients need to sign in and see only their own records, you need an app with accounts and permissions on top of the database.
Step 1: Design the tables before you move anything
Take the main sheet and list every column header. Group the columns by the thing they describe. Each group becomes a table.
A worked example: a cleaning company’s jobs sheet
Say the sheet has these columns: Date, Client, Client phone, Address, Cleaner, Cleaner phone, Service, Hours, Rate, Paid. Grouping them gives four tables. clients: name, phone. properties: client, address (a client can own several). cleaners: name, phone. jobs: date, property, cleaner, service, hours, rate, paid. Client phone and Cleaner phone now live once each, and a client with three properties no longer has to be typed three times.
Choose IDs
Each table needs a unique, permanent ID. If your sheet already has customer numbers, keep them. If not, let the new system generate them and use them to link tables during import.
Step 2: Clean the data while it’s still in the spreadsheet
Cleaning is faster in a tool you already know. Make a copy of the file and work on the copy.
- Trim spaces and fix capitalization so “Acme Ltd ” and “acme ltd” match.
- Merge duplicate clients and decide which phone and email are current.
- Convert every date to one format, ideally YYYY-MM-DD.
- Replace free-text statuses with a short fixed list, such as scheduled, done, cancelled.
- Split cells that hold lists into separate rows.
- Fill or flag blanks in fields that will be required.
Protect IDs and codes first
Before cleaning, format columns like ZIP codes, phone numbers and account numbers as text. Microsoft’s guidance is to import such columns as text so Excel doesn’t strip leading zeros or round long numbers.
Step 3: Export one CSV per table and import in order
Create a separate sheet for each table, with one header row whose names match the new system’s field names. Export each as CSV in UTF-8. CSV is a simple format, described in RFC 4180: commas separate fields, and a field containing a comma, quote or line break is wrapped in double quotes. Spreadsheet exports handle this for you, but it is why a stray line break inside a notes cell can still confuse a careless importer.
Import parents before children
Tables that others point to go first. In the cleaning example: clients, then cleaners, then properties (which point to clients), then jobs (which point to properties and cleaners). If you import jobs first, there is nothing for them to link to.
Map names to IDs
In the jobs CSV, replace the client name with the client’s new ID. A lookup in the spreadsheet does this quickly. Linking by name is fragile: two clients named “Smith” will merge.
Test with a small batch
Import 20 rows first. Open several and compare them with the source. Check dates, money amounts, accented names and anything with a leading zero. Then import the rest.
Step 4: Verify, overlap and switch
A migration isn’t finished when the import succeeds. It is finished when people trust the new system.
Reconcile totals
Compare row counts per table and a few sums, such as total hours last month and total unpaid amount. If the spreadsheet says 1,214 jobs and the database has 1,209, find the five before going further.
Make the old sheet read-only
For a week or two, keep the spreadsheet available but locked. People can check old records but can’t add new ones there. Then archive it. Two live copies of the truth is the situation you were trying to escape.
Set up backups on day one
Find out how your new system exports data and how far back it can restore. Download a full export after the migration so you have a clean starting snapshot.
Common mistakes
Most failed migrations fail for the same handful of reasons.
Importing the sheet as one big table
It feels faster, but every duplicate and inconsistency comes along, and you lose the main benefit of moving.
Opening the CSV in Excel before importing
Double-clicking a CSV lets Excel reformat dates and strip zeros, and saving it bakes those changes in. Inspect CSVs in a text editor or import them through Excel’s Get Data, From Text/CSV option with columns set to text.
Leaving the old sheet editable
Someone will keep updating it out of habit, and the two will drift within days.
Skipping permissions
Moving to a database is the moment to decide who sees what. Don’t recreate “everyone can edit everything” by default.
If you’d rather not do the migration yourself
If you’d rather hand off the build, AI app builders such as Floot let you upload the cleaned CSV and ask the AI to create the tables and import it into the app’s own Postgres database, with logins on top. The design and cleaning steps above still apply, and they make that import go far more smoothly.
Frequently Asked Questions
When should I move from a spreadsheet to a database?
When several people edit the same data, the same details are repeated across many rows, you need different people to see different records, or mistakes in the sheet now cost money. Row limits are usually the last reason, not the first.
How many rows can Excel and Google Sheets handle?
Excel allows 1,048,576 rows by 16,384 columns per worksheet. Google Sheets allows up to 20 million cells or 100 MB for spreadsheets created in or converted to Sheets. Performance often degrades well before those limits with heavy formulas.
Can I keep using a spreadsheet as the front end to a database?
Some tools sync a database to a spreadsheet view, and many database tools look like spreadsheets. The important part is that one system holds the authoritative copy and enforces the rules.
Will I lose my formulas?
Formulas don’t migrate as formulas. Calculated values like totals are usually recomputed by the database or app from the underlying rows, which is more reliable than stored formulas.
How do I stop Excel removing leading zeros from my CSV?
Don’t open the CSV by double-clicking. Use Data, From Text/CSV and set those columns to Text before loading, as Microsoft’s support article describes, or check the file in a plain text editor.
How long does a spreadsheet migration take?
A single clean list can move in an hour. A multi-tab sheet with years of duplicates usually takes several days, most of it spent cleaning and checking rather than importing.
Sources
- Microsoft Support, Excel specifications and limits https://support.microsoft.com/en-us/office/excel-specifications-and-limits-1672b34d-7043-467e-8e27-269d656771c3
- Microsoft Support, Keeping leading zeros and large numbers https://support.microsoft.com/en-us/office/keep-leading-zeros-and-large-numbers-1bf7b935-36e1-4985-842f-5dfa51f85fe7
- Google, Files you can store in Google Drive (Sheets limits) https://support.google.com/drive/answer/37603
- Microsoft Support, Database design basics https://support.microsoft.com/en-us/office/database-design-basics-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5
- IETF, RFC 4180: Common Format for CSV Files, 2005 https://www.rfc-editor.org/rfc/rfc4180