使用PHP“pack”函数将数据下载到Excel时出现问题

我有一个PHP应用程序,将MySQL表数据下载到客户机上的电子表格。 我在networking上的许多地方发现了一些代码,可以在运行Redhat的机器上正常运行Open Office Scalc。 我遇到的问题是当我试图下载到Windows PC上的MS Excel而不是Open Office电子表格。 这个问题似乎与插入到单元格中的string的长度有关。 如果它太长,Excel认为该文件已损坏,不会加载它。 “太长”似乎是大约255个字符,即使MS Excel规格说32,000是最大长度。

为了进一步调查问题,我尝试下载与制表符分隔值文件相同的数据,并让Excel将其转换为电子表格。 使用这种方法,将很长的string加载到电子表格单元中是没有问题的。 因此,实际上可以将长度超过255个字符的string插入到Excel单元格中,但不能与我正在使用的代码一起使用,即使该代码可以与Open Office一起使用。 使用tsv文件不能解决我们的问题,因为长string有我们想要保留的回车符,并且当tsv文件被加载到电子表格中时回车被解释为行分隔符。

将string写入电子表格单元的PHP函数是:

function xlsWriteLabel($Row, $Col, $Value ) { $L = strlen($Value); echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L); echo $Value; return; } 

除上述function之外,用于传输到电子表格的其他必要代码可在以下位置find:

http://www.appservnetwork.com/modules.php?name=News&file=article&sid=8

在上面的代码中,我没有发现任何传递给“pack”函数的参数的含义,我想知道是否在上面的函数中改变参数可以解决这个问题。

所以,如果任何人有解决这个问题,我会有兴趣听到这个问题。

…除非你的文字有双引号。

你应该使用的是从ASCII字符集中正确的分隔符。

 Seq Dec Hex Acro Name
 ^ \ 28 1C FS文件分隔符      
 29] 1D GS组分隔符     
 ^^ 30 1E RSlogging分隔符    
美国的单位分隔符  

我不知道PHP,但在Perl中,打印语句可能如下所示:


    打印chr(30),“Field1”,chr(30),“Field2”,chr(30),“Field3”,chr(31);

我已经写了一个简单的方法来生成绝对的Excel文件。

一个简单的function。

首先,将内容转换为数组(这非常简单,大家都知道)。 然后将数组传递给我下面给出的函数。

 <?php //array to excel function arrayToExcel($array, $filename='List') { if (!is_array($array) or !is_array($array[0])) return false; $xl = pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0); //begining of excel file $i = 0; foreach ($array as $key => $val) { $j=0; foreach ($val as $cell_key => $cell_val) { $cell_val = trim($cell_val); $length = strlen($cell_val); //checking cell value is a number and the length not equal to zero if(preg_match('/^[0-9]*(\.[0-9]+)?$/', $cell_val) && $length!=0) { $xl .= pack("sssss", 0x203, 14, $i, $j, 0x0); //writing number column $xl .= pack("d", $cell_val); } else { $xl .= pack("ssssss", 0x204, 8 + $length, $i, $j, 0x0, $length); //writing string column $xl .= $cell_val; } $j++; } //end of 2nd foreach $i++; } //end of first foreach $xl .= pack("ss", 0x0A, 0x00); //end of excel file $filename = $filename.".xls"; header("Pragma: public"); header('Content-Type: application/vnd.ms-excel'); header("Content-Disposition: attachment; filename=$filename"); header("Cache-Control: no-cache"); echo $xl; } //end of arrayToExcel function //eg: arrayToExcel($myarray, "contact_list"); ?> 

用双引号括住你的单元格值"" ,它将允许你导入tsv或csv格式的数据,而不必担心回车被解释为一个新的行。 您也可以使用PHP中的fputcsv函数导出excel可以读取的tsv或csv文件。

这是他们的function稍微更有效的版本,谢谢你链接,但我不知道他们输出的格式是否实际上正确的Excel或不。

 function xlsBOF(){ echo pack("s6", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0); } function xlsEOF(){ echo pack("ss", 0x0A, 0x00); } function xlsWriteNumber($Row, $Col, $Value){ echo pack("s5d", 0x203, 14, $Row, $Col, 0x0, $Value); } function xlsWriteLabel($Row, $Col, $Value){ $L = strlen($Value); echo pack("s6A*", 0x204, 8 + $L, $Row, $Col, 0x0, $L, $Value); }