PHP Excel導(dǎo)出亂碼一直是一個(gè)比較常見的問題,這在實(shí)際開發(fā)中經(jīng)常會(huì)遇到,因此,我們有必要了解一下這個(gè)問題產(chǎn)生的原因以及如何解決。
首先,需要明確的是,PHP Excel導(dǎo)出亂碼并不是PHPExcel本身的問題,而是由于編碼問題導(dǎo)致的。在Excel中,字符集的編碼方式有兩種:ANSI和Unicode。ANSI編碼方式默認(rèn)使用的是系統(tǒng)中的本地編碼,因此,在不同計(jì)算機(jī)或不同系統(tǒng)中,會(huì)產(chǎn)生不同的字符集編碼方式。而Unicode方式則是將字符集中所有字符占用2個(gè)字節(jié)來表示,這種方式可以避免在不同計(jì)算機(jī)或不同系統(tǒng)中產(chǎn)生不同的編碼。
在導(dǎo)出Excel時(shí),如果不指定編碼方式,PHP Excel會(huì)默認(rèn)使用ANSI編碼方式,這就可能導(dǎo)致在不同計(jì)算機(jī)或不同系統(tǒng)中產(chǎn)生亂碼的問題。以下是一些常見的導(dǎo)出Excel亂碼的情況:
- 使用Windows系統(tǒng)導(dǎo)出的Excel在Mac操作系統(tǒng)中打開,中文亂碼
$writer = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment;filename="'.$filename.'"'); header('Cache-Control: max-age=0'); $writer->save('php://output');
$objPHPExcel = new \PHPExcel(); $objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A1', '中文'); $writer = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment;filename="'.$filename.'"'); header('Cache-Control: max-age=0'); $writer->save('php://output');
解決這種問題的方法也比較簡(jiǎn)單,只需要在導(dǎo)出Excel時(shí)指定編碼方式即可。以下是兩種常用的指定編碼方式的方法:
- 使用UTF-8編碼方式
$writer = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); header('Content-Type: application/vnd.ms-excel;charset=UTF-8'); header('Content-Disposition: attachment;filename="'.$filename.'"'); header('Cache-Control: max-age=0'); $writer->save('php://output');
$writer = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment;filename="'.$filename.'"'); header('Cache-Control: max-age=0'); $writer->save('php://output'); echo "\xEF\xBB\xBF";
在以上代碼中,第一個(gè)方法是直接在Content-Type中指定編碼方式為UTF-8,第二個(gè)方法是使用UTF-8 BOM編碼方式,在導(dǎo)出Excel之前輸出BOM頭。需要注意的是,如果使用UTF-8 BOM編碼方式,在讀取Excel時(shí)也需要使用相應(yīng)的編碼方式打開文件,否則會(huì)出現(xiàn)中文亂碼。
總之,PHP Excel導(dǎo)出亂碼問題產(chǎn)生的原因是編碼方式的問題,只要在導(dǎo)出Excel時(shí)指定正確的編碼方式,就能夠順利地解決這個(gè)問題。