详解PHP导入导出CSV文件


Posted in PHP onNovember 03, 2014

我们先准备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" onclick="window.location.href='do.php?   

    action=export'"></p>  

</form> 

选择好本地csv文件后,点击导入,提交到do.php?action=import处理,而点击导出按钮则请求地址do.php?action=export进行数据导出处理。

1.导入CSV
do.php需要根据get过来的参数,分别处理导入和导出过程,php结构如下:

include_once ("connect.php"); //连接数据库   

$action = $_GET['action'];   

if ($action == 'import') //导入CSV   

{   

    //导入处理   

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

{   

    //导出处理    

} 

导入CSV处理流程:校验csv文件合法性(本文忽略)->打开读入并解析csv文件中的字段->循环获取各字段值->批量添加到数据表中->完成。

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

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

    if(emptyempty ($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文件字段解析并以数组的形式返回。

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.导出CSV

我们知道csv文件是由逗号分割符组成的纯文本文件,你可以用excel打开,效果跟xls表个一样。
导出CSV处理流程:读取学生信息表->循环记录构建逗号分隔的字段信息->设置header信息->导出文件(下载)到本地

...   

}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信息,代码如下:

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编码,遇到中文字符一定要记得转码,否则可能会出现中文乱码的情况。
好了,本文讲解到此,后面我还会有文章介绍PHP结合mysql导入导出excel,以及xml的导入导出,敬请关注。

PHP 相关文章推荐
一个高ai的分页函数和一个url函数
Oct 09 PHP
基于flush()不能按顺序输出时的解决办法
Jun 29 PHP
php的$_FILES的临时储存文件与回收机制实测过程
Jul 12 PHP
ThinkPHP应用模式扩展详解
Jul 16 PHP
值得分享的php+ajax实时聊天室
Jul 20 PHP
PHP获取当前文件的父目录方法汇总
Jul 21 PHP
php 获取文件行数的方法总结
Oct 11 PHP
PHP正则删除HTML代码中宽高样式的方法
Jun 12 PHP
php通过pecl方式安装扩展的实例讲解
Feb 02 PHP
PHP hebrev()函数用法讲解
Feb 21 PHP
PHP简单验证码功能机制实例详解
Mar 27 PHP
Yii框架通过请求组件处理get,post请求的方法分析
Sep 03 PHP
php实现图片文件与下载文件防盗链的方法
Nov 03 #PHP
php过滤表单提交的html等危险代码
Nov 03 #PHP
PHP屏蔽过滤指定关键字的方法
Nov 03 #PHP
php中count获取多维数组长度的方法
Nov 03 #PHP
Codeigniter(CI)框架分页函数及相关知识
Nov 03 #PHP
ThinkPHP实现带验证码的文件上传功能实例
Nov 01 #PHP
ThinkPHP模板之变量输出、自定义函数与判断语句用法
Nov 01 #PHP
You might like
php提示Warning:mysql_fetch_array() expects的解决方法
2014/12/16 PHP
thinkPHP框架RBAC实现原理分析
2019/02/01 PHP
jquery插件之easing使用
2010/08/19 Javascript
从零开始学习jQuery (二) 万能的选择器
2010/10/01 Javascript
extjs两个tbar问题探讨
2013/08/08 Javascript
js 鼠标移动显示图片的简单实例
2013/12/25 Javascript
node.js不得不说的12点内容
2014/07/14 Javascript
详解JavaScript的Date对象(制作简易钟表)
2020/04/07 Javascript
详解js的事件代理(委托)
2016/12/22 Javascript
详解Vue使用命令行搭建单页面应用
2017/05/24 Javascript
jquery DataTable实现前后台动态分页
2017/06/17 jQuery
javascript实现Emrips反质数枚举的示例代码
2017/12/06 Javascript
javaScript中的空值和假值
2017/12/18 Javascript
详解webpack loader和plugin编写
2018/10/12 Javascript
vue-router命名视图的使用讲解
2019/01/19 Javascript
vantUI 获得piker选中值的自定义ID操作
2020/11/04 Javascript
[02:51]DOTA2 2015国际邀请赛中国区预选赛第一日战报
2015/05/27 DOTA
[00:49]完美世界DOTA2联赛10月28日开团时刻:随便打
2020/10/29 DOTA
python线程锁(thread)学习示例
2013/12/04 Python
寻找网站后台地址的python脚本
2014/09/01 Python
Python的Django框架中的Context使用
2015/07/15 Python
win7下python3.6安装配置方法图文教程
2018/07/31 Python
详解如何将python3.6软件的py文件打包成exe程序
2018/10/09 Python
python sqlite的Row对象操作示例
2019/09/11 Python
Python3和PyCharm安装与环境配置【图文教程】
2020/02/14 Python
CSS3打造百度贴吧的3D翻牌效果示例
2017/01/04 HTML / CSS
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
12月小学生校园广播稿
2014/02/04 职场文书
工作睡觉检讨书
2014/02/25 职场文书
知识竞赛主持词
2014/03/26 职场文书
学生实习证明范文
2014/09/28 职场文书
校长师德师风自我剖析材料
2014/09/29 职场文书
环卫个人总结
2015/03/03 职场文书
辩论赛开场白大全(主持人+辩手)
2015/05/29 职场文书
Python中使用Lambda函数的5种用法
2021/04/01 Python
MySQL使用IF语句及用case语句对条件并结果进行判断 
2022/09/23 MySQL