PHP导出为二进制Excel文件 – UTF-8字符编码

我正在使用这个简单的函数( 取自这里 )将PHP数组导出为简单的二进制Excel文件。 编写二进制Excel文件是我的要求。

public static function array_to_excel($input) { $ret = pack('ssssss', 0x809, 0x8, 0x0, 0x10, 0x0, 0x0); foreach (array_values($input) as $lineNumber => $row) { foreach (array_values($row) as $colNumber => $data) { if (is_numeric($data)) { $ret .= pack('sssssd', 0x203, 14, $lineNumber, $colNumber, 0x0, $data); } else { $len = strlen($data); $ret .= pack('ssssss', 0x204, 8 + $len, $lineNumber, $colNumber, 0x0, $len) . $data; } } } $ret .= pack('ss', 0x0A, 0x00); return $ret; } 

那么调用这个简单很简单:

 Model_Utilities::array_to_excel($my_2d_array); 

函数本身工作很好,是超级简单的创build简单的二进制PHP文件。 我遇到的问题是UTF-8字符。 我得到奇怪的字符,而不是正确的字符…有没有一种方法来设置我的Excel字符编码function?

编辑:

在查找XLS格式规范的OpenOffice版本之前,浏览了数百个混淆的Microsoft文档之后,我设法做了一些事情。

然而,它依赖于BIFF8格式,因为据我所知,BIFF5(Excel95使用的格式)没有直接的UTF-16支持。

 function array_to_excel($input) { $cells = ''; foreach (array_values($input) as $lineNumber => $row) { foreach (array_values($row) as $colNumber => $data) { if (is_numeric($data)) { $cells .= pack('sssssd', 0x203, 14, $lineNumber, $colNumber, 0x0, $data); } else { $data = mb_convert_encoding ($data, "UTF-16LE", "UTF-8"); $len = mb_strlen($data, "UTF-16LE"); $cells .= pack('ssssssC', 0x204, 9+2*$len, $lineNumber, $colNumber, 0x0, $len, 0x1).$data; } } } return pack('s4', 0x809, 0x0004, 0x0600, // <- this selects BIFF8 format 0x10) . $cells . pack('ss', 0x0A, 0x00); } $table = Array ( Array ("Добрый день", "Bonne journée"), Array ("tschüß", "こんにちは。"), Array (30, 40)); $xls = array_to_excel($table); file_put_contents ("sample.xls", $xls); 

我的(法语)PC版Excel 2007设法以兼容模式打开示例文件,包括俄语和日语。 但是,没有人知道这种破解如何在其他变体上工作。

编辑(二):从上面链接的文件规格:

字节串(BIFF2-BIFF5)

所有Excel文件格式高达BIFF5包含简单的字节string。 string由string的长度和字符数组组成。 根据当前logging长度存储为8位值或16位值 。 该string不是零终止的。 字符数组的编码取决于当前logging

loggingLABEL,BIFF3-BIFF5:

偏移大小内容
0 2行索引
2 2索引到列
4 2 XFlogging索引
6 var。 字节string ,16位string长度

除非你生成一个更复杂的文件,恐怕BIFF5是不行的。