php实现CSV文件导入和导出


Posted in PHP onOctober 24, 2015

项目开发中,很多时候要将外部CSV文件导入到数据库中或者将数据导出为CSV文件,那么具体该如何实现呢?本文将使用PHP并结合mysql,实现了CSV格式数据的导入和导出功能。
我们先准备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程序设计有所帮助。

PHP 相关文章推荐
yii框架源码分析之创建controller代码
Jun 28 PHP
基于MySQL体系结构的分析
May 02 PHP
一个简单的PHP验证码实现代码
May 10 PHP
php图片处理函数获取类型及扩展名实例
Nov 19 PHP
PHP+JS实现大规模数据提交的方法
Jul 02 PHP
PHP mysqli_free_result()与mysqli_fetch_array()函数详解
Sep 21 PHP
thinkPHP模板引擎用法示例
Dec 08 PHP
CI框架实现框架前后端分离的方法详解
Dec 30 PHP
微信封装的调用微信签名包的类库
Jun 08 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
Aug 28 PHP
PHP asXML()函数讲解
Feb 03 PHP
php提供实现反射的方法和实例代码
Sep 17 PHP
PHP错误Warning:mysql_query()解决方法
Oct 24 #PHP
php实现表单多按钮提交action的处理方法
Oct 24 #PHP
一个简单至极的PHP缓存类代码
Oct 23 #PHP
10款实用的PHP开源工具
Oct 23 #PHP
PHP制作用户注册系统
Oct 23 #PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
Oct 23 #PHP
PHP中文竖排转换实现方法
Oct 23 #PHP
You might like
数据库中排序的对比及使用条件详解
2012/02/23 PHP
PHP版 汉字转码的实现详解
2013/06/09 PHP
Yii中CGridView关联表搜索排序方法实例详解
2014/12/03 PHP
php获取远程文件大小
2015/10/20 PHP
合格的PHP程序员必备技能
2015/11/13 PHP
php获取本机真实IP地址实例代码
2016/03/31 PHP
PHP简单预防sql注入的方法
2016/09/27 PHP
JS操作图片(增,删,改) 例子
2013/04/17 Javascript
jquery模拟SELECT下拉框取值效果
2013/10/23 Javascript
一个检测表单数据的JavaScript实例
2014/10/31 Javascript
值得分享和收藏的Bootstrap学习教程
2016/05/12 Javascript
第十篇BootStrap轮播插件使用详解
2016/06/21 Javascript
修改jquery中dialog的title属性方法(推荐)
2016/08/26 Javascript
微信小程序全局变量GLOBALDATA的定义和调用过程解析
2019/09/23 Javascript
node.js使用zlib模块进行数据压缩和解压操作示例
2020/02/12 Javascript
原生js实现下拉框选择组件
2021/01/20 Javascript
[03:57]《不朽》——2015DOTA2国际邀请赛—中国军团出征主题曲MV
2015/07/15 DOTA
在Python的Django框架中显示对象子集的方法
2015/07/21 Python
django-rest-swagger对API接口注释的方法
2019/08/29 Python
Python 面向对象之类class和对象基本用法示例
2020/02/02 Python
python代码区分大小写吗
2020/06/17 Python
Python虚拟环境的创建和使用详解
2020/09/07 Python
python中_del_还原数据的方法
2020/12/09 Python
HTML5本地存储之Web Storage应用介绍
2013/01/06 HTML / CSS
有关HTML5 Video对象的ontimeupdate事件(Chrome上无效)的问题
2013/07/19 HTML / CSS
18-35岁旅游团的全球领导者:Contiki
2017/02/08 全球购物
iHerb台湾:维生素、保健品和健康产品
2018/01/31 全球购物
Carrs Silver官网:英国著名的银器品牌
2020/08/29 全球购物
Android interview questions
2016/12/25 面试题
外语专业毕业生自我评价分享
2013/10/05 职场文书
写给妈妈的道歉信
2014/01/11 职场文书
车间主任岗位职责
2014/03/16 职场文书
三严三实学习心得体会
2014/10/13 职场文书
网络管理员岗位职责
2015/02/12 职场文书
高中升旗仪式主持词
2015/07/03 职场文书
24句精辟的现实社会语录,句句扎心,道尽人性
2019/08/29 职场文书