php 導入/導出 csv 文件
1、簡介
項目開發中,很多時候要將外部CSV文件導入到數據庫中或者將數據導出為CSV文件,那么具體該如何實現呢?本文將使用原生PHP,實現了CSV格式數據的導入和導出功能。並解決相關亂碼問題。
將xls轉換成csv的文本格式,然后再用php分析這個文件,和PHP分析文本沒有什么區別。
優點:跨平台,效率比較高、可以讀寫。
缺點:只能直接使用csv的文件,如果經常接受.xls二進制文件的話需要手工轉換,不能自動化。一個文件只有一個SHEET。
2、相關函數介紹
2.1、fgetcsv
參考:http://www.w3school.com.cn/php/func_filesystem_fgetcsv.asp
2.2、fputcsv
參考:http://www.w3school.com.cn/php/func_filesystem_fputcsv.asp
2.3、fopen
參考:http://www.w3school.com.cn/php/func_filesystem_fputcsv.asp
2.4、iconv
參考:http://php.net/manual/fr/function.iconv.php
本次大致會使用以上4個函數,實現csv文件的導入導出
3、如何導出csv文件
注:默認導出是utf8編碼,需要對字符串進行轉碼,excel 打開文件默認是gbk編碼,所以utf8導出在txt文件打開是正常,在excel打開是亂碼
3.1、測試utf8導出
導出的數據格式
$head = array('編號','姓名','年齡','出生年月'); $data = array( array('001','zs',10,'1991-1-1'), array('002','李四',10,'1991-1-1'), array('003','王五',10,'1991-1-1'), ); $obj->putCsv('putCsv.csv', $data, $head);
導出的方法:
class Excel{ /** * [putCsv description] * @param string $csvFileName [description] 文件名 * @param array $dataArr [description] 數組,每組數據都是使用,分割的字符串 * @param string $haderText [description] 標題(默認第一行) * @param integer $line [description] 從第幾行開始寫 * @param integer $offset [description] 共計寫幾行 * @return [type] [description] */ public function putCsv($csvFileName, $dataArr ,$haderText = '', $line = 0, $offset = 0){ $handle = fopen($csvFileName,"w");//寫方式打開 if(!$handle){ return '文件打開失敗'; } //判斷是否定義頭標題 if(!empty($haderText)){ $re = fputcsv($handle,$haderText);//該函數返回寫入字符串的長度。若出錯,則返回 false。。 } foreach ($dataArr as $key => $value) { $re = fputcsv($handle,$value);//該函數返回寫入字符串的長度。若出錯,則返回 false。。 } } }
運行結果:
找到生成的csv文件,先使用記事本打開;

編碼和內容都正常,唯一的不足就是沒有自動換行;
在使用excel打開

3.2、提前對中文進行轉碼導出
<?php class Excel{ /** * [putCsv description] * @param string $csvFileName [description] 文件名 * @param array $dataArr [description] 數組,每組數據都是使用,分割的字符串 * @param string $haderText [description] 標題 * @return [type] [description] */ public function putCsv($csvFileName, $dataArr ,$haderText = ''){ $handle = fopen($csvFileName,"w");//寫方式打開 if(!$handle){ return '文件打開失敗'; } //判斷是否定義頭標題 if(!empty($haderText)){ foreach ($haderText as $key => $value) { $haderText[$key] = iconv("utf-8","gbk//IGNORE",$value);//對中文編碼進行處理 } $re = fputcsv($handle,$haderText);//該函數返回寫入字符串的長度。若出錯,則返回 false。。 } foreach ($dataArr as $key => $value) { foreach ($value as $k => $v) { $value[$k] = iconv("utf-8","gbk//IGNORE",$v);//對中文編碼進行處理 } $re = fputcsv($handle,$value);//該函數返回寫入字符串的長度。若出錯,則返回 false。。 } } }
導出結果:

4、導入csv文件
導入csv文件也需要對中文進行轉碼處理
/**
* [getCsv description] 導出csv文件
* @param string $csvFileName [description] 文件名
* @param integer $line [description] 讀取幾行,默認全部讀取
* @param integer $offset [description] 從第幾行開始讀,默認從第一行讀取
* @return [type] [description]
*/ public function getCsv($csvFileName, $line = 0, $offset = 0){ $handle = fopen($csvFileName,'r');//打開文件,如果打開失敗,本函數返回 FALSE。 if(!$handle){ return '文件打開失敗'; } //fgetcsv() 出錯時返回 FALSE,包括碰到文件結束時。 $i = 0;//用於記錄while的循環次數,方便與$line,$offset比較 $arr = array();//結果的存放數組 while($data = fgetcsv($handle)){ //小於偏移量則不讀取,但$i仍然需要自增 if($i < $offset && $offset){ $i++; continue; } //大於讀取行數則退出 if($i > $line && $line){ break; } $i++; foreach ($data as $key => $value) { $content = iconv("gbk","utf-8//IGNORE",$value);//轉化編碼 $arr[] = $content;//至於如何處理這個結果,需要根據實際情況而定 } } return $arr; }
csv導入數據是一格一格讀取,所以在處理過程中相對麻煩,需要提前知道一行有幾列,因為是測試,所以沒有對結果進行特殊的處理。
5、總結
注意導入和導出的過程中,遇到中文字符一定要記得轉碼,否則可能會出現中文亂碼的情況。
csv文件的導入導出相對於xls文件操作容易。
原文地址:http://www.cnblogs.com/ImCehnyx/p/7198139.html