详解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边学边教》(02.Apache+PHP环境配置――上篇)
Dec 13 PHP
PHP开发中常用的三个表单验证函数使用小结
Mar 03 PHP
php date()日期时间函数详解
May 16 PHP
PHP中使用gettext来支持多语言的方法
May 02 PHP
PHP采集利器 Snoopy 试用心得
Jul 03 PHP
php中的动态调用实例分析
Jan 07 PHP
PHP中返回引用类型的方法
Apr 03 PHP
学习php设计模式 php实现命令模式(command)
Dec 08 PHP
thinkphp Apache配置重启Apache1 restart 出错解决办法
Feb 15 PHP
PHP简单实现正则匹配省市区的方法
Apr 13 PHP
详解php中curl返回false的解决办法
Mar 18 PHP
微信小程序和php的登录实现
Apr 01 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 连接mssql数据库 初学php笔记
2010/03/01 PHP
php实现的短网址算法分享
2014/06/20 PHP
php变量与数组相互转换的方法(extract与compact)
2016/12/02 PHP
tp5 实现列表数据根据状态排序
2019/10/18 PHP
js获取location.href的参数实例代码
2013/08/02 Javascript
推荐一款jQuery插件模板
2015/01/09 Javascript
JS选中checkbox后获取table内一行TD所有数据的方法
2015/07/01 Javascript
jQuery实现带有洗牌效果的动画分页实例
2015/08/31 Javascript
jQuery unbind 删除绑定事件详解
2016/05/24 Javascript
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
2016/10/08 Javascript
angular使用bootstrap方法手动启动的实例代码
2017/07/18 Javascript
Vue编写多地区选择组件
2017/08/21 Javascript
JavaScript+CSS相册特效实例代码
2017/09/07 Javascript
浅析Vue.js中v-bind v-model的使用和区别
2018/12/04 Javascript
vue组件通信传值操作示例
2019/01/08 Javascript
解决VUE项目localhost端口服务器拒绝连接,只能用127.0.0.1的问题
2020/08/14 Javascript
[01:03:13]VG vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
用Python编写一个简单的FUSE文件系统的教程
2015/04/02 Python
python执行等待程序直到第二天零点的方法
2015/04/23 Python
python 字典(dict)按键和值排序
2016/06/28 Python
Python实现KNN(K-近邻)算法的示例代码
2019/03/05 Python
python如何实现代码检查
2019/06/28 Python
解决Keras 与 Tensorflow 版本之间的兼容性问题
2020/02/07 Python
Python 解决火狐浏览器不弹出下载框直接下载的问题
2020/03/09 Python
浅谈python3 构造函数和析构函数
2020/03/12 Python
Python使用windows设置定时执行脚本
2020/11/12 Python
详解如何在css中引入自定义字体(font-face)
2018/05/17 HTML / CSS
日常奢侈品,轻松购物:Verishop
2019/08/20 全球购物
工商管理专业实习大学生自我鉴定
2013/09/19 职场文书
会展策划与管理专业大学生职业生涯规划
2014/02/07 职场文书
廉洁自律演讲稿
2014/05/22 职场文书
活动总结书怎么写
2015/05/11 职场文书
电影红河谷观后感
2015/06/11 职场文书
父亲去世追悼词
2015/06/23 职场文书
如何利用js在两个html窗口间通信
2021/04/27 Javascript
Flask使用SQLAlchemy实现持久化数据
2021/07/16 Python