我正在将调查中的一些数据导出为CSV,以供另一个使用PHP的团队使用。我已经输出了我的第一行数据作为所有标题。但是我需要一些标题来跨越2列,这是可能的。
标题全部正确,但我需要在一些标题下面添加两个数据单元。
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=lite-survey-data_'.time().'.csv');
require_once ( dirname(dirname(dirname(dirname(__FILE__)))).'/wp-load.php' );
$content =build_csv_download();
$headings = convert_to_csv($content[0]);
$csv_content = convert_to_csv($content[1]);
$output = fopen('php://output', 'w');
fwrite($output, $headings);
fwrite($output, $csv_content);
有什么想法吗?
答案 0 :(得分:1)
由于CSV是一种基本格式,因此不可能使标题跨越两列,因此不允许您表示合并的单元格。但是,如果两列中的第二列没有标题(所以heading,,nextheading
),那么当您在Excel中打开它时,heading
将会传播到空单元格中。
答案 1 :(得分:0)
CSV不支持列跨越,因此您只需将相同的字段标题放在两列之上。它不是世界上最漂亮的东西,但是CSV也不是世界上最灵活的格式。
答案 2 :(得分:0)
CSV不支持列跨越。某些程序(如Excel)可能会尝试通过缺少标题或其他此类技巧来理解,但这并不会为您留下有效的CSV文件。见http://tools.ietf.org/html/rfc4180
在制作CSV数据之前,将数据与非重要字符串(如空格或连字符)连接起来。基本上,您只需要获取两个数据列并将它们合二为一。
最简单的方法是使用CONCAT
(docs)将stings直接合并到数据库中:
SELECT
id,
CONCAT(first_name, " " last_name) AS name,
email
FROM
users
/* Gives these results:
Array
(
[0] => Array
(
[id] => 1
[name] => Bob Someuser
[email] => bob@example.com
)
[1] => Array
(
[id] => 2
[name] => George Anotheruser
[email] => george@example.com
)
)
*/
如果您无法在数据库查询中执行此操作,则可以使用array_walk
(docs)在事实之后执行此操作:
$headings = array(
'First heading',
'Second heading',
'Third heading'
);
$one_data = array(
'First data',
'Second',
'data',
'Third data'
);
$data = array();
for ($x=0;$x<10;$x++)
$data[] = $one_data;
print 'Before fix:';
print_r($data);
function prepare_array (&$item) {
$item[1] = $item[1].' '.$item[2];
unset($item[3]);
}
array_walk($data, "prepare_array");
print '<br><br>After fix:';
print_r($data);
function csv_array (&$item) {
$item = implode(',', $item);
}
$csv = implode(',', $headings)."\n";
array_walk($data, "csv_array");
$csv .= implode("\n", $data);
print '<br><br>CSV:<br>'.$csv;