Friday, May 22, 2026Today's Paper

Omni Apps

How to Convert PHP Excel to CSV and CSV to Excel: The Ultimate Developer's Guide
May 21, 2026 · 12 min read

How to Convert PHP Excel to CSV and CSV to Excel: The Ultimate Developer's Guide

Master PHP Excel to CSV and CSV to Excel conversions. Learn to use PhpSpreadsheet, native PHP streams, and OpenSpout for low-memory, lightning-fast conversions.

May 21, 2026 · 12 min read
PHPWeb DevelopmentData Processing

The Mechanics of Spreadsheet Formats: Excel vs. CSV

To build robust, production-grade applications, we must first understand the fundamental structural differences between Excel and CSV files. Developers often look for a quick script to handle excel to csv php transformations without fully appreciating the memory overhead and architectural differences between these formats.

Excel File Architecture (.xlsx and .xls)

Modern Excel files (.xlsx) are not simple binary dumps. They are actually compressed ZIP archives adhering to the Office Open XML (OOXML) standard. If you change the file extension of any .xlsx file to .zip and extract it, you will find a complex directory structure containing:

  • [Content_Types].xml: Dictates the content types of the files in the archive.
  • _rels/: Folder containing relationships between the workbook, worksheets, and styles.
  • xl/workbook.xml: Defines the sheets and overall structure.
  • xl/styles.xml: Houses all typography, borders, backgrounds, and conditional formatting rules.
  • xl/sharedStrings.xml: To optimize file size, Excel saves unique text strings in a shared table and refers to their index inside individual worksheet cells.

Because of this deeply nested, zipped XML structure, reading an Excel file in PHP is a highly intensive computational process. The parser must unzip the container, parse multiple XML files, map cell relationships, cross-reference shared string tables, and instantiate PHP memory models for every single cell.

CSV File Architecture (.csv)

