我正在使用这个简单的函数(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函数中设置字符编码?
答案 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):来自上面链接的文件规范:
最高BIFF5的所有Excel文件格式都包含简单的字节字符串。字节字符串由字符串的长度组成 后跟字符数组。长度以<8>值或16位值存储,具体取决于当前记录。该字符串不是以零结尾的。 字符数组的编码取决于当前记录。
偏移尺寸内容
0 2行到索引
2 2列索引
4 2 XF记录索引
6变种字节字符串,16位字符串长度
除非你生成一个更复杂的文件,否则我担心BIFF5是不行的。