天天看點

使用PHP導入與導出CSV檔案執行個體詳解

在php程式設計中,導入與導出csv檔案經常會用得到,通過一個完整的執行個體來學習php csv檔案的導入與導出的方法,有需要的朋友參考下。

項目開發中,很多時候要将外部CSV檔案導入到資料庫中或者将資料導出為CSV檔案,那麼具體該如何實作呢?

本文将使用PHP并結合mysql,實作了CSV格式資料的導入和導出功能。

準備mysql資料表,假設項目中有一張記錄學生資訊的表student,并有id,name,sex,age分别記錄學生的姓名、性别、年齡等資訊。

複制代碼代碼示例:

CREATE TABLE `student` ( 

  `id` int(11) NOT NULL auto_increment, 

  `name` varchar(50) NOT NULL, 

  `sex` varchar(10) NOT NULL, 

  `age` smallint(3) NOT NULL default '0', 

  PRIMARY KEY  (`id`) 

) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

還需要一個html互動頁面,放置導入表單和導出按鈕。

複制代碼代碼示例:

<form id="addform" action="do.php?action=import" method="post" enctype="multipart/form-data"> 

    <p>請選擇要導入的CSV檔案:<br/><input type="file" name="file"> <input type="submit" 

    class="btn" value="導入CSV"> 

    <input type="button" class="btn" value="導出CSV" οnclick="window.location.href='do.php? 

    action=export'"></p> 

</form> 

選擇好本地csv檔案後,點選導入,送出到do.php?action=import處理,而點選導出按鈕則請求位址do.php?action=export進行資料導出處理。

1,php導入CSV

do.php需要根據get過來的參數,分别處理導入和導出過程,php結構: 

複制代碼代碼示例:

<?php

include_once ("connect.php"); //連接配接資料庫 

$action = $_GET['action']; 

if ($action == 'import') { //導入CSV 

   //導入處理 

} elseif ($action=='export') { //導出CSV 

   //導出處理 

}

導入CSV處理流程:

校驗csv檔案合法性(本文忽略)->打開讀入并解析csv檔案中的字段->循環擷取各字段值->批量添加到資料表中->完成。

代碼:

複制代碼代碼示例:

<?php

if ($action == 'import') { //導入CSV 

    $filename = $_FILES['file']['tmp_name']; 

    if (empty ($filename)) { 

        echo '請選擇要導入的CSV檔案!'; 

        exit; 

    } 

    $handle = fopen($filename, 'r'); 

    $result = input_csv($handle); //解析csv 

    $len_result = count($result); 

    if($len_result==0){ 

        echo '沒有任何資料!'; 

        exit; 

    } 

    for ($i = 1; $i < $len_result; $i++) { //循環擷取各字段值 

        $name = iconv('gb2312', 'utf-8', $result[$i][0]); //中文轉碼 

        $sex = iconv('gb2312', 'utf-8', $result[$i][1]); 

        $age = $result[$i][2]; 

        $data_values .= "('$name','$sex','$age'),"; 

    } 

    $data_values = substr($data_values,0,-1); //去掉最後一個逗号 

    fclose($handle); //關閉指針 

    $query = mysql_query("insert into student (name,sex,age) values $data_values");//批量插入資料表中 

    if($query){ 

        echo '導入成功!'; 

    }else{ 

        echo '導入失敗!'; 

    } 

注意,php自帶的fgetcsv函數可以輕松處理csv,使用該函數可以從檔案指針中讀入一行并解析CSV字段。

分享一個函數,将csv檔案字段解析并以數組的形式傳回。

代碼:

複制代碼代碼示例:

<?php

function input_csv($handle) { 

    $out = array (); 

    $n = 0; 

    while ($data = fgetcsv($handle, 10000)) { 

        $num = count($data); 

        for ($i = 0; $i < $num; $i++) { 

            $out[$n][$i] = $data[$i]; 

        } 

        $n++; 

    } 

    return $out; 

此外在導入到資料庫中時,我們采用的是批量插入而不是一條條插入的,是以在建構SQL語句時,要稍作處理,見代碼。

2,php導出CSV

csv檔案是由逗号分割符組成的純文字檔案,你可以用excel打開,效果跟xls表個一樣。

導出CSV處理流程:讀取學生資訊表->循環記錄建構逗号分隔的字段資訊->設定header資訊->導出檔案(下載下傳)到本地

代碼:

複制代碼代碼示例:

<?php

... 

} elseif ($action=='export') { //導出CSV 

    $result = mysql_query("select * from student order by id asc"); 

    $str = "姓名,性别,年齡\n"; 

    $str = iconv('utf-8','gb2312',$str); 

    while($row=mysql_fetch_array($result)){ 

        $name = iconv('utf-8','gb2312',$row['name']); //中文轉碼 

        $sex = iconv('utf-8','gb2312',$row['sex']); 

        $str .= $name.",".$sex.",".$row['age']."\n"; //用引文逗号分開 

    } 

    $filename = date('Ymd').'.csv'; //設定檔案名 

    export_csv($filename,$str); //導出 

}

将資料導出到本地,需要修改header資訊。

代碼:

複制代碼代碼示例:

<?php 

function export_csv($filename,$data) { 

    header("Content-type:text/csv"); 

    header("Content-Disposition:attachment;filename=".$filename); 

    header('Cache-Control:must-revalidate,post-check=0,pre-check=0'); 

    header('Expires:0'); 

    header('Pragma:public'); 

    echo $data; 

注意,導入和導出的過程中,因為使用的是統一UTF-8編碼,遇到中文字元一定要記得轉碼,否則可能會出現中文亂碼的情況。

原文:http://www.jquerycn.cn/a_25019