2011-06-02 132 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