Как преобразовать данные таблицы MySQL в формат Excel или CSV в CakePHP? - PullRequest
2 голосов
/ 24 августа 2009

Я хочу преобразовать свои данные sql в файлы csv, нажимая на кнопку. Фрагменты кода, которые я нашел для преобразования sql в CSV, были на PHP, и я пытаюсь преобразовать его в CakePHP, так как я работаю в CakePHP.

Вот код PHP, который я пытаюсь преобразовать:

$result = mysql_query("SHOW COLUMNS FROM ".$table."");
$i = 0;
if (mysql_num_rows($result) > 0) {
   while ($row = mysql_fetch_assoc($result)) {
        $csv_output .= $row['Field']."; ";
        $i++;
   }
}
$csv_output .= "\n";

$values = mysql_query("SELECT * FROM ".$table."");
while ($rowr = mysql_fetch_row($values)) {
    for ($j=0;$j<$i;$j++) {
           $csv_output .= $rowr[$j]."; ";
    }
    $csv_output .= "\n";
}

$filename = $file."_".date("Y-m-d_H-i",time());
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: csv" . date("Y-m-d") . ".csv");
header( "Content-disposition: filename=".$filename.".csv");
print $csv_output;

РЕШЕНИЕ

Функция в контроллере:

function exporttocsv()
{       
 $this->set('headers',$this->Result->find('all',array('fields'=>'Result.label')));
 $this->set('values',$this->Result->find('all',array('fields'=>'Result.value')));       
}

файл exporttocsv.ctp:

<?php

foreach($headers as $header):

     $csv_output .=$header['Result']['label'].", ";

endforeach;
$csv_output .="\n";

if(!empty($values)){
foreach($values as $value):

     $csv_output .=$value['Result']['value'].", ";

endforeach;
$csv_output .="\n";
}
else{
echo "There is no data to export.";
}

$filename = "export_".date("Y-m-d_H-i",time());
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: csv" . date("Y-m-d") . ".csv");
header("Content-disposition: filename=".$filename.".csv");

print $csv_output;

exit;
?>

Ответы [ 2 ]

4 голосов
/ 24 августа 2009

Прежде всего, вы не делаете запросы и выводите в одном файле в Cake. Вы запрашиваете данные как обычно в Controller, $this->set() результат для представления, и в представлении вы делаете что-то вроде этого:

foreach ($results as $result) {
    echo join(', ', $result['COLUMNS']);
    echo "\n";
}

Выводит что-то вроде этого:

value, varchar(25), NO, , ,
submitter, int(11), NO, , ,
...

Так как Cake автоматически оборачивает макет вокруг вашего вида, вам нужно установить макет на что-то другое, например 'ajax' (который просто пустой макет).

1 голос
/ 24 августа 2009

deceze правильно выводить результаты из файла представления. Вам просто нужно установить некоторые заголовки, чтобы они отображались как загрузка файла на стороне клиента. Вы можете просто поместить эти 2 вызова в верхней части вашего обзора:

header("Content-type:application/vnd.ms-excel");
header("Content-disposition:attachment;filename=\"{$filename}\"" );

Если вы планируете загружать CSV-файлы более чем в одном месте приложения, я бы порекомендовал этого помощника:

http://bakery.cakephp.org/articles/view/csv-helper-php5

Я использую его, и он хорошо работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...