PHP导出excel unicode(俄罗斯字符)问题

时间:2011-06-02 05:36:13

标签: php unicode export-to-excel

我使用下面的代码使用php导出excel文件。对于英文文本,我没有发现任何问题。但俄罗斯人物我发现了一些问题。我附上了我的代码。

mysql_connect("localhost","USERNAME","PASSWORD");
mysql_select_db("DATABASE");
mysql_query("SET NAMES 'UTF8'");
// Get data records from table.
$result=mysql_query("select * from usertbl order by user_id asc");

// Functions for export to excel.
function xlsBOF() {
   echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);
   return;
 }
function xlsEOF() {
     echo pack("ss", 0x0A, 0x00);
     return;
 }
function xlsWriteNumber($Row, $Col, $Value) {
    echo pack("sssss", 0x203, 14, $Row, $Col, 0x0);
    echo pack("d", $Value);
    return;
 }
 function xlsWriteLabel($Row, $Col, $Value ) {
   $L = strlen($Value);
   echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L);
   echo $Value;
   return;
  }
  header("Pragma: public");
  header("Expires: 0");
  header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
  header("Content-type: application/vnd.ms-excel;charset:UTF-8"); 
  header("Content-Type: application/force-download");
  header("Content-Type: application/octet-stream");
  header("Content-Type: application/download");
  header("Content-Disposition: attachment;filename=orderlist.xls ");
  header("Content-Transfer-Encoding: binary ");



  xlsBOF();

 /*
 Make a top line on your excel sheet at line 1 (starting at 0).
 The first number is the row number and the second number is the column, both are 
 start  at '0'*/

 xlsWriteLabel(0,0,"List of car company.");

 // Make column labels. (at line 3)
 xlsWriteLabel(2,0,"No.");
 xlsWriteLabel(2,1,"Nickname");

 $xlsRow = 3;

 // Put data records from mysql by while loop.
 while($row=mysql_fetch_array($result)){

   xlsWriteNumber($xlsRow,0,$row['user_id']);
   //$row['nickname']= iconv('UTF-8', 'SJIS', $row['NAME']);
   //$row['nickname'] = mb_convert_encoding($row['NAME'], 'UTF-16LE', 'UTF-8');
     xlsWriteLabel($xlsRow,1,$row['NAME']);

    $xlsRow++;
  }
 xlsEOF();
 exit();

2 个答案:

答案 0 :(得分:3)

我建议使用像我自己的PHPExcel这样的库来编写Excel文件;但您可以尝试设置代码页记录,告诉Excel您的字符串是UTF-8。

function xlsCodepage($codepage) {
    $record    = 0x0042;    // Codepage Record identifier
    $length    = 0x0002;    // Number of bytes to follow

    $header    = pack('vv', $record, $length);
    $data      = pack('v',  $codepage);

    echo $header , $data;
}

在调用xlsBOF()之后,在写入任何数据之前调用xlsCodepage()函数。

代码页的可能值(取决于您使用的字符集)是:

367     ASCII       //  ASCII
437     CP437       //  OEM US
737     CP737       //  OEM Greek
775     CP775       //  OEM Baltic
850     CP850       //  OEM Latin I
852     CP852       //  OEM Latin II (Central European)
855     CP855       //  OEM Cyrillic
857     CP857       //  OEM Turkish
858     CP858       //  OEM Multilingual Latin I with Euro
860     CP860       //  OEM Portugese
861     CP861       //  OEM Icelandic
862     CP862       //  OEM Hebrew
863     CP863       //  OEM Canadian (French)
864     CP864       //  OEM Arabic
865     CP865       //  OEM Nordic
866     CP866       //  OEM Cyrillic (Russian)
869     CP869       //  OEM Greek (Modern)
874     CP874       //  ANSI Thai
932     CP932       //  ANSI Japanese Shift-JIS
936     CP936       //  ANSI Chinese Simplified GBK
949     CP949       //  ANSI Korean (Wansung)
950     CP950       //  ANSI Chinese Traditional BIG5
1200    UTF-16LE    //  UTF-16 (BIFF8)
1250    CP1250      //  ANSI Latin II (Central European)
1251    CP1251      //  ANSI Cyrillic
1252    CP1252      //  ANSI Latin I (BIFF4-BIFF7)
1253    CP1253      //  ANSI Greek
1254    CP1254      //  ANSI Turkish
1255    CP1255      //  ANSI Hebrew
1256    CP1256      //  ANSI Arabic
1257    CP1257      //  ANSI Baltic
1258    CP1258      //  ANSI Vietnamese
1361    CP1361      //  ANSI Korean (Johab)
10000   MAC         //  Apple Roman
65001   UTF-8       //  Unicode (UTF-8)

答案 1 :(得分:2)

XLS文件格式非常复杂,我强烈建议不要编写自己的编写器实现。

而是使用现有的一种实现,例如phpexcel,或者甚至选择写入CSVXLSX格式。