[英]Export CSV for Excel
我正在使用fputcsv($file, $data)
在 PHP 中编写一个 CSV 文件。 一切正常,但是我不能只在 Excel 中打开它,而是必须导入它并指定编码和要使用的分隔符(在向导中)。 我已经看到其他网站的导出,只需单击它们即可正确打开,现在想知道我应该对我的文件做什么才能实现这一目标。
我尝试使用这个库: http : //code.google.com/p/parsecsv-for-php/但我什至无法让它运行,我也不确定它是否真的能帮助我......
这就是我从 PHP 制作 Excel 可读 CSV 文件的方法:
举个例子 :
$headers = array('Lastname :', 'Firstname :');
$rows = array(
array('Doe', 'John'),
array('Schlüter', 'Rudy'),
array('Alvarez', 'Niño')
);
// Create file and make it writable
$file = fopen('file.csv', 'w');
// Add BOM to fix UTF-8 in Excel
fputs($file, $bom = (chr(0xEF) . chr(0xBB) . chr(0xBF)));
// Headers
// Set ";" as delimiter
fputcsv($file, $headers, ";");
// Rows
// Set ";" as delimiter
foreach ($rows as $row) {
fputcsv($file, $row, ";");
}
// Close file
fclose($file);
// Send file to browser for download
$dest_file = 'file.csv';
$file_size = filesize($dest_file);
header("Content-Type: text/csv; charset=utf-8");
header("Content-disposition: attachment; filename=\"file.csv\"");
header("Content-Length: " . $file_size);
readfile($dest_file);
适用于 Excel 2013。
这真是一团糟。 你当然可以使用 sep=; 或 sep= 或 sep=\\t 或任何使 Excel 知道您的 CSV 中使用的分隔符的东西。 只需将此字符串放在 CSV 内容的开头即可。 例如:
fwrite($handle, "sep=,\n");
fputcsv($handle,$yourcsvcontent);
这工作顺利。 但是,如果您需要分别支持特殊字符或 MB,它不能与使 Excel 知道 UTF-8 所需的 BOM 结合使用。
最后,要使其防弹,您需要读出用户区域设置并相应地设置分隔符,如上所述。 在 CSV 内容的("\\xEF\\xBB\\xBF")
放置一个 BOM ("\\xEF\\xBB\\xBF")
,然后像这样编写 CSV: fputcsv($handle, $fields, $user_locale_seperator);
其中$user_locale_seperator
是您通过检查用户的语言环境检索到的分隔符。 不舒服,但它有效......
尽管 CVS 中有“C=逗号”,但 Excel 使用您的语言环境本机分隔符。 因此,假设fputcsv
始终使用逗号,如果您的区域设置分隔符是分号,则它将不起作用。
当您点击“导出到 Excel CSV”时,Google AdSense 的作用是使用Tab作为分隔符。 这有效。
要复制它,请设置fputcsv
的第三个参数 ( delimiter
) 以覆盖默认逗号。 例如对于Tab使用: fputcsv($handle, $fields, "\\t");
将适用于您的 CSV 格式与fputcsv
生成的格式进行比较。
考虑在您的问题中包含两者的示例。 你可能会得到更好的答案。
我注意到你需要考虑: Content-Type
header BOM (Byte Order Mark) 文件中的实际字符编码
使用 BOM(作品):
$bom = pack("CCC", 0xEF, 0xBB, 0xBF);
header('Content-Type: text/csv');
header('Content-Length: '.(strlen($csv)+strlen($bom)));
header('Content-Disposition: attachment;filename=my.csv');
echo $bom;
echo $csv;
没有 BOM(有效,但您需要替换“智能引号”,然后在每个值或单元格上运行utf8_decode
,它会转换一些字符,例如 FRĒ 被转换为 FRE')
header('Content-Type: application/csv;charset=utf-8');
header('Content-Length: '.strlen($csv));
header('Content-Disposition: attachment;filename=my.csv');
echo $csv;
如果使用了错误的字符集和 BOM 组合,在 MS Excel 中打开时就会出错。
额外的事实: mb_strlen
告诉您字符数, strlen
告诉您字节数。 你不希望使用mb_strlen
计算Content-Length头。
奖励 2:替换微软的“智能”字符(破折号、卷曲引号等):
$map = array(chr(145) => "'"
,chr(146) => "'"
,chr(147) => '"'
,chr(148) => '"'
,chr(149) => '-'
,chr(150) => '-'
,chr(151) => '-'
,chr(152) => '-'
,chr(152) => '-'
,chr(171) => '-'
,chr(187) => '-'
);
// faster that strtr
return str_replace( array_keys($map), $map, $str );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.