php 導入/導出 csv 文件


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打開
因為excel默認打開是gbk編碼,所以亂碼,可以使用記事本改編碼為ANSI格式

 

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。。 } } }
導出結果:
這樣處理,不管在txt文本還是excel中都是正常的。不會出現亂碼

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM