我正在尝试将php / mysql生成的表转换为可下载的csv文件。当用户输入搜索参数时,将调用mysql表并将结果作为表返回。
我使用了这个帖子中提供的解决方案并且它非常有效:Create a CSV File for a user in PHP
我能够允许用户将结果保存或查看为csv文件。我遇到的问题是我不确定如何将列标题添加到文件中。例如,返回的结果采用以下格式:$ result [x] ['office'],$ result [x] ['user']等等,但我还想添加列标题“Office”和“User”使得任何查看csv文件的人都能立即知道数据的含义。
这是生成csv文件的函数:
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=$file.csv");
header("Pragma: no-cache");
header("Expires: 0");
outputCSV($data);
function outputCSV($data) {
$outstream = fopen("php://output", "a");
function __outputCSV(&$vals, $key, $filehandler) {
fputcsv($filehandler, $vals); // add parameters if you want
}
array_walk($data, "__outputCSV", $outstream);
fclose($outstream);
}
我尝试创建以下函数,然后在调用outputCSV之前调用它,但它没有成功:
function create_file_header()
{
$headers = 'Office, User, Tag, Value';
$fp = fopen("php://output", "w");
file_put_contents("$file.csv", $headers);
fclose($fp);
}
非常感谢任何帮助。
答案 0 :(得分:10)
要创建标题,您应该只添加标题行数组并正常使用fputcsv
。
您不会谈论$data
的格式,但如果它是关联数组,您可以为通用解决方案执行此操作:
function toCSV($data, $outstream) {
if (count($data)) {
// get header from keys
fputcsv($outstream, array_keys($data[0]));
//
foreach ($data as $row) {
fputcsv($outstream, $row);
}
}
}
我没有看到array_walk()
对foreach
循环的好处。
答案 1 :(得分:2)
在调用outputCSV之前执行此操作:
array_unshift($data, array('Office', 'User', 'Tag', 'Value'));
或者,如果$data
的元素是关联数组,那么这将更具动态性:
array_unshift($data, array_keys($data[0]));
答案 2 :(得分:0)
难道你不能把它放在outputCSV函数中吗?
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=$file.csv");
header("Pragma: no-cache");
header("Expires: 0");
outputCSV($data);
function outputCSV($data) {
$outstream = fopen("php://output", "a");
$headers = 'Office, User, Tag, Value';
fwrite($outstream,$headers);
function __outputCSV(&$vals, $key, $filehandler) {
fputcsv($filehandler, $vals); // add parameters if you want
}
array_walk($data, "__outputCSV", $outstream);
fclose($outstream);
}
答案 3 :(得分:0)
在$headers
功能中添加可选的outputCSV
参数。如果您的代码通过它们,它们将被添加到csv数组:
outputCSV($data, array('Office', 'User'));
//
function outputCSV($data, $headers = null) {
$outstream = fopen("php://output", "a");
function __outputCSV(&$vals, $key, $filehandler) {
fputcsv($filehandler, $vals); // add parameters if you want
}
if ($headers) {
$data = array_merge(array($headers), $data);
}
array_walk($data, "__outputCSV", $outstream);
fclose($outstream);
}