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 分页类(模仿google)-面试题目解答
Sep 13 PHP
php采集时被封ip的解决方法
Aug 29 PHP
php在多维数组中根据键名快速查询其父键以及父键值的代码
May 07 PHP
用C/C++扩展你的PHP 为你的php增加功能
Sep 06 PHP
解析php中array_merge与array+array的区别
Jun 21 PHP
探寻PHP脚本不报错的原因
Jun 12 PHP
php使用Cookie控制访问授权的方法
Jan 21 PHP
总结PHP中DateTime的常用方法
Aug 11 PHP
thinkPHP中session()方法用法详解
Dec 08 PHP
Laravel 中使用 Vue.js 实现基于 Ajax 的表单提交错误验证操作
Jun 30 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
Jul 10 PHP
Laravel学习基础之migrate的使用教程
Oct 11 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
全国FM电台频率大全 - 19 广东省
2020/03/11 无线电
聊天室php&amp;mysql(五)
2006/10/09 PHP
解析PHP中如何将数组变量写入文件
2013/06/06 PHP
CodeIgniter框架数据库基本操作示例
2018/05/24 PHP
让你的网站可编辑的实现js代码
2009/10/19 Javascript
js操作select控件的几种方法
2010/06/02 Javascript
借助javascript代码判断网页是静态还是伪静态
2014/05/05 Javascript
JQuery EasyUI 加载两次url的原因分析及解决方案
2014/08/18 Javascript
浅谈JavaScript 框架分类
2014/11/10 Javascript
JavaScript实现随机替换图片的方法
2015/04/16 Javascript
JavaScript根据CSS的Media Queries来判断浏览设备的方法
2016/05/10 Javascript
JavaScript实现数组降维详解
2017/01/05 Javascript
浅谈Javascript事件对象
2017/02/05 Javascript
浅谈jquery中ajax跨域提交的时候会有2次请求的问题
2017/11/10 jQuery
详解VUE中常用的几种import(模块、文件)引入方式
2018/07/03 Javascript
vue keep-alive列表页缓存 详情页返回上一页不刷新,定位到之前位置
2019/11/26 Javascript
如何在Node和浏览器控制台中打印彩色文字
2020/01/09 Javascript
Nodejs 数组的队列以及forEach的应用详解
2021/02/25 NodeJs
[36:33]完美世界DOTA2联赛循环赛 Matador vs Forest 第一场 11.06
2020/11/06 DOTA
Python 开发Activex组件方法
2009/11/08 Python
pandas按若干个列的组合条件筛选数据的方法
2018/04/11 Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
2019/05/18 Python
python 判断三个数字中的最大值实例代码
2019/07/24 Python
python 使用opencv 把视频分割成图片示例
2019/12/12 Python
django实现模板中的字符串文字和自动转义
2020/03/31 Python
Python3+Django get/post请求实现教程详解
2021/02/16 Python
Waterford加拿大官方网站:世界著名的水晶杯品牌
2016/11/01 全球购物
百丽国际旗下购物网站:优购
2017/02/28 全球购物
美国奢侈品在线团购网站:Gilt City
2017/11/16 全球购物
C语言笔试题回忆
2015/04/02 面试题
五四青年节的活动方案
2014/08/20 职场文书
2014小学年度工作总结
2014/12/20 职场文书
2014年稽查工作总结
2014/12/20 职场文书
Filebeat 采集 Nginx 日志的方法
2021/03/31 Servers
SpringBoot实现异步事件驱动的方法
2021/06/28 Java/Android
详解解Django 多对多表关系的三种创建方式
2021/08/23 Python