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 相关文章推荐
php实现查看邮件是否已被阅读的方法
Dec 03 PHP
PHP限制页面只能在微信自带浏览器访问的代码
Jan 15 PHP
php函数实现判断是否移动端访问
Mar 03 PHP
PHP实现适用于文件内容操作的分页类
Jun 15 PHP
golang与PHP输出excel示例
Jul 22 PHP
php对接java现实加签验签的实例
Nov 25 PHP
PHP检测数据类型的几种方法(总结)
Mar 04 PHP
Thinkphp3.2简单解决多文件上传只上传一张的问题
Sep 26 PHP
分析php://output和php://stdout的区别
May 06 PHP
详解php伪造Referer请求反盗链资源
Jan 24 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
Jan 22 PHP
Laravel + Elasticsearch 实现中文搜索的方法
Feb 02 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
PHP中10个不常见却非常有用的函数
2010/03/21 PHP
PHP大小写问题:函数名和类名不区分,变量名区分
2013/06/17 PHP
ThinkPHP模板自定义标签使用方法
2014/06/26 PHP
PHP 表单提交及处理表单数据详解及实例
2016/12/27 PHP
FCK调用方法..
2006/12/21 Javascript
js中更短的 Array 类型转换
2011/10/30 Javascript
js二级地域选择的实现方法
2013/06/17 Javascript
css与javascript跨浏览器兼容性总结
2014/09/15 Javascript
Node.js中使用mongoskin操作mongoDB实例
2014/09/28 Javascript
js判断日期时间有效性的方法
2015/10/24 Javascript
jQuery easyui刷新当前tabs的方法
2016/09/23 Javascript
VuePress 中如何增加用户登录功能
2019/11/29 Javascript
JavaScript 链表定义与使用方法示例
2020/04/28 Javascript
vue实现简单跑马灯效果
2020/05/25 Javascript
[02:18]DOTA2英雄基础教程 育母蜘蛛
2014/01/20 DOTA
python中文乱码的解决方法
2013/11/04 Python
python操作数据库之sqlite3打开数据库、删除、修改示例
2014/03/13 Python
Python数据结构与算法之完全树与最小堆实例
2017/12/13 Python
Python 机器学习库 NumPy入门教程
2018/04/19 Python
django模板加载静态文件的方法步骤
2019/03/01 Python
如何写python的配置文件
2020/06/07 Python
pycharm 对代码做静态检查操作
2020/06/09 Python
美国在线印刷公司:PsPrint
2017/10/12 全球购物
宝拉珍选美国官网:Paula’s Choice美国
2018/01/07 全球购物
采购主管的岗位职责
2013/12/17 职场文书
五年级数学教学反思
2014/02/11 职场文书
高中教师评语大全
2014/04/25 职场文书
读书活动总结范文
2014/04/26 职场文书
中华美德颂演讲稿
2014/05/20 职场文书
2014年小学工作总结
2014/11/26 职场文书
本溪关门山导游词
2015/02/09 职场文书
2016年教师新年寄语
2015/08/18 职场文书
2016教师年度考核评语大全
2015/12/01 职场文书
2017春节晚会开幕词
2016/03/03 职场文书
Java集成swagger文档组件
2021/06/28 Java/Android
Redis唯一ID生成器的实现
2022/07/07 Redis