2

I am trying to import an excel file with 150+ sheets inside it, then by checking the excel sheet name, I want to replace the data inside or add new rows.

Initially I thought of using view to manually make all the design myself and just export them but it would be time consuming.

This is what I currently have.


<?php

namespace App\Http\Controllers;

use App\Imports\FirstSheetImport;
use App\Imports\WorkingPaperImport;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;

class WorkingPaperExportController extends Controller
{
    public function getExcelAndRewrite(Request $request)
    {
        $import = new FirstSheetImport('EA1');

        $modifiedData = $import->getModifiedData();

        return $modifiedData;
    }
}
<?php

namespace App\Imports;

use App\Exports\TestExportEA1;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithStartRow;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Events\AfterImport;
use PhpOffice\PhpSpreadsheet\IOFactory;

class FirstSheetImport implements ToCollection, WithHeadingRow
{
    protected $sheetName;
    protected $sheetIndex;
    protected $modifiedData = [];

    public function __construct($sheetName)
    {
        $this->sheetName = $sheetName;
    }

    public function collection(Collection $collection)
    {
        //
    }

    protected function getFilePath()
    {
        // Provide the path to your Excel file
        return storage_path('/import/uptodateworkingpaper.xlsx');
    }

    protected function hasHeadingRow()
    {
        // Return true or false based on your needs
        return true;
    }

    public function getModifiedData()
    {
        $spreadsheet = IOFactory::load($this->getFilePath());
        $sheetNames = $spreadsheet->getSheetNames();

        $sheetIndex = array_search($this->sheetName, $sheetNames);

        $this->sheetIndex = $sheetIndex;
        if ($sheetIndex !== false) {
            $worksheet = $spreadsheet->getSheet($sheetIndex);
            $rows = $worksheet->toArray();

            return $rows;
        }
        // return $this->sheetIndex;
    }
}

With the functions I have now., I am able to get the correct worksheet data but I am not sure where to go from there. Not even sure if this is a good way.

Any help or suggestions is appreciated.

PHP 7.3.33 Laravel Framework 8.75.0

2
  • 1
    You could use a package like DOMPdf or just use PHP's fgetcsv() and fputcsv() methods Commented Dec 22, 2023 at 10:13
  • Thanks. I managed to get it working using PHPSpreadsheet. Commented Dec 28, 2023 at 7:41

1 Answer 1

2

If anyone else needs help, this is working for me.

<?php

namespace App\Http\Controllers;

use App\Imports\FirstSheetImport;
use App\Imports\WorkingPaperImport;
use App\Models\Project;
use App\Models\WorkSheet;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Maatwebsite\Excel\Facades\Excel;

use PhpOffice\PhpSpreadsheet\Reader\Xlsx as ReaderXlsx;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as WriterXlsx;

class WorkingPaperExportController extends Controller
{
    public function projectWorkingPaper(Request $request)
    {
        $data = $request->only('project_id');

        $rules = [
            'project_id' => 'required|exists:project_has_schedules,project_id',
        ];

        $validator = Validator::make($data, $rules);

        if ($validator->fails()) {
            return response()->json(['message' => $validator->errors()], 400);
        }

        $project = Project::with('masterSchedules')->find($data['project_id']);

        $activeSchedules = [];

        foreach ($project['masterSchedules'] as $schedule) {
            $activeSchedules[] = $schedule['id'];
        }

        $workSheetSymbols = [];

        foreach ($activeSchedules as $schedule_id) {
            $groupedSchedules = WorkSheet::where('schedule_id', $schedule_id)->get();

            foreach ($groupedSchedules as $individialSchedule) {
                $workSheetSymbols[] = $individialSchedule['symbol'];
            }
        }

        if ($workSheetSymbols) {

            // read the excel file here
            $templatePath = storage_path('app/template/workingpaper.xlsx');

            $reader = new ReaderXlsx();

            $spreadsheet = $reader->load($templatePath);

            $sheetNames = $spreadsheet->getSheetNames();

            $sheetIndex = array_search($workSheetSymbols[0], $sheetNames);                                                                                                                                                                                                                                           

            if ($sheetIndex !== false) {
                // get the desired worksheet
                $worksheet = $spreadsheet->getSheetByName($workSheetSymbols[0]);
                // add/change values accordingly
                $worksheet->setCellValue('Q10', '500250');

                $writer = new WriterXlsx($spreadsheet);

                $newFileName = 'hello.xlsx';
                $savePath = storage_path("app/workingpaper/{$newFileName}");
                $writer->save($savePath);

                return response()->download($savePath);
            }
        } else {
            return response()->json(['message' => 'No schedules found!'], 500);
        }
    }
}

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.