Search code examples
phpexcelphpexcelspreadsheetphpspreadsheet

PhpSpreadSheet: How to save Workbook sheets in individual CSV files


I'm using PhpSpreadSheet and I need to save the sheets contained in a workbook as individual CSV files.

I've tried to use $reader->setLoadAllSheets(); but at the end I always have a single CSV file containing the first sheet of the workbook.

Here's an example of my code:

    $excel = 'excelfile.xlsx';
    $name = 'newCsvName';

    //Read the file
    $reader = new Xlsx();
    $reader->setReadDataOnly(true);
    $reader->setLoadAllSheets();
    $spreadsheet = $reader->load($excel);

    //Write the CSV file
    $writer = new \PhpOffice\PhpSpreadsheet\Writer\Csv($spreadsheet);
    $writer->setDelimiter(";");
    $csvPath = 'csv_files/' . $dir . '/' . $name .'.csv';
    $writer->save($csvPath);

Solution

  • This is how I solved it. I first load every sheet contained into the excel file and then save a new CSV file with the info. I'm sure there should be a better way, but it works fine.

    $excel = 'excelfile.xlsx';
    $name = 'newCsvName';
    $reader = new Xlsx();
    $reader->setReadDataOnly(true);
    
    //Get all sheets in file
    $sheets = $reader->listWorksheetNames($excel);
    
    //Loop for each sheet and save an individual file
    foreach($sheets as $sheet){
       //Load the file
       $spreadsheet = $reader->load($excel);
    
       //Write the CSV file
       $writer = new \PhpOffice\PhpSpreadsheet\Writer\Csv($spreadsheet);
       $writer->setDelimiter(";");
       $csvPath = 'csv_files/' . $dir . '/' . $name.'_'.$sheet.'.csv';
       $writer->save($csvPath);
    }