How to create a csv from a database query and data

7

I was able to create a perfect .xls file, but .csv can not, it follows the code I used to create .xls

$dadosXls  = "";
    $dadosXls .= "  <table border='1' >";
    $dadosXls .= "          <tr>";
    $dadosXls .= "          <th>Nr-Série</th>";
    $dadosXls .= "          <th>Cód-Secret</th>";
    $dadosXls .= "          <th>QtdPontos</th>";
    $dadosXls .= "          <th>DataImpres</th>";
    $dadosXls .= "          <th>Id-Estab</th>";
    $dadosXls .= "          <th>Status</th>";
    $dadosXls .= "          <th>DtaValidadeReg</th>";
    $dadosXls .= "          <th>DataImportacao</th>";
    $dadosXls .= "          <th>IdRegra</th>";
    $dadosXls .= "      </tr>";



    while ($escrever=mysqli_fetch_array($select)){
        $dadosXls .= "      <tr>";
        $dadosXls .= "          <td>".$escrever['nrSerie']."</td>";
        $dadosXls .= "          <td>".$escrever['codSecreto']."</td>";
        $dadosXls .= "          <td>".$escrever['QtdPontos']."</td>";
        $dadosXls .= "          <td>".$escrever['DataImpres']."</td>";
        $dadosXls .= "          <td></td>";
        $dadosXls .= "          <td>".$escrever['Status']."</td>";
        $dadosXls .= "          <td>".$escrever['DtaValidadeReg']."</td>";
        $dadosXls .= "          <td>".$escrever['DataImportacao']."</td>";
        $dadosXls .= "          <td>680</td>";
        $dadosXls .= "      </tr>";
    }
    $dadosXls .= "  </table>";

Thanks for the help.

    
asked by anonymous 10.11.2015 / 14:31

2 answers

4

Csv is a file with comma-separated values, you can create a implode () transform the array ( $escrever ) into a comma-delimited string and use file_put_contents () to write the file. Another output option is to format the header as csv for the browser and echo the string.

Create a file:

$str = "";
while ($escrever = mysqli_fetch_assoc($select)){
    $str .= implode(',', $escrever) .','. PHP_EOL;
}

file_put_contents('dados.csv', $str);

Download csv:

$str = "";
while ($escrever = mysqli_fetch_assoc($select)){
    $str .= implode(',', $escrever) .','. PHP_EOL;
}

header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=dados.csv");
header("Pragma: no-cache");
header("Expires: 0");

echo $str;
    
10.11.2015 / 14:44
1

You can use a similar code. Just remove the tags referring to the table and replace with, (comma). Remember that at the end of each line there should be a \ n "

<?php
    // cabeçalho do csv
    // muitas pessoas gostam de importar csv. e quando fazem isso, gostam
    // de que o nome de cada coluna, para que elas saibam que tipo de informação
    // há ali
    $dadosCsv  = "";
    $dadosCsv .= "Nr-Série,";
    $dadosCsv .= "Cód-Secret,";
    $dadosCsv .= "QtdPontos,";
    $dadosCsv .= "DataImpres,";
    $dadosCsv .= "Id-Estab,";
    $dadosCsv .= "Status,";
    $dadosCsv .= "DtaValidadeReg,";
    $dadosCsv .= "DataImportacao,";
    $dadosCsv .= "IdRegra\n";

    while ($escrever = mysqli_fetch_array($select)) {
        // devemos colocar as strings entre aspas. e um addslashes ajuda 
        // evitar conflitos entre elas
        // as aspas entre colunas também ajuda caso o texto contenha uma virgula
        $dadosCsv .= '"'. addslashes($escrever['nrSerie']).'",';
        $dadosCsv .= '"'.addslashes($escrever['codSecreto']).'",';
        $dadosCsv .= "".addslashes($escrever['QtdPontos']).'",';
        $dadosCsv .= "".addslashes($escrever['DataImpres']).'",';
        $dadosCsv .= '"",';
        $dadosCsv .= '"'.addslashes($escrever['Status']).'",';
        $dadosCsv .= '"'.addslashes($escrever['DtaValidadeReg']).'",';
        $dadosCsv .= '"'.addslashes($escrever['DataImportacao']).'",';
        $dadosCsv .= "680,";
        $dadosCsv .= "\n";
    }

    // exemplo para download do arquivo .csv
    header("Content-type: text/csv");
    header("Content-Disposition: attachment; filename=dados.csv");
    header("Pragma: no-cache");
    header("Expires: 0");

    echo $dadosCsv;
    // fim do arquivo .php

If some text gets a wrong encoding in your file (eg "Secret-Cd") use utf8_encode

// ...
$dadosCsv .= utf8_encode("Nr-Série,");
// ...
$dadosCsv .= '"'.addslashes(utf8_encode($escrever['Status'])).'",';
    
10.11.2015 / 14:42