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 过滤器实现代码
Aug 09 PHP
PHPExcel读取Excel文件的实现代码
Dec 06 PHP
php中的curl_multi系列函数使用例子
Jul 29 PHP
php采集内容中带有图片地址的远程图片并保存的方法
Jan 03 PHP
Java和PHP在Web开发方面对比分析
Mar 01 PHP
Laravel 5框架学习之向视图传送数据
Apr 08 PHP
PHP中SSO Cookie登录分析和实现
Nov 06 PHP
PHP中header用法小结
May 23 PHP
PHP使用SMTP邮件服务器发送邮件示例
Aug 28 PHP
thinkPHP5.0框架事务处理操作简单示例
Sep 07 PHP
php设计模式之装饰模式应用案例详解
Jun 17 PHP
Laravel中如何轻松容易的输出完整的SQL语句
Jul 26 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
让你同时上传 1000 个文件 (一)
2006/10/09 PHP
php expects parameter 1 to be resource, array given 错误
2011/03/23 PHP
Yii2简单实现多语言配置的方法
2016/07/23 PHP
JavaScript 继承机制的实现(待续)
2010/05/18 Javascript
读jQuery之十 事件模块概述
2011/06/27 Javascript
浅谈JavaScript Array对象
2014/12/29 Javascript
jquery实现滑屏大图定时收缩为小banner图片的广告代码
2015/09/02 Javascript
AngularJs实现ng1.3+表单验证
2015/12/10 Javascript
JavaScript拖拽、碰撞、重力及弹性运动实例分析
2016/01/08 Javascript
jqueryMobile使用示例分享
2016/01/12 Javascript
JavaScript实现瀑布流布局
2020/06/28 Javascript
全面解析bootstrap格子布局
2016/05/22 Javascript
Angular2学习教程之ng中变更检测问题详解
2017/05/28 Javascript
响应式框架Bootstrap栅格系统的实例
2017/12/19 Javascript
vue循环中点击选中再点击取消(单选)的实现
2020/09/10 Javascript
js实现弹窗猜数字游戏
2020/11/26 Javascript
一个基于flask的web应用诞生 组织结构调整(7)
2017/04/11 Python
Python编程实现生成特定范围内不重复多个随机数的2种方法
2017/04/14 Python
python3 模拟登录v2ex实例讲解
2017/07/13 Python
python 脚本生成随机 字母 + 数字密码功能
2018/05/26 Python
python实现多人聊天室
2020/03/31 Python
python爬虫爬取笔趣网小说网站过程图解
2019/11/18 Python
python分别打包出32位和64位应用程序
2020/02/18 Python
Html5 web本地存储实例详解
2016/07/28 HTML / CSS
HTML5+CSS3模仿优酷视频截图功能示例
2017/01/05 HTML / CSS
HTML5表单验证特性(知识点小结)
2020/03/10 HTML / CSS
伦敦最有品味的百货:Liberty London
2016/11/12 全球购物
乌克兰珠宝大卖场:Zlato.ua
2020/09/27 全球购物
介绍一下Transact-SQL中SPACE函数的用法
2015/09/01 面试题
商学院大学生求职的自我评价
2014/03/12 职场文书
岗位安全生产责任书
2014/07/28 职场文书
社区志愿者活动方案
2014/08/18 职场文书
申报材料格式
2014/12/30 职场文书
超搞笑婚前保证书
2015/05/08 职场文书
Redis源码阅读:Redis字符串SDS详解
2021/07/15 Redis
python中pymysql包操作数据库方法
2022/04/19 Python