我想使用 PHP Laravel 将数据导出到 CSV 文件。
我将每一行用作变量,最后添加到 csv 中。它帮助我创建自定义 CSV 文件列标题,因此我必须遵循此规则。
我所做的是这样的-
$tweets = DB::select(DB::raw($query));
foreach ($tweets as $row)
{
$row = get_object_vars($row);
// iterate over each tweet and add it to the csv
$output .= implode(",",
array(
$row['completion_date'],
$row['site_id'],
$row['country'],
$row['state'],
$row['city'],
$row['active_ipp'],
$row['description_of_project'],
$row['total_excess_furniture']
)
); // append each row
$output .="\n"; //Adding New Line
}
$headers = array(
'Content-Type' => 'text/csv',
'Content-Disposition' => 'attachment;filename="'.Carbon\Carbon::now()->toDateTimeString().'.csv"',
);
return Response::make(rtrim($output, "\n"), 200, $headers);
它运行时出现一些错误。
错误是,当对象字符串中有逗号时,它不能完美工作。
所以,我认为我不能使用implode。
还有其他解决方案可以将 CSV 行添加为这样的变量吗?
您可以尝试以下方法:
$items = [
[
'field1' => 'string with " quotes',
'field2' => 'string without commas',
],
[
'field1' => 'string without quotes',
'field2' => 'string, with, commas',
],
];
ob_start();
$buffer = fopen('php://output', 'w+');
foreach($items as $item) {
fputcsv($buffer, [
$item['field1'],
$item['field2'],
]);
}
$output = ob_get_clean();
fputcsv
将处理变量中的逗号或引号。您可以将输出发送到缓冲区并使用 ob_start
和 ob_get_clean
将其存储到变量,而不是将输出写入文件。