La función de exportación de matriz a CSV enfrenta un problema en el complemento de WordPress

3 minutos de lectura

avatar de usuario
chakraborty

Estoy usando una función simple de exportación de matriz a CSV en mi página de complemento para generar un informe.

Cuando estoy ejecutando este código, recibo un error que indica que exportará todo el contenido html junto con mi matriz esperada.

Aquí está mi código:

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', ',');

  • No recibo un error cuando ejecuto este código. Descargué el csv como se esperaba.

    – Rasclat

    23 de abril de 2015 a las 7:18

  • cuando estoy ejecutando este código en mi entorno de complemento en WordPress, obtengo csv que muestra todo el código html con la lista

    – dipanjan chakraborty

    23 de abril de 2015 a las 8:30

  • El código se ejecuta como se esperaba para mí y se descarga un archivo csv. Agregue información sobre el complemento y la versión de WordPress para ayudarnos a resolver esto.

    – geeves

    18 de noviembre de 2016 a las 16:12

  • ¿Tiene algún tipo de depuración habilitada (WP_DEBUG establecido en verdadero, o XDebug)? Si es así, eso podría contribuir a que HTML extraño se procese con su archivo CSV.

    –Paul Wenzel

    15 mayo 2018 a las 19:12

Supongo que WP continúa con sus operaciones normales después de llamar a esta función, por lo que obtendrá la salida de la plantilla HTML después del CSV. poner en un exit declaración después fpassthru debería hacerlo, pero debe tener cuidado de que esto no arruine nada más que WordPress hace al final de cada respuesta de página. Drupal por ejemplo tiene un drupal_exit() función solo para este propósito. No estoy lo suficientemente familiarizado con WP para estar seguro, pero la documentación para el función wp_die() sugiere que puedes usar PHP exit sin demasiados problemas

avatar de usuario
Manoj Swami

Puede usar este código para generar un archivo de Excel con extensión .xlsx

<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>

Este código me funciona…

Pruebe esto en la parte superior de la función de exportación.

    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');

La forma más sencilla de generar csv sin guardar el archivo en el servidor

<?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);
    }
}

¿Ha sido útil esta solución?