Estou tentando converter uma série de produtos em um arquivo CSV, mas não parece estar indo como planejado. O arquivo CSV é uma longa linha, aqui está meu código:
for($i=0;$i<count($prods);$i++) {
$sql = "SELECT * FROM products WHERE id = '".$prods[$i]."'";
$result = $mysqli->query($sql);
$info = $result->fetch_array();
}
$header = '';
for($i=0;$i<count($info);$i++)
{
$row = $info[$i];
$line = '';
for($b=0;$b<count($row);$b++)
{
$value = $row[$b];
if ( ( !isset( $value ) ) || ( $value == "" ) )
{
$value = "\t";
}
else
{
$value = str_replace( '"' , '""' , $value );
$value = '"' . $value . '"' . "\t";
}
$line .= $value;
}
$data .= trim( $line ) . "\n";
}
$data = str_replace( "\r" , "" , $data );
if ( $data == "" )
{
$data = "\n(0) Records Found!\n";
}
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=your_desired_name.xls");
header("Pragma: no-cache");
header("Expires: 0");
array_to_CSV($data);
function array_to_CSV($data)
{
$outstream = fopen("php://output", 'r+');
fputcsv($outstream, $data, ',', '"');
rewind($outstream);
$csv = fgets($outstream);
fclose($outstream);
return $csv;
}
Além disso, o cabeçalho não força um download. Estou copiando e colando a saída e salvando como .csv
EDITAR
PROBLEMA RESOLVIDO:
Se alguém estava procurando a mesma coisa, encontre uma maneira melhor de fazer isso:
$num = 0;
$sql = "SELECT id, name, description FROM products";
if($result = $mysqli->query($sql)) {
while($p = $result->fetch_array()) {
$prod[$num]['id'] = $p['id'];
$prod[$num]['name'] = $p['name'];
$prod[$num]['description'] = $p['description'];
$num++;
}
}
$output = fopen("php://output",'w') or die("Can't open php://output");
header("Content-Type:application/csv");
header("Content-Disposition:attachment;filename=pressurecsv.csv");
fputcsv($output, array('id','name','description'));
foreach($prod as $product) {
fputcsv($output, $product);
}
fclose($output) or die("Can't close php://output");
Respostas:
Em vez de escrever valores, considere o uso
fputcsv()
.Isso pode resolver seu problema imediatamente.
fonte
Esta é uma solução simples que exporta uma matriz para uma string csv:
fonte
Tente usar;
Para encerrar cada nova linha em sua saída CSV.
Estou presumindo que o texto está delimitando, mas não está indo para a próxima linha?
Essa é uma constante do PHP. Isso determinará o fim de linha correto de que você precisa.
O Windows, por exemplo, usa "\ r \ n". Eu destruí meu cérebro com aquele quando minha saída não estava quebrando para uma nova linha.
como escrever nova linha unificada em PHP?
fonte
Eu sei que isso é antigo, tive um caso em que precisava que a chave de array fosse incluída no CSV também, então atualizei o script de Jesse Q para fazer isso. Usei uma string como saída, pois implodir não pode adicionar uma nova linha (nova linha é algo que eu adicionei e realmente deveria estar lá).
Observe que isso só funciona com matrizes de valor único
(key, value)
. mas pode ser facilmente atualizado para lidar com multi-dimensional(key, array())
.fonte
No meu caso, meu array era multidimensional, potencialmente com arrays como valores. Então, criei esta função recursiva para explodir a matriz completamente:
Uma vez que os vários níveis de minha matriz não se adaptam bem ao formato CSV simples, criei uma coluna em branco com a chave da submatriz para servir como uma "introdução" descritiva para o próximo nível de dados. Saída de amostra:
Você poderia facilmente remover aquela coluna "intro" (descritiva), mas no meu caso eu tinha cabeçalhos de coluna repetidos, ou seja, inbound_leads, em cada submatriz, de modo que me deu uma pausa / título antes da próxima seção. Remover:
após o is_array () para compactar o código ainda mais e remover a coluna extra.
Como eu queria uma linha de título e uma linha de dados, passo duas variáveis para a função e, após a conclusão da chamada para a função, termino ambas com PHP_EOL:
Sim, eu sei que deixo uma vírgula extra, mas por uma questão de brevidade, não tratei disso aqui.
fonte
Arrays de dados são convertidos no formato csv 'text / csv' pela função php embutida fputcsv cuida de vírgulas, aspas e etc.
Olhe em
https://coderwall.com/p/zvzwwa/array-to-comma-separated -string-in-php
http://www.php.net/manual/en/function.fputcsv.php
fonte
Funcionou para mim
fonte