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

时间:2014-01-08 15:11:14

标签: php excel character-encoding

我正在使用这个简单的函数(taken from here)将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);

函数本身效果很好,创建简单的二进制PHP文件非常简单。我遇到的问题是UTF-8字符。我得到像Ä¡这样奇怪的字符而不是正确的字符......有没有办法在我的excel函数中设置字符编码?

1 个答案:

答案 0 :(得分:3)

编辑:

在找到OpenOffice version of the XLS format spec之前浏览了数百个混淆的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设法以兼容模式打开示例文件,包括俄语和日语。但是,没有人知道这个黑客如何对其他变种起作用。

EDIT(bis):来自上面链接的文件规范:

Byte Strings(BIFF2-BIFF5)

最高BIFF5的所有Excel文件格式都包含简单的字节字符串。字节字符串由字符串的长度组成 后跟字符数组。长度以<8>值或16位值存储,具体取决于当前记录。该字符串不是以零结尾的。 字符数组的编码取决于当前记录

记录LABEL,BIFF3-BIFF5:

偏移尺寸内容
0 2行到索引
2 2列索引
4 2 XF记录索引
6变种字节字符串,16位字符串长度

除非你生成一个更复杂的文件,否则我担心BIFF5是不行的。