5

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

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

4

5 回答 5

8

这就是我从 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。

于 2018-03-29T16:42:00.450 回答
6

这真是一团糟。你当然可以使用 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不舒服,但它的工作...

于 2013-10-23T11:45:55.637 回答
5

尽管 CVS 中有“C=comma”,但 Excel 使用您的语言环境本机分隔符。因此,如果您的语言环境分隔符是例如分号,那么假设fputcsv始终使用逗号,它将不起作用。

当您单击“导出到 Excel CSV”时,Google AdSense 的作用是Tab用作分隔符。那行得通。

要复制它,请将第三个参数 ( delimiter) 设置fputcsv为覆盖默认逗号。例如Tab使用:fputcsv($handle, $fields, "\t");

将适合您的 CSV 格式与fputcsv.

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

于 2013-04-12T14:50:58.527 回答
1

您可能有编码问题。

试试这个帖子:

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

于 2013-04-12T14:47:21.473 回答
1

我注意到您需要考虑: Content-Typeheader 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;

如果使用了错误的 charset 和 BOM 组合,在 MS Excel 中打开时就会出现错误。

额外 mb_strlen的事实:告诉你字符数,strlen告诉你字节数。您不想用于计算 Content-Length 标头mb_strlen

奖励 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 );
于 2020-08-26T18:08:49.307 回答