详解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中文件上传的安全问题
Oct 09 PHP
十天学会php(2)
Oct 09 PHP
Mysql中limit的用法方法详解与注意事项
Apr 19 PHP
获取远程文件大小的php函数
Jan 11 PHP
php 正确解码javascript中通过escape编码后的字符
Jan 28 PHP
PHP备份数据库生成SQL文件并下载的函数代码
Feb 05 PHP
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
Jun 23 PHP
浅析PHP中strlen和mb_strlen的区别
Aug 31 PHP
php实现的click captcha点击验证码类实例
Sep 23 PHP
php实现面包屑导航例子分享
Dec 19 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
Jun 28 PHP
php获取访问者浏览页面的浏览器类型
Jan 23 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执行速度全攻略(下)
2006/10/09 PHP
常用的php对象类型判断
2008/08/27 PHP
php跨服务器访问方法小结
2015/05/12 PHP
window.location.href的用法(动态输出跳转)
2014/08/09 Javascript
跟我学习javascript解决异步编程异常方案
2015/11/23 Javascript
jQuery实现订单提交页发送短信功能前端处理方法
2016/07/04 Javascript
微信小程序中使用javascript 回调函数
2017/05/11 Javascript
JavaScript实现自动跳转文本功能
2017/05/25 Javascript
微信小程序实现图片懒加载的示例代码
2017/12/13 Javascript
webpack中使用iconfont字体图标的方法
2018/02/22 Javascript
Vue组件开发技巧总结
2018/03/04 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
2018/08/28 Javascript
vue删除html内容的标签样式实例
2018/09/13 Javascript
微信小程序实现Session功能及无法获取session问题的解决方法
2019/05/07 Javascript
详解无限滚动插件vue-infinite-scroll源码解析
2019/05/12 Javascript
小程序实现锚点滑动效果
2019/09/23 Javascript
[37:45]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第二场 12.09
2020/12/11 DOTA
在Django的视图中使用form对象的方法
2015/07/18 Python
简述Python中的进程、线程、协程
2016/03/18 Python
Python自动生产表情包
2017/03/17 Python
Python实现SSH远程登陆,并执行命令的方法(分享)
2017/05/08 Python
Python 读取指定文件夹下的所有图像方法
2018/04/27 Python
Python用csv写入文件_消除空余行的方法
2018/07/06 Python
Python在cmd上打印彩色文字实现过程详解
2019/08/07 Python
使用Python完成15位18位身份证的互转功能
2019/11/06 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
2020/02/25 Python
Django中从mysql数据库中获取数据传到echarts方式
2020/04/07 Python
python实现飞船大战
2020/04/24 Python
Python如何在bool函数中取值
2020/09/21 Python
MAC Cosmetics巴西官方网站:M·A·C彩妆
2019/04/18 全球购物
拉飞逸官网:Lafayette 148 New York
2020/07/15 全球购物
合作意向协议书范本
2014/03/31 职场文书
房屋租赁授权委托书范本
2014/09/20 职场文书
党的群众路线教育实践活动先进个人材料
2014/12/24 职场文书
失职检讨书大全
2015/01/26 职场文书
mysql查找连续出现n次以上的数字
2022/05/11 MySQL