详解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控制用户的浏览器--ob*函数的使用说明
Mar 16 PHP
PHP持久连接mysql_pconnect()函数使用介绍
Feb 05 PHP
PHP得到mssql的存储过程的输出参数功能实现
Nov 23 PHP
php递归使用示例(php递归函数)
Feb 14 PHP
php统计文章排行示例
Mar 04 PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
Aug 18 PHP
PHP配置把错误日志以邮件方式发送方法(Windows系统)
Jun 23 PHP
深入理解PHP中的count函数
May 31 PHP
php 如何获取文件的后缀名
Jun 05 PHP
PHP基于关联数组20行代码搞定约瑟夫问题示例
Nov 07 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
Dec 26 PHP
php中curl和soap方式请求服务超时问题的解决
Jun 11 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
Protoss兵种介绍
2020/03/14 星际争霸
php的大小写敏感问题整理
2011/12/29 PHP
解析thinkphp中的M()与D()方法的区别
2013/06/22 PHP
让你的PHP7更快之Hugepage用法分析
2016/05/31 PHP
jquery遍历input取得input的name
2009/04/27 Javascript
jquery增加时编辑jqGrid(实例代码)
2013/11/08 Javascript
JavaScript检测实例属性, 原型属性
2015/02/04 Javascript
AngularJs IE Compatibility 兼容老版本IE
2016/09/01 Javascript
Vue.js中用webpack合并打包多个组件并实现按需加载
2017/02/17 Javascript
jQuery模拟下拉框选择对应菜单的内容
2017/03/07 Javascript
浅谈vue+webpack项目调试方法步骤
2017/09/11 Javascript
jQuery EasyUI window窗口使用实例代码
2017/12/25 jQuery
对vue中methods互相调用的方法详解
2018/08/30 Javascript
vue Element左侧无限级菜单实现
2020/06/10 Javascript
基于原生JS封装的Modal对话框插件的示例代码
2020/09/09 Javascript
解决VUE项目使用Element-ui 下拉组件的验证失效问题
2020/11/07 Javascript
[01:57]DOTA2上海特锦赛小组赛解说单车采访花絮
2016/02/27 DOTA
[49:41]NB vs NAVI Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
[01:33:07]VGJ.T vs Newbee Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
Python超越函数积分运算以及绘图实现代码
2019/11/20 Python
django框架auth模块用法实例详解
2019/12/10 Python
python数据库编程 ODBC方式实现通讯录
2020/03/27 Python
使用Keras建立模型并训练等一系列操作方式
2020/07/02 Python
Python jieba结巴分词原理及用法解析
2020/11/05 Python
保时捷设计:Porsche Design
2019/03/30 全球购物
正隆泰信息技术有限公司上机题
2012/06/14 面试题
土木工程专业个人求职信
2013/12/30 职场文书
送餐员岗位职责范本
2014/02/21 职场文书
中西医专业毕业生职业规划书
2014/02/24 职场文书
《画家乡》教学反思
2014/04/22 职场文书
工伤事故赔偿协议书范文
2014/09/24 职场文书
2014幼儿园大班工作总结
2014/11/10 职场文书
2014年电话销售工作总结
2014/12/01 职场文书
Go语言中break label与goto label的区别
2021/04/28 Golang
你真的了解redis为什么要提供pipeline功能
2021/06/22 Redis
实例详解Python的进程,线程和协程
2022/03/13 Python