Export CSV for Excel


Export CSV for Excel

我在PHP中使用fputcsv($file, $data)编写CSV文件。这一切都工作,但是我不能只是在Excel中打开它,而是必须导入它并指定编码和使用哪个分隔符(在向导中)。我已经看到从其他网站的导出,只要点击它们就可以正确打开,现在我想知道我应该对我的文件做些什么来实现这一点。

我尝试使用这个库:http://code.google.com/p/parsecsv-for-php/但是我甚至不能让它运行,我真的不确定它是否真的能帮助我…

这是我如何从PHP创建Excel可读的CSV文件:

  • 添加BOM以修复Excel
  • 中的UTF-8
  • 设置分号(;)作为分隔符
  • 设置正确的标题("Content-Type: text/csv;charset = utf - 8")

例如:

$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结合使用。

最后,为了使它防弹,您需要读出用户区域设置并相应地设置分隔符,如上所述。将BOM ("'xEF'xBB'xBF")放在CSV内容的开头,然后编写CSV,例如:fputcsv($handle, $fields, $user_locale_seperator);其中$user_locale_seperator是通过检查用户的语言环境检索到的分隔符。

尽管CVS中有"C=逗号",但Excel使用本地区域分隔符。因此,假设fputcsv总是使用逗号,如果您的区域设置分隔符是分号,则它将不起作用。

当你点击"导出到Excel CSV"时,Google AdSense会使用制表符作为分隔符。

要复制它,设置fputcsv的第三个参数(delimiter)以覆盖默认的逗号。例如,对于制表符使用:fputcsv($handle, $fields, "'t");

比较fputcsv生成的CSV格式

考虑在你的问题中包括两者的例子。你可能会得到更好的答案

您可能有编码问题。

试试这个帖子:

http://onwebdev.blogspot.com.es/2010/10/php-encoding-of-csv-file-for-excel.html

我注意到你需要考虑:Content-Type头字节顺序标记文件

中的实际字符编码

With BOM (works):

$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告诉您字节数。NOT希望使用mb_strlen来计算Content-Length头。

好处二:取代microsoft "smart"字符(em、破折号、花引号等):

$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 );