2011-06-02 77 views
2

我已經使用下面的代碼使用php導出excel文件。對於英文文本,我沒有發現任何問題。但俄羅斯人物我發現一些問題。我附上我的代碼。PHP導出excel unicode(俄羅斯字符)問題

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

你可以嘗試使用http://phpexcel.codeplex.com/ – Petah 2011-06-02 05:40:00

+0

當我有問題,在俄羅斯我發送電子郵件發現mysqli_set_charset($ connector,'utf8');幫助(其中連接器 - 是你的db連接變量設置爲$ connector = @mysqli_connect(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME) - 你必須首先定義這些東西)再次檢查php文件本身是否以UTF-8編碼,無BOM並且所有表中的所有字段都是UTF-8。這裏是關於mysqli_set_charset更多信息:http://php.net/manual/en/mysqli.set-charset.php – 2011-06-02 05:53:13

回答

2

XLS文件格式是一個非常複雜的文件格式,我強烈建議不要編寫自己的編寫器實現。

改爲使用現有的一種實現方式,如phpexcel或甚至選擇寫入CSVXLSX格式。

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) 
+0

是therea任何方式新的工作表添加到工作簿,並開始寫呢? – Jeeva 2013-02-17 10:24:40

+0

@Jeeva - 你真的應該問的問題,不是崗位作爲響應非常不同的問題 – 2013-02-17 10:38:14

+0

@Jeeva評論 - createSheet()進行或addSheet()是你要找的 – 2013-02-17 10:39:19