A Comma-Separated Values (.csv) file is the antithesis of Excel. It is a completely flat, non-compressed, plain text file. It contains no styling, no cell merges, no calculation sheets, and no shared strings. Data is structured sequentially:

  • Rows are separated by standard line endings (\n or \r\n).
  • Fields within a row are separated by a delimiter (commonly ,, ;, or \t for tab-separated files).
  • Fields containing the delimiter character are wrapped in an enclosure (usually double quotes ").

Because CSV files are flat text, PHP can read and write them using negligible memory. Transforming php excel to csv is fundamentally a process of unzipping the Excel archive, discarding the stylistic metadata, resolving the cell values, and writing them sequentially to a clean text stream.


Choosing the Right Modern PHP Tooling

To execute your php csv to excel and Excel-to-CSV pipelines, selecting the right library is vital. In modern PHP, you should avoid legacy libraries like PHPExcel. Instead, leverage these three options:

1. PhpSpreadsheet

Developed and actively maintained by the PHPOffice group, PhpSpreadsheet is the standard library for spreadsheet manipulation in PHP. It supports reading and writing a vast array of formats: XLSX, XLS, CSV, ODS, HTML, PDF, and XML.

  • Pros: Incredibly feature-rich. Supports formula calculation, border styling, fonts, automatic column width sizing, sheet merging, and file-type auto-detection.
  • Cons: Extremely heavy memory footprint. It holds the entire spreadsheet object graph in memory. A moderately complex workbook containing 50,000 cells can easily trigger "Memory Limit Exceeded" errors in standard configurations.

2. OpenSpout

An excellent community-driven fork of the discontinued box/spout project, OpenSpout is a high-performance, developer-friendly library designed specifically to read and write spreadsheet formats (CSV, XLSX, ODS) via streaming.

  • Pros: Low and constant memory footprint. It reads and writes spreadsheet files sequentially row-by-row. Processing a file with 1,000,000 rows requires less than 10MB of RAM.
  • Cons: Highly limited formatting. You cannot easily style individual cells, merge blocks, read complex formatting templates, or evaluate formulas.

3. Native PHP Streams (fgetcsv and fputcsv)

PHP comes built-in with direct mechanisms to handle CSV streams.

  • Pros: Extremely fast. No external packages or dependencies required.
  • Cons: Does not support XLSX/XLS binary or XML structures. To read Excel files, you must use an external parser.

Step-by-Step Guide: PHP Excel to CSV Using PhpSpreadsheet

For most standard file sizes (under 10,000 rows), PhpSpreadsheet is the most reliable tool to handle php excel to csv pipelines. Here is how to install the package and write an optimized class to perform conversions:

First, install the library using Composer:

composer require phpoffice/phpspreadsheet

Now, let's create a robust helper class ExcelConverter to handle the conversion:

<?php
declare(strict_types=1);

namespace App\Services;

use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Writer\Csv;
use InvalidArgumentException;
use Exception;

class ExcelConverter
{
    /**
     * Converts an Excel file (.xlsx or .xls) to a CSV file.
     *
     * @param string $inputExcelPath Absolute path to the Excel file.
     * @param string $outputCsvPath Absolute path to the output CSV.
     * @param string|null $sheetName Optional sheet name to target. Defaults to active sheet.
     * @param string $delimiter The delimiter character to use in the CSV.
     * @return bool Returns true if the conversion was successful.
     * @throws InvalidArgumentException When file paths are invalid.
     */
    public function convertExcelToCsv(
        string $inputExcelPath,
        string $outputCsvPath,
        ?string $sheetName = null,
        string $delimiter = ','
    ): bool {
        if (!file_exists($inputExcelPath)) {
            throw new InvalidArgumentException("Excel file does not exist at: {$inputExcelPath}");
        }

        try {
            // Load the spreadsheet structure using automatic file format detection
            $spreadsheet = IOFactory::load($inputExcelPath);

            // Select a specific sheet if specified, otherwise utilize the active sheet
            if ($sheetName !== null) {
                $sheet = $spreadsheet->getSheetByName($sheetName);
                if ($sheet === null) {
                    throw new Exception("The worksheet named '{$sheetName}' does not exist.");
                }
                $spreadsheet->setActiveSheetIndex($spreadsheet->getIndex($sheet));
            }

            // Instantiate the specialized CSV Writer
            $writer = new Csv($spreadsheet);

            // Configure CSV-specific parameters
            $writer->setDelimiter($delimiter);
            $writer->setEnclosure('"');
            $writer->setLineEnding("\r\n");
            $writer->setSheetIndex($spreadsheet->getActiveSheetIndex());

            // Save the compiled spreadsheet content to disk
            $writer->save($outputCsvPath);

            // Crucial: Free references to worksheets to allow garbage collection
            $spreadsheet->disconnectWorksheets();
            unset($spreadsheet, $writer);

            return true; 
        } catch (Exception $e) {
            // Log exceptions cleanly according to your production system guidelines
            error_log("Excel to CSV conversion failed: " . $e->getMessage());
            return false;
        }
    }
}

Key Technical Aspects of this Script:

  1. IOFactory::load(): Programmers often manually instantiate specific reader classes like new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(). Using IOFactory::load() is safer and cleaner, as it automatically checks the file's binary magic numbers to determine the format, letting your app support legacy .xls, modern .xlsx, and open-source .ods worksheets simultaneously.
  2. Sheet Isolation: Remember that Excel files support multiple workbooks (tabs), whereas a CSV file is single-sheet. If you convert an Excel file with three tabs directly without specifying a sheet index, PhpSpreadsheet will output only the default active tab.
  3. Garbage Collection: Always call $spreadsheet->disconnectWorksheets() and unset the variables if processing spreadsheets inside loops or long-running tasks. This prevents PHP memory leaks that can cause performance degradation.

Step-by-Step Guide: PHP CSV to Excel Using PhpSpreadsheet

The reverse pipeline, converting php csv to excel, is common when users demand high-quality, readable spreadsheets containing color headers, auto-adjusted columns, and distinct data types instead of plain text CSV.

Here is a full implementation to parse CSV and construct a beautifully styled Excel workbook:

<?php
declare(strict_types=1);

namespace App\Services;

use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\Fill;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use InvalidArgumentException;
use Exception;

class CsvToExcelConverter
{
    /**
     * Converts a CSV file into a styled, modern XLSX Excel document.
     */
    public function convertCsvToXlsx(string $inputCsvPath, string $outputXlsxPath): bool
    {
        if (!file_exists($inputCsvPath)) {
            throw new InvalidArgumentException("Input CSV file does not exist.");
        }

        try {
            // 1. Configure the CSV Reader
            $reader = IOFactory::createReader('Csv');
            $reader->setInputEncoding('UTF-8');
            $reader->setDelimiter(',');
            $reader->setEnclosure('"');

            // 2. Load the CSV contents into memory
            $spreadsheet = $reader->load($inputCsvPath);
            $sheet = $spreadsheet->getActiveSheet();

            // 3. Apply Professional Sheet Styling
            $highestColumn = $sheet->getHighestColumn();
            $highestRow = (int) $sheet->getHighestRow();

            if ($highestRow > 0) {
                $headerRange = "A1:{$highestColumn}1";

                // Format the header: bold text, dark blue fill, and centered text
                $sheet->getStyle($headerRange)->applyFromArray([
                    'font' => [
                        'bold' => true,
                        'color' => ['rgb' => 'FFFFFF'],
                        'size' => 11,
                    ],
                    'fill' => [
                        'fillType' => Fill::FILL_SOLID,
                        'startColor' => ['rgb' => '1F4E78'], // Dark executive blue
                    ],
                    'alignment' => [
                        'horizontal' => Alignment::HORIZONTAL_CENTER,
                    ]
                ]);
            }

            // 4. Auto-fit column widths so no data is truncated or clipped
            // We iterate through all column dimensions present in the spreadsheet
            foreach (range('A', $highestColumn) as $columnID) {
                $sheet->getColumnDimension($columnID)->setAutoSize(true);
            }

            // 5. Initialize the modern XLSX Excel Writer and save
            $writer = new Xlsx($spreadsheet);
            $writer->save($outputXlsxPath);

            // Clean up resources
            $spreadsheet->disconnectWorksheets();
            unset($spreadsheet, $writer);

            return true;
        } catch (Exception $e) {
            error_log("CSV to Excel conversion error: " . $e->getMessage());
            return false;
        }
    }
}

Setting Custom Column Widths and Types Dynamically

While importing csv to excel php files, you can map cell formatting dynamically depending on columns. This prevents Excel from displaying numeric values incorrectly:

  • Preserving Leading Zeros: Phone numbers or postcodes like 00342 are often formatted as standard integers in Excel, removing the leading zeros. Force them to show up as text strings:
    $sheet->getStyle('B2:B500')->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_TEXT);
    
  • Setting Currencies: Format pricing columns securely using standard localized currency rules:
    $sheet->getStyle('D2:D500')->getNumberFormat()->setFormatCode('$#,##0.00');
    

High-Performance Streaming with OpenSpout (Solving the Memory Crisis)

If you have ever attempted to parse a CSV with 150,000 rows using PhpSpreadsheet, you have likely seen this output: Fatal error: Allowed memory size of X bytes exhausted

This is where OpenSpout is critical. It processes documents sequentially in an active file stream, storing minimal data in RAM.

Install it via Composer:

composer require openspout/openspout

Here is a full implementation to stream a massive Excel sheet to CSV memory-efficiently:

<?php
declare(strict_types=1);

namespace App\Services;

use OpenSpout\Reader\XLSX\Reader;
use OpenSpout\Writer\CSV\Writer;

class StreamSpreadsheetConverter
{
    /**
     * Converts large Excel spreadsheets to CSV with constant memory footprint.
     */
    public function convertXlsxToCsvStream(string $excelPath, string $csvPath): void
    {
        $reader = new Reader();
        $writer = new Writer();

        // Open active stream connections to both files
        $reader->open($excelPath);
        $writer->openToFile($csvPath);

        // Process only the first sheet worksheet to make it standard CSV behavior
        foreach ($reader->getSheetIterator() as $sheet) {
            if ($sheet->getIndex() !== 0) {
                continue; 
            }

            foreach ($sheet->getRowIterator() as $row) {
                // OpenSpout handles internal row validation and conversions
                // It writes data straight to output stream, discarding past rows from RAM
                $writer->addRow($row);
            }
        }

        // Close file handles and release stream resources safely
        $reader->close();
        $writer->close();
    }
}

