PHP Excel導出亂碼一直是一個比較常見的問題,這在實際開發中經常會遇到,因此,我們有必要了解一下這個問題產生的原因以及如何解決。
首先,需要明確的是,PHP Excel導出亂碼并不是PHPExcel本身的問題,而是由于編碼問題導致的。在Excel中,字符集的編碼方式有兩種:ANSI和Unicode。ANSI編碼方式默認使用的是系統中的本地編碼,因此,在不同計算機或不同系統中,會產生不同的字符集編碼方式。而Unicode方式則是將字符集中所有字符占用2個字節來表示,這種方式可以避免在不同計算機或不同系統中產生不同的編碼。
在導出Excel時,如果不指定編碼方式,PHP Excel會默認使用ANSI編碼方式,這就可能導致在不同計算機或不同系統中產生亂碼的問題。以下是一些常見的導出Excel亂碼的情況:
- 使用Windows系統導出的Excel在Mac操作系統中打開,中文亂碼
$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');
解決這種問題的方法也比較簡單,只需要在導出Excel時指定編碼方式即可。以下是兩種常用的指定編碼方式的方法:
- 使用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";
在以上代碼中,第一個方法是直接在Content-Type中指定編碼方式為UTF-8,第二個方法是使用UTF-8 BOM編碼方式,在導出Excel之前輸出BOM頭。需要注意的是,如果使用UTF-8 BOM編碼方式,在讀取Excel時也需要使用相應的編碼方式打開文件,否則會出現中文亂碼。
總之,PHP Excel導出亂碼問題產生的原因是編碼方式的問題,只要在導出Excel時指定正確的編碼方式,就能夠順利地解決這個問題。