使用 PHP 将带有 UTF8 的 CSV 导出到 Excel
Exporting CSV with UTF8 to Excel using PHP
我的客户要求我构建一个导出系统,将整个 SQL 数据库导出到适用于 excel 的 csv 文件中。我发现 PHPexcel 很棒,但我认为我可以使用自己的函数更轻松、更快速地完成工作。
在 Excel 编码上苦苦挣扎后,我终于成功导出了适用于 Excel 的 CSV,使用以下代码:
<?php
$data = showData("price"); //Function that loads all the SQL database into an array.
function array2csv(array &$array)
{
if (count($array) == 0) {
return null;
}
ob_start();
$df = fopen("php://output", 'w');
fputcsv($df, array_keys(reset($array)));
foreach ($array as $row) {
fputcsv($df, $row);
}
fclose($df);
return ob_get_clean();
}
function download_send_headers($filename) {
// disable caching
$now = gmdate("D, d M Y H:i:s");
header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
header("Last-Modified: {$now} GMT");
header ( 'HTTP/1.1 200 OK' );
header ( 'Date: ' . date ( 'D M j G:i:s T Y' ) );
header ( 'Content-Type: application/vnd.ms-excel') ;
header ( 'Content-Disposition: attachment;filename=export.csv' );
}
download_send_headers("export.csv");
$final = array2csv($data);
print chr(255) . chr(254) . mb_convert_encoding($final, 'UTF-16LE', 'UTF-8');
die();
?>
问题是当我尝试打开 Excel 中的文件时,没有任何列。每行都是一个大列,包含特定行的全部数据,以逗号分隔。
我发现我需要用 Excel 可以读作 "new column" 的东西替换那些逗号。但我仍然需要让我的 CSV 保持原样。
我搜索了 SO 和 Google,但没有找到一个既能保持我的 CSV 完整又能将数据拆分成列 Excel 的解决方案。如果没有办法做到这两点,我认为对我的客户来说更重要的是 Excel 版本将按其应有的方式工作(每行分为几列)。
这是一张 CSV 格式的图片(使用 Mac 上的数字)
这是一张 Excel 2007 年 Windows 的照片
都在fputcsv()函数中:
http://php.net/manual/en/function.fputcsv.php
尝试选择正确的 $delimiter
、$enclosure
和 $escape_char
。
在 excel 中用作字段分隔符的默认字符由区域设置设置。这意味着:导入 CVS 文件可能与语言有关。从 excel 导出到 CSV 以查看它在您的系统上的作用,并检查您的客户端系统是否具有相同的设置。
最好导出为 XML 而不是 CSV,因为这样可以避免这个问题:
我的客户要求我构建一个导出系统,将整个 SQL 数据库导出到适用于 excel 的 csv 文件中。我发现 PHPexcel 很棒,但我认为我可以使用自己的函数更轻松、更快速地完成工作。
在 Excel 编码上苦苦挣扎后,我终于成功导出了适用于 Excel 的 CSV,使用以下代码:
<?php
$data = showData("price"); //Function that loads all the SQL database into an array.
function array2csv(array &$array)
{
if (count($array) == 0) {
return null;
}
ob_start();
$df = fopen("php://output", 'w');
fputcsv($df, array_keys(reset($array)));
foreach ($array as $row) {
fputcsv($df, $row);
}
fclose($df);
return ob_get_clean();
}
function download_send_headers($filename) {
// disable caching
$now = gmdate("D, d M Y H:i:s");
header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
header("Last-Modified: {$now} GMT");
header ( 'HTTP/1.1 200 OK' );
header ( 'Date: ' . date ( 'D M j G:i:s T Y' ) );
header ( 'Content-Type: application/vnd.ms-excel') ;
header ( 'Content-Disposition: attachment;filename=export.csv' );
}
download_send_headers("export.csv");
$final = array2csv($data);
print chr(255) . chr(254) . mb_convert_encoding($final, 'UTF-16LE', 'UTF-8');
die();
?>
问题是当我尝试打开 Excel 中的文件时,没有任何列。每行都是一个大列,包含特定行的全部数据,以逗号分隔。 我发现我需要用 Excel 可以读作 "new column" 的东西替换那些逗号。但我仍然需要让我的 CSV 保持原样。
我搜索了 SO 和 Google,但没有找到一个既能保持我的 CSV 完整又能将数据拆分成列 Excel 的解决方案。如果没有办法做到这两点,我认为对我的客户来说更重要的是 Excel 版本将按其应有的方式工作(每行分为几列)。
这是一张 CSV 格式的图片(使用 Mac 上的数字)
这是一张 Excel 2007 年 Windows 的照片
都在fputcsv()函数中:
http://php.net/manual/en/function.fputcsv.php
尝试选择正确的 $delimiter
、$enclosure
和 $escape_char
。
在 excel 中用作字段分隔符的默认字符由区域设置设置。这意味着:导入 CVS 文件可能与语言有关。从 excel 导出到 CSV 以查看它在您的系统上的作用,并检查您的客户端系统是否具有相同的设置。
最好导出为 XML 而不是 CSV,因为这样可以避免这个问题: