2009-08-24 176 views
2

我想将我的sql数据转换为csv文件,同时点击一个按钮。我发现的用于CSV到CSV转换的代码段是在PHP中,我试图将它转换为CakePHP,因为我在CakePHP中工作。如何在CakePHP中将mysql表格数据转换为Excel或CSV格式?

这里是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; 
?> 
+0

print_r($ result)在这里非常有用。没有它,我不知道该告诉你什么。 – 2009-08-24 05:42:55

回答

4

首先,你不要在Cake的同一个文件中做查询和输出。您查询的数据像往常一样在控制器,$this->set()结果到视图,并在视图你做这样的事:

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

输出是这样的:

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

由于蛋糕自动换行围绕您的视图布局,您必须set the layout到不同的东西,如'ajax'(这只是一个空的布局)。

+0

其实我不希望在视图中的结果..我希望它被转换为CSV文件.. 只是为了检查值是否正确获得,我做了在控制器的回声。 – Angeline 2009-08-24 09:15:34

+1

你**要**在视图中需要它们。一个视图只是**输出**。你的问题中的脚本,它只是产生**输出**。正如NOSLOW所指出的那样,您只需通过标题更改浏览器如何处理它(页面或文件下载?)。 – deceze 2009-08-24 10:32:06

+0

你是对的..我改变了你说的代码。在控制器中查询并在视图文件中输出csv格式的结果以及标题。现在我可以在excel文件中获得所需的输出结果。感谢您的指导。 – Angeline 2009-08-25 04:53:20

1

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

我使用它,它运作良好。

+0

你..你是对的..因为我只在一个地方做csv下载,我没有去csv助手..感谢您的支持。 – Angeline 2009-08-25 04:54:30

相关问题