在我的一个ModelAdmin标签中,我有一个包含JSON编码数据的列,我希望将其转换为CSV表并导出。我见过的大多数问题都是直接从表中导出数据行,但是在将数据转换为CSV表进行导出之前,如何先从其中一列中提取数据呢。
任何想法都将不胜感激。
答案 0 :(得分:0)
当您使用PHP并希望以CSV格式输出时,您应该做的第一件事就是将JSON转换为Array。然后,您可以使用一些PHP函数将结果提示为CSV。我们的代码:
$arr = json_decode($jsonInput, true);
if(empty($arr)) {
die("INVALID JSON");
}
$filename = "your-filename.csv";
$now = gmdate("D, d M Y H:i:s");
header("Expires: $now GMT");
header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
header("Last-Modified: {$now} GMT");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/csv");
header("Content-Disposition: attachment;filename=$filename");
header("Content-Transfer-Encoding: binary");
$df = fopen('php://output', 'w');
fputs($df, $bom = ( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
fputcsv($df, array_keys(reset($arr)), ';');
foreach($arr as $row) {
fputcsv($df, $row, ';');
}
fclose($df);
答案 1 :(得分:0)
@KikoGarcia,感谢您的投入。但是,这样做会更简单。此外,当我尝试您的代码时,它会将整个页面复制到导出的CSV文件中。 exit();
后必须包含fclose();
。
将JSON数据转换为数组后,我不得不循环并创建另一个数组,因为其中存在我需要导出的嵌套数据。一旦我得到了最后一个数组,我称这个函数为$this->arrayToCSVExport($finalArr);
public function arrayToCSVExport($array, $filename = "backup.csv") {
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="'.$filename.'";');
$bookdata = fopen('php://output', 'w');
// output the column headings
fputcsv($bookdata, array(
'Customer Type',
'Company Name',
'Contact First Name',
'Contact Last Name',
'Contact Phone',
'Contact Mobile',
'Contact Email',
'Contact Address',
'Course Name',
'Event ID',
'Student First Name',
'Student Last Name',
'Student Phone',
'Student Mobile',
'Student Email',
'Student Address',
'Purchase Order'
));
foreach ($array as $user) {
fputcsv($bookdata, $user);
}
fclose($bookdata);
exit();
}