导出Excel的CSV

时间:2013-04-12 14:35:38

标签: php excel

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

我尝试使用此库:http://code.google.com/p/parsecsv-for-php/ 但是我甚至无法让它运行起来并且我不确定它是否真的能帮助我...

5 个答案:

答案 0 :(得分:5)

这真是一团糟。你肯定可以使用sep =;或sep =,或sep = \ t或其他任何使Excel知道CSV中使用的分隔符。只需将此字符串放在CSV内容的开头即可。 E.g:

fwrite($handle, "sep=,\n");

fputcsv($handle,$yourcsvcontent);

这很顺利。但是,如果您需要分别支持特殊字符或MB,则它不能与使用Excel知道UTF-8所需的BOM结合使用。

最后要使其成为防弹,您需要读出用户区域设置并相应地设置分隔符,如上所述。 在您的CSV内容的开头放置一个BOM ("\xEF\xBB\xBF"),然后写下CSV,例如:fputcsv($handle, $fields, $user_locale_seperator); 其中$user_locale_seperator是您通过检查用户的区域设置检索的分区。 不舒服,但它有效...

答案 1 :(得分:4)

尽管CVS中有“C =逗号”,但Excel使用您的语言环境本机分隔符。因此假设fputcsv总是使用逗号,如果您的语言环境分隔符是例如分号,则它将无效。

您引用的其他页面可能会从Accept-Language HTTP标头推断出分隔符。

编辑: 当您单击导出到Excel CSV 时,Google Adsense所做的是它使用Tab作为分隔符。这很有效。

在这两种情况下,设置delimiter的第三个参数(fputcsv)以覆盖默认逗号。例如。供标签使用:fputcsv($handle, $fields, "\t");

绝对比较适合您的CSV格式与fputcsv生成的格式。

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

答案 2 :(得分:2)

这就是我从PHP制作Excel可读CSV文件的方法:

  • 添加BOM以修复Excel中的UTF-8
  • 将分号(;)设置为分隔符
  • 设置正确的标题("内容类型: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。

答案 3 :(得分:1)

您可能遇到编码问题。

试试这篇文章:

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

答案 4 :(得分:0)

我注意到您需要考虑: Content-Type标头 BOM(字节顺序标记) 文件中的实际字符编码

使用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:替换Microsoft“智能”字符(破折号,弯引号等):

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