为 PHPexcel 正确编码 CSV 文件

Posted

技术标签:

【中文标题】为 PHPexcel 正确编码 CSV 文件【英文标题】:Encoding correctly CSV files for PHPexcel 【发布时间】:2013-05-03 11:44:23 【问题描述】:

我有一个 Json,将其解码,用 php 将其写入 CSV 文件,借助 PHPexcel 将 CSV 转换为 .xls

目标是正确地从 JSON 导出到 excel 文件。 我在编码时遇到问题,主要是 Excel for Mac 2011,它不支持 UTF-8 CSV 文件:link 如果我在我的 Mac 上预览它(空格键),它看起来编码良好。问题是excel。

首先是 CSV 的代码:

$file_csv = fopen('files/file.csv', 'w');

然后是 JSON:

$response_data = json_decode($connection->response['response'], true);
foreach ($response_data as $value)
  
  //take the data I have 10 strings here in reality
  $text_lang = $value['lang'];
  $date = $value['date'];
  //insert into the csv
  $details = array($text_lang, $date );
  fputcsv($file_csv, $details);
;
fclose($file_csv);

现在,如果我使用 excel 导入此 CSV,我会遇到 UTF-8 问题。如果我用文本编辑器转换它,例如Textmate转UTF-16LE,再导入Excel一切顺利。

以及用于创建 .xls from here 的 PHPExcel 代码:

$objReader = PHPExcel_IOFactory::createReader('CSV');
$objPHPExcel = $objReader->load('files/file.csv');  
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('files/summary.xls');

summary.xls 在 UTF-8 上损坏,打开时需要修复。


我的第一次尝试是在 PHP 中将上面的 file.csv 转换为 UTF-16LE,看看是否可以使用 excel。 我在fputcsv之前用过iconv,excel显示中文单词...

现在我想将 csv 文件编码为 UTF-16LE 并使用 PHPExcel 很好地加载它。 我使用了以下几行但没有工作。可能是因为我使用 incov 创建的 .csv 部分是(?)UTF-8 和 UTF-16LE。

$objReader->setInputEncoding('UTF-16LE');
$objPHPExcel = $objReader->load('file.csv');

目标是将 JSON 中的数据呈现为 .xls(或 .xlxs)文档,而不会在 excel 上出现编码问题。

【问题讨论】:

你说得对,混合编码会导致问题:CSV 阅读器将始终执行尝试从输入编码转换为 UTF-8,然后再将值插入 PHPExcel 单元格对象...如果CSV 值是 UTF-16LE,那么这应该可以正常工作,但是将 UTF-8 值转换为 UTF-8 就好像它是 UTF16-LE 会导致问题.... csv 文件确实需要在其编码中保持内部一致 @MarkBaker 感谢您的评论并感谢您对 PHPExcel 的承诺。我不确定,但我认为特殊字符存在一些问题,例如:????或♑(在 safari 上可读/在 chrome 中不可读)当 excel 发现这些字符时,它会损坏并需要修复,而数据会丢失。从理论上讲,“Apple Color Emoji”应该不是问题,因为它们是 unicode 或 UTF-8 可读的。我现在正在寻找更多 @MarkBaker 是的。我不得不清理表情符号中的字符串。我添加了这个功能:***.com/a/12824140/1447885 很高兴您找到了解决方案 【参考方案1】:
$objReader->setInputEncoding('');

$objPHPExcel = $objReader->load('file.csv');

这对我来说效果很好。

【讨论】:

以上是关于为 PHPexcel 正确编码 CSV 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用PHP导出csv和excel文件

phpexcel 读取csv大文件只读取显示A列

PHP操作CSV文件的编码问题

PHP 读取和导出 CSV文件

php怎么导出大量数据的Excel,phpexcel

PHP 使用 PHPExcel 库生成 Excel 文件