puiu91
5/3/2016 - 4:21 PM

PHP - CSV Export Class

PHP - CSV Export Class

<?php

    /**
     * Creates a URI string containing CSV data which can be used in an HTML <a href=""> tag to export a CSV file
     * to the client.
     *
     * @param array      $data
     * @param array|null $columnNames
     *
     * @return string
     * @throws \App\Helpers\Exception
     */
    public static function createURI(array $data, array $columnNames = null)
    {
        if (empty($data)) throw new Exception('provided array was empty');

        ob_start();
        $stream = fopen('php://output', 'w') or die ('Cannot open php://output');
        if ($columnNames) fputcsv($stream, $columnNames);
        foreach ($data as $row) fputcsv($stream, $row);
        fclose($stream) or die('Cannot close php://output');

        return rawurlencode(ob_get_clean());
    }
    
        public static function uri(array $data, array $columnNames = null)
    {
        if (empty($data)) throw new Exception('provided array was empty');

        ob_start();
        $stream = fopen('php://output', 'w') or die ('cannot open php://output');

        // write header row
        if ($columnNames) fputcsv($stream, $columnNames);

        // write data rows
        foreach ($data as $row) {
            fputcsv($stream, $row);
        }

        fclose($stream) or die('cannot close php://output');
        $output = ob_get_clean();

        return rawurlencode($output);
    }
<?php

namespace App\Helpers;

/**
 * Class Export
 * @package App\Helpers
 */
final class ExportCSV
{
    /**
     * Exports an array of data to a CSV file.
     *
     * @param array      $data
     * @param array|null $columnNames
     *
     * @return void
     * @throws \App\Helpers\Exception
     */
    public static function toFile(array $data, array $columnNames = null)
    {
        if (empty($data)) {
            throw new Exception('provided array was empty');
        }

        // redirect output to client’s web browser
        header('Content-Type: application/csv'); // can also be text/csv
        header('Content-Disposition: attachment;filename=results-' . time() . '.csv');

        // open the output stream
        $file = fopen('php://output', 'w') or die ('Cannot open output buffer');

        // write column names
        if (null !== $columnNames) {
            fputcsv($file, $columnNames);
        }

        // write data array
        foreach ($data as $row) {
            fputcsv($file, $row);
        }

        // release buffer
        fclose($file) or die('Cannot close output buffer or file');
    }

    /**
     * Creates a URI string containing CSV data which can be used in an HTML <a href=""> tag to export a CSV file
     * to the client.
     *
     * @param array      $data
     * @param array|null $columnNames
     *
     * @return void
     */
    public static function createURI(array $data, array $columnNames = null)
    {
        $uri = null;

        // prepare column header
        if (null !== $columnNames) {
            $uri .= self::prepareCSVRow($columnNames);
        }

        // prepare column data
        foreach ($data as $row) {
            $uri .= self::prepareCSVRow($row);
        }

        return rawurlencode($uri);
    }

    /**
     * Takes an array of data and returns a comma delimited string of data enclosed by double quotes.
     *
     * @param array $row
     *
     * @return string
     */
    public static function prepareCSVRow(array $row)
    {
        return implode(',', array_map(function ($el) {
            return chr(34) . $el . chr(34);
        }, $row)) . PHP_EOL;
    }
}