This streaming conversion takes almost identical resource overhead for a 500-row file and a 5,000,000-row file, making it perfect for cloud architecture deployment where system parameters are highly restricted.


Solving Crucial Edge Cases & Security in Production

When handling programmatic spreadsheet manipulation inside real production environments, you will face complex technical bugs that general code snippets ignore.

1. UTF-8 BOM: Resolving Garbled Text in Microsoft Excel

When you generate a raw CSV file from PHP, you might open it in TextEdit or VS Code and find that it displays perfect multi-language text (such as German umlauts or accented French names). However, opening this exact CSV inside Microsoft Excel will display garbled text (like "Mélange").

Excel assumes CSV files are formatted in Windows-1252 or ASCII unless they contain a specific three-byte binary sequence at the very beginning of the stream: the Byte Order Mark (BOM). To resolve this, prepend the UTF-8 BOM \xEF\xBB\xBF to your file handle before writing any other text:

// Writing CSV with UTF-8 BOM natively in PHP
$handle = fopen('export.csv', 'w');
fwrite($handle, "\xEF\xBB\xBF"); // Prepend the UTF-8 BOM
fputcsv($handle, ['ID', 'Name', 'Location']);
fputcsv($handle, ['1', 'René', 'Montréal']);
fclose($handle);

Using PhpSpreadsheet, simply configure the Writer to use BOM:

$writer = new \PhpOffice\PhpSpreadsheet\Writer\Csv($spreadsheet);
$writer->setUseBOM(true); // Automatically inserts the BOM

2. Safeguarding Against CSV/Formula Injection

Security is often neglected during data export design. If your system enables admin users to export user-provided strings into a CSV spreadsheet, malicious actors can exploit a vulnerability known as CSV Injection (Formula Injection).

If a user enters their name during sign-up as: =cmd|' /C calc'!A0

When an administrative user downloads the CSV profile export and opens it in Microsoft Excel, Excel identifies the leading = character and attempts to execute the calculation command. This can result in system command execution on the administrator's PC.

To shield your application from this exploit, sanitize all text-based fields that start with trigger calculation characters (=, +, -, @, \t, \r):

function safeCsvValue(mixed $value): string
{
    if (is_numeric($value)) {
        return (string) $value;
    }

    $value = (string) $value;
    $triggers = ['=', '+', '-', '@', "\t", "\r"];

    if (in_array(substr($value, 0, 1), $triggers, true)) {
        // Prepending a single quote instructs Excel to render this as static literal text
        return "'" . $value;
    }

    return $value;
}

FAQ: Frequently Asked Questions

Why does my PHP excel to csv converter script run out of memory?

Standard parser libraries like PhpSpreadsheet load the complete Excel workbook into system RAM, allocating object states to all individual cells. Large workbooks can quickly exceed default server limits. To solve this, implement streaming conversion architectures using OpenSpout, which processes data on-the-fly, keeping the memory allocation below 10MB.

How do I convert csv to excel php without utilizing external libraries?

You can construct rudimentary XML spreadsheets or HTML-based structures that open inside Excel without external libraries. However, compiling modern XML-zipped structures (.xlsx) natively in PHP is incredibly complex. For native, dependency-free code, outputting a standard CSV with a UTF-8 BOM (\xEF\xBB\xBF) is the most reliable approach, as Excel reads clean CSVs natively.

What is the difference between PHPExcel and PhpSpreadsheet?

PHPExcel is deprecated and has not been maintained for several years. It lacks support for modern versions of PHP (PHP 8.2 and above). PhpSpreadsheet is the modern, rewritten successor designed for performance, compatibility, and safety. You should migrate all legacy systems away from PHPExcel immediately.

Why do large integers (like tracking numbers) change to scientific notation in Excel?

Excel automatically reformats numbers with more than 11 digits to scientific notation (e.g., 4.56E+11). To avoid this during conversion, set the column formatting explicitly to text string mode in your writer configuration, or prepend a single quote (') to force Excel to treat the cell purely as standard text.


Conclusion

Managing conversions between spreadsheet files is simple when you have the right architecture. Using PhpSpreadsheet, you can achieve highly-stylized and executive-ready csv to excel php sheets. For performance-focused, high-capacity backend queues handling thousands of rows, choosing streaming tools like OpenSpout prevents memory overhead issues.

Integrate CSV injection sanitization and apply correct UTF-8 BOM encoding so your data looks flawless on any platform.

Related articles
How to Export Excel in Laravel: The Ultimate High-Performance Guide
How to Export Excel in Laravel: The Ultimate High-Performance Guide
Learn how to export Excel in Laravel 8 through modern versions. Master high-performance chunking, styled Blade views, imports, and queue-based background tasks.
May 22, 2026 · 11 min read
Read →
SVG Code to PNG Online: Convert Vector Markup to Images Instantly
SVG Code to PNG Online: Convert Vector Markup to Images Instantly
Need to convert SVG code to png online? Learn how to turn raw XML markup into high-quality PNG images instantly with our comprehensive guide and tools.
May 22, 2026 · 13 min read
Read →
Image Color Picker Chrome: How to Grab Hex Codes Instantly
Image Color Picker Chrome: How to Grab Hex Codes Instantly
Looking for an image color picker in Chrome? Discover the best native shortcuts, free extensions, and developer hacks to grab HEX codes from any image.
May 22, 2026 · 10 min read
Read →
How to Convert SVG to Transparent Background: The Complete Guide
How to Convert SVG to Transparent Background: The Complete Guide
Learn how to convert SVG to transparent background files. Step-by-step methods to convert SVG to PNG, PNG to SVG, and ICO using ImageMagick, Illustrator, and Inkscape.
May 22, 2026 · 11 min read
Read →
SVG Image to PNG: How to Convert Vector to Raster (and Vice Versa)
SVG Image to PNG: How to Convert Vector to Raster (and Vice Versa)
Learn how to convert an SVG image to PNG without losing quality, scale vector graphics for high-res output, and turn PNGs into SVGs using professional tools.
May 22, 2026 · 12 min read
Read →
WebP to GIF Bulk Converter Guide: Fast, Free Batch Methods
WebP to GIF Bulk Converter Guide: Fast, Free Batch Methods
Need to convert multiple WebP images at once? Learn how to use a webp to gif bulk tool, run powerful command-line scripts, or automate with Python Pillow.
May 22, 2026 · 12 min read
Read →
Find and Replace Text Editor: The Ultimate Guide for Creators
Find and Replace Text Editor: The Ultimate Guide for Creators
Struggling with tedious text updates? Discover the best desktop and online find and replace text editor options, complete with a powerful RegEx guide.
May 22, 2026 · 12 min read
Read →
Reverse Geo IP Lookup: How It Works, Use Cases & Best APIs
Reverse Geo IP Lookup: How It Works, Use Cases & Best APIs
Learn how reverse geo ip lookup bridges the gap between digital IP addresses and physical locations. Explore use cases, mechanics, APIs, and privacy compliance.
May 22, 2026 · 15 min read
Read →
PNG to SVG Path Online: Convert, Generate & Extract Vector Paths
PNG to SVG Path Online: Convert, Generate & Extract Vector Paths
Convert PNG to SVG path online with ease. Learn how to generate clean vector path code from raster images, extract path data, and reverse the process.
May 22, 2026 · 11 min read
Read →
HTTP Password Generator Guide: Web, Browser, and Apache Security
HTTP Password Generator Guide: Web, Browser, and Apache Security
Looking for a secure HTTP password generator? Discover how web-based tools, Safari and Mozilla browser utilities, and Apache htpasswd generators keep you safe.
May 22, 2026 · 13 min read
Read →
Related articles
Related articles