Array-to-CSV-export function is facing an issue in WordPress-plugin

I am using a simple array-to-CSV-export function in my plugin page for generating a report .

When I am running this code I am getting an error that it will export whole html content along with my expected array.

Read More

Here is my code:

function convert_to_csv($input_array, $output_file_name, $delimiter)
{
    clearstatcache();
    /** open raw memory as file, no need for temp files */
    $temp_memory = fopen('php://memory', 'w');
    /** loop through array  */



    foreach ($input_array as $line) {
        /** default php csv handler **/
        fputcsv($temp_memory, $line, $delimiter);
    }

    //echo '<pre>';
    //print_r($temp_memory); exit;
    /** rewrind the "file" with the csv lines **/
    fseek($temp_memory, 0);
    /** modify header to be downloadable csv file **/
    header('Content-Type: application/csv');
    header('Content-Disposition: attachement; filename="' . $output_file_name . '";');
    /** Send file to browser for download */
    fpassthru($temp_memory);
}

/** Array to convert to csv */

$array_to_csv = Array(
    Array(12566,
        'Enmanuel',
        'Corvo'
    ),
    Array(56544,
        'John',
        'Doe'
    ),
    Array(78550,
        'Mark',
        'Smith'
    )

);

clearstatcache();

convert_to_csv($array_to_csv, 'report.csv', ',');

Related posts

Leave a Reply

4 comments

  1. I’m guessing that WP is carrying on with its normal operations after this function is called so you’ll get the HTML template output after the CSV. Putting in an exit statement after fpassthru should do it, but you need to be careful that this doesn’t mess up anything else that WordPress does at the end of each page response. Drupal for example has a drupal_exit() function for just this purpose. I’m not familiar enough with WP to know for sure, but the documentation for the wp_die() function suggests that you can use PHP exit without too many problems

  2. You can use this code to generate excel file with .xlsx extension

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://cdn.jsdelivr.net/alasql/0.3/alasql.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.7.12/xlsx.core.min.js"></script>
    
    <script type="text/javascript">
        $(document).ready(function() {
        var insuranceArray = new Array(insuranceInfo);
        var bills = db.bills;
    
        //Create tabs in excel file
        var opts = [{sheetid:'Insurance Information',header:true},{sheetid:'bills Info',header:false}];
    
        alasql('SELECT * INTO XLSX("Data.xlsx",?) FROM ?', [opts, insuranceArray,bills]]);
    
        // Close the window once you save the file
        window.onfocus=function(){ 
            window.close();
        }
    </script>
    

    This code works for me…

  3. Try this at the top of the export function.

        global $wpdb;
        $wpdb->hide_errors();
        @set_time_limit(0);
        if ( function_exists( 'apache_setenv' ) )
            @apache_setenv( 'no-gzip', 1 );
        @ini_set('zlib.output_compression', 0);
    
        //@ob_clean();
        @ob_end_clean(); // to prevent issue that unidentified characters when opened in MS-Excel in some servers
    
    
            header( 'Content-Type: text/csv; charset=UTF-8' );
            header( 'Content-Disposition: attachment; filename=export.csv' );
            header( 'Pragma: no-cache' );
            header( 'Expires: 0' );
    
            $fp = fopen('php://output', 'w');
    
  4. Most simplest way to generate csv without saving the file on the server

    <?php
    $array = Array(
        Array(
            12566,
            'Enmanuel',
            'Corvo'
        ),
        Array(
            56544,
            'John',
            'Doe'
        ),
        Array(
            78550,
            'Mark',
            'Smith'
        )
        
    );
    arr_to_csv($array);
    function arr_to_csv($array)
    {
        header("Content-type: application/csv");
        header("Content-Disposition: attachment; filename=test.csv");
        $fp = fopen('php://output', 'w');
        foreach ($array as $row) {
            fputcsv($fp, $row);
        }
    }