详解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 相关文章推荐
用php将任何格式视频转为flv的代码
Sep 03 PHP
使用PHP提取视频网站页面中的FLASH地址的代码
Apr 17 PHP
深入PHP运行环境配置的详解
Jun 04 PHP
PHP抓屏函数实现屏幕快照代码分享
Jan 02 PHP
MongoDB在PHP中的常用操作小结
Feb 20 PHP
php curl 获取https请求的2种方法
Apr 27 PHP
ThinkPHP的常用配置选项汇总
Mar 24 PHP
php中实现进程锁与多进程的方法
Sep 18 PHP
PHP jQuery+Ajax结合写批量删除功能
May 19 PHP
php中各种定义变量的方法小结
Oct 18 PHP
不常用但很实用的PHP预定义变量分析
Jun 25 PHP
laravel按天、按小时,查询数据的实例
Oct 09 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 session应用实例 登录验证
2009/03/16 PHP
php模拟socket一次连接,多次发送数据的实现代码
2011/07/26 PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
2016/03/01 PHP
php compact 通过变量创建数组
2016/11/15 PHP
关于js类的定义
2011/06/28 Javascript
js 验证密码强弱的小例子
2013/03/21 Javascript
jQuery控制iFrame(实例代码)
2013/11/19 Javascript
js实现文字超出部分用省略号代替实例代码
2016/09/01 Javascript
解析JavaScript实现DDoS攻击原理与保护措施
2016/12/26 Javascript
Node.js websocket使用socket.io库实现实时聊天室
2017/02/20 Javascript
使用Vue完成一个简单的todolist的方法
2017/12/01 Javascript
浅谈vue异步数据影响页面渲染
2019/10/29 Javascript
高效jQuery选择器的5个技巧实例分析
2019/11/26 jQuery
python使用SMTP发送qq或sina邮件
2017/10/21 Python
Python实现的插入排序算法原理与用法实例分析
2017/11/22 Python
tensorflow如何批量读取图片
2019/08/29 Python
python使用 __init__初始化操作简单示例
2019/09/26 Python
tensorflow求导和梯度计算实例
2020/01/23 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
2020/04/14 Python
Python3实现个位数字和十位数字对调, 其乘积不变
2020/05/03 Python
Django中的AutoField字段使用
2020/05/18 Python
浅析Python 抽象工厂模式的优缺点
2020/07/13 Python
P D PAOLA意大利官网:西班牙著名的珠宝首饰品牌
2019/09/24 全球购物
夏季奶茶店创业计划书
2014/01/16 职场文书
学校后勤岗位职责
2014/02/19 职场文书
社区党员公开承诺书
2014/08/30 职场文书
体育专业大学生职业生涯规划范文:打造自己的运动帝国
2014/09/12 职场文书
2014光棍节单身联谊活动策划书
2014/10/10 职场文书
2014酒店客房部工作总结
2014/12/16 职场文书
2015年售票员工作总结
2015/04/29 职场文书
2015年仓库管理工作总结
2015/05/25 职场文书
贷款工作证明模板
2015/06/12 职场文书
2016年小学生寒假总结
2015/10/10 职场文书
2016暑期社会实践新闻稿
2015/11/25 职场文书
IDEA使用SpringAssistant插件创建SpringCloud项目
2021/06/23 Java/Android
Java虚拟机内存结构及编码实战分享
2022/04/07 Java/Android