通过PHP COM读取Excel文件时出现编码问题

4

我正在使用PHP COM实用程序读取Excel电子表格,一切都正常,除了电子表格中有一些单元格含有不同语言的数据。当我通过PHP Com读取这些数据时,它显示为???????

$ExlApp = new COM ( "Excel.Application" );
$workbook = $ExlApp->Workbooks->Open ( 'f:\dev\htdocs\excel\testfile.xlsx' );
$worksheet = $workbook->worksheets ( 1 );

$done = false;
$row_index = 1;
while ( $done == false ) {

    $english = $worksheet->cells ( $row_index, 1 )->value;
    $dari = $worksheet->cells ( $row_index, 2 )->value;

    if ($english != '') {
        $row_index ++;
        echo "<div style='float:left;width:420px'>".$english."</div><div>".$dari."</div>";
    } else {
        $done = true;
    }
}

$workbook->close ();

我已检查页面编码并设置为UTF-8。当我打开原始Excel文件时,它显示正确的文本,但是当我从PHP COM中读取时,编码丢失了。有没有人有解决这个问题的方法?
编辑
我如何确保Excel提供的值 $worksheet->cells ( $row_index,2)->value 呈正确编码?或者说,Excel中是否有任何属性可以通过PHP COM设置,以便它返回UTF-8数据?
我已经通过在PHP中使用mb_detect_encoding函数来检查从Excel单元格返回的值的编码,并且它给出的是ASCII,而不是应该给出的UTF-16或UTF-8。似乎Excel没有以正确的编码提供值。
这是我用此脚本阅读的Excel文件: http://asimishaq.com/myfiles/testfile.xlsx 请注意,仅使用PHP COM-INTEROP解决方案。

2
这并不是 PHP 的问题,你只需要确保 PHP 输出的媒介已经知道数据所使用的字符集。例如,如果你要输出到网页浏览器,你需要一个适当的 Content-type 头部或元标签。 - Marc B
@marc-b 我该如何确保从 $worksheet->cells($row_index, 1)->value 返回的值处于正确的编码状态? - asim-ishaq
要么使用mb_convert()及其相关函数将电子表格中的utf数据转换为目标字符集,要么告诉目标接收方“嘿,我正在发送utf-8”。 - Marc B
@marc-b 我已经使用 mb_detect_encoding 检查了从 Excel 返回的值的编码,它是 ASCII。它必须是 UTF-8 或 16,这意味着发送者 ms Excel 在编码方面存在问题? - asim-ishaq
1
我会尝试在COM构造函数中设置所使用的代码页:请参阅http://php.net/manual/en/class.com.php(尝试使用CP_UTF8) - user180100
也许使用PHPExcel来解析xlsx文件会更好? - Sergey
1个回答

3

正如@rc指出的那样,我们需要在COM构造函数中指定codepage属性以获取正确编码的数据。

$ExlApp = new COM ( "Excel.Application", NULL, CP_UTF8 );

通过更改脚本中的上述行,数据将正确显示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接