使用fgetcsv将Excel csv导出到php文件中

时间:2012-11-07 08:52:47

标签: php excel csv

我正在使用excel 2010 professional plus来创建excel文件。 后来我试图将其导出为UTF-8 .csv文件。 我这样做是通过将其保存为CSV(符号分隔..... sry我不知道那里的确切措辞 但我没有英文版本,我担心它的翻译方式不同于1:1 。 在那里,我点击tools-> weboptions并选择unicode(UTF-8)作为编码。 示例.csv如下:

ID;englishName;germanName
1;Austria;Österreich

到目前为止一切顺利,但如果我现在用我的PHP代码打开文件:

 header('Content-Type: text/html; charset=UTF-8');
 iconv_set_encoding("internal_encoding", "UTF-8");
 iconv_set_encoding("output_encoding", "UTF-8");
 setlocale(LC_ALL, 'de_DE.utf8');
 $fp=fopen($filePathName,'r');
 while (($dataRow= fgetcsv($fp,0,";",'"') )!==FALSE)
 {
     print_r($dataRow);
 }
  • 我得到: sterreich作为屏幕上的结果(因为这是“错误”我切断了结果的所有其他部分)。
  • 如果我使用notedpad ++打开文件并查看编码,我会看到“ANSI”而不是UTF-8。
  • 如果我将notepad ++中的编码更改为UTF8 ....ö,ä,...将被特殊字符替换,我必须手动更正。

如果我走另一条路线并使用notedpad ++创建一个新的UTF-8文件并输入与excel文件相同的数据,当我用php文件打开它时,我会在屏幕上显示“Österreich”。

现在我的问题是,为什么它不能与excel一起运行,因此我在这里做错了什么?或者我忽略了什么?

修改 由于程序最终会安装在客户提供的Windows服务器上, 在没有必要安装额外工具的情况下需要一个解决方案(php库,......没关系,但是必须安装vm-ware或cygwin,...不是)。 此外,服务器上本地不会安装excel(或办公室)作为 客户将能够通过文件上传对话框(对话框本身)上传.csv文件 不是问题的一部分,因为我知道如何处理这些问题,另外问题本身我偶然发现了一个excel文件,并在excel在本地安装的testmachine上将其转换为.csv。

TNX

5 个答案:

答案 0 :(得分:11)

From PHP DOC

  

此功能会考虑区域设置。如果LANG是例如en_US.UTF-8,此函​​数读取单字节编码的文件错误。

您可以尝试

header('Content-Type: text/html; charset=UTF-8');
$fp = fopen("log.txt", "r");
echo "<pre>";
while ( ($dataRow = fgetcsv($fp, 1000, ";")) !== FALSE ) {
    $dataRow = array_map("utf8_encode", $dataRow);
    print_r($dataRow);
}

输出

Array
(
    [0] => ID
    [1] => englishName
    [2] => germanName
)
Array
(
    [0] => 1
    [1] => Austria
    [2] => Österreich
)

答案 1 :(得分:1)

我不知道Excel为什么会生成ANSI文件而不是UTF-8(正如您在Notepad ++中看到的那样),但如果是这种情况,您可以使用iconv转换文件:

iconv --from-code = ISO-8859-1 --to-code = UTF-8 my_csv_file.csv&gt; my_csv_file_utf8.csv

答案 2 :(得分:1)

来自捷克共和国的人们:

function convert( $str ) {
    return iconv( "CP1250", "UTF-8", $str );
}
...
while (($data = fgetcsv($this->fhandle, 1000, ";")) !== FALSE) {
$data = array_map( "convert", $data );
...

答案 3 :(得分:0)

根据你的说法,我怀疑excel写了一个UTF-8文件without BOM,这使得猜测编码是utf-8有点棘手。如果在按下Format->Encode in UTF-8 (without BOM)(而非Format->Convert to UTF-8 (without BOM))时字符在Notepad ++中正确显示,则可以确认此诊断。

你确定每个用户都会使用UTF-8吗?听我说你需要一些能够巧妙地猜测你真正的输入编码是什么的东西。通过“智能”,我的意思是这种猜测可以识别无BOM的UTF-8。

为了切入追逐,我会做那样的事情:

$f = fopen('file.csv', 'r');

while( ($row = fgets($f)) != null )
    if( mb_detect_encoding($row, 'UTF-8', true) !== false )
        var_dump(str_getcsv( $row, ';' ));
    else
        var_dump(str_getcsv( utf8_encode($row), ';' ));

fclose($f);

这是有效的,因为你读取字符来猜测编码,而不是懒惰地信任前3个字符:所以没有BOM的UTF-8仍然会被识别为UTF-8。当然,如果您的csv文件不是太大,您可以对整个文件内容进行编码检测:类似mb_detect_encoding(file_get_contents(...), ...)

答案 4 :(得分:0)

问题必须是你的文件编码,它看起来不是utf-8。

当我尝试你的例子并双重检查确实是utf-8的文件时,它对我有用,我得到:

  

数组([0] =&gt; 1 [1] =&gt;奥地利[2] =&gt;Österreich)

使用LibreOffice(OpenOffice),它对这些事情更可靠。