Is it possible to import data to multiple tables from one excel sheet using laravel excel?

Stefan Bogdanescu

Founder & Senior Architect · 2026-06-29

Laravel Company

Can Laravel Excel Import Data to Multiple Tables from One Excel Sheet? A Deep Dive into Multi-Table Imports

As developers building data ingestion pipelines, one of the most common challenges is dealing with flat files like Excel or CSVs that contain data spanning multiple logical tables. You upload a single file, but your database requires several separate tables—one for users, one for products, and one for orders. The question is: Can we leverage Laravel Excel to smartly split this single spreadsheet into multiple Eloquent models during the import process?

This post will explore the capabilities of Laravel Excel for multi-table imports, address the limitations you observed, and propose robust architectural patterns for achieving this goal.


Understanding the Limitation of Single Imports in Laravel Excel

Your understanding is partially correct: when using the standard Excel::import() method or implementing simple ToModel interfaces, the mechanism is fundamentally designed to map a single source stream (the Excel file) to a single destination model instance within that specific import operation. This is because the package focuses on mapping rows directly to classes.

If your Excel sheet contains definitions for multiple distinct tables (as suggested by your example structure: first row for table name, second row for fields), a single Excel::import() call will struggle with this dynamic, multi-table requirement. It treats the entire file as one data source intended for one model mapping.

php
// Example of the limitation:
class ImportsController
{
    public function import()
    {
        // This method expects to map all imported rows into a single structure/model definition.
        Excel::import(new DataImport, 'testSheet.xlsx'); // Only maps data to one model
        return redirect('/')->with('success', 'All good!');
    }
}

To achieve multi-table import, we need to shift from a monolithic import strategy to an orchestration strategy where the controller or service layer dictates which file/sheet is being processed and which model is targeted for each batch.

The Solution: Orchestrating Multiple Imports

Since Laravel Excel excels at performing high-fidelity mapping between arrays and models, the most effective approach for multi-table imports is to treat each table as a separate import operation, orchestrated by your application logic.

Strategy 1: Separate Files for Separate Tables (Recommended)

The cleanest and most maintainable method is to separate the data into multiple Excel files, one file per target table. This leverages Laravel Excel's strength perfectly:

  1. Sheet 1 Data: Save as users.xlsx
  2. Sheet 2 Data: Save as products.xlsx
  3. Controller Logic: Your controller handles the separate imports sequentially.

This approach keeps the import logic clean and allows Laravel Excel to perform its job exactly as intended, ensuring data integrity for each table. Furthermore, adhering to principles of clean code, separating concerns is crucial, much like in building robust applications on Laravel infrastructure.

Strategy 2: Dynamic Import via Iteration (Advanced)

If you absolutely must process a single large file, you need custom logic within your import class to read the header row and dynamically initiate separate imports or model creations for each subsequent block of data. This moves the complexity from the package into your service layer.

Inside your ToModel implementation, instead of returning a single model, you would iterate over the rows, parse the table names defined in the header, and call separate import methods or instantiate models explicitly.

php
class DynamicImport implements ToModel
{
    public function model(array $row)
    {
        // 1. Parse the header row to determine which table this row belongs to.
        $tableName = $row[0]; // Assuming the first column is the table identifier

        // 2. Dynamically instantiate or route based on $tableName
        switch ($tableName) {
            case 'users':
                return new User($row);
            case 'products':
                return new Product($row);
            default:
                throw new \Exception("Unknown table specified.");
        }
    }
}

This pattern requires careful handling of file streams and error checking, which is why many complex data transformations often benefit from dedicated data mappers rather than relying solely on a single import method.

Alternative Packages for Complex Data Mapping

While Laravel Excel is fantastic for straightforward one-to-one mapping, when dealing with highly complex, multi-source imports or heavily relational data structures, you might consider specialized packages that offer more control over the ingestion pipeline:

  1. Laravel DataTables/Fluent: For building user interfaces that manage large datasets imported from various sources.
  2. Custom Queue Jobs: For extremely large files, processing the file asynchronously via queue jobs prevents timeouts and allows for robust error handling when parsing massive Excel streams.

Conclusion

It is technically possible to import data into multiple tables from a single Excel sheet, but it requires shifting the responsibility of multi-table management from the Laravel Excel package itself to your application's service layer. For maximum stability, clarity, and maintainability—especially when dealing with complex relational data—separating large imports into distinct files (Strategy 1) remains the most recommended best practice. By orchestrating these separate imports, you utilize the strengths of Laravel Excel while maintaining clear separation of concerns within your application built on Laravel.