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制作静态网站的模板框架(四)
Oct 09 PHP
如何跨站抓取别的站点的页面的补充
Oct 09 PHP
php SQL之where语句生成器
Mar 24 PHP
php实现上传图片生成缩略图示例
Apr 13 PHP
php调用nginx的mod_zip模块打包ZIP文件
Jun 11 PHP
Smarty变量调节器失效的解决办法
Aug 20 PHP
php比较相似字符串的方法
Jun 05 PHP
WampServer搭建php环境时遇到的问题汇总
Jul 23 PHP
php创建图像具体步骤
Mar 13 PHP
thinkPHP中钩子的使用方法实例分析
Nov 16 PHP
PHP开发实现微信退款功能示例
Nov 25 PHP
phpQuery采集网页实现代码实例
Apr 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
WindowsXP中快速配置Apache+PHP5+Mysql
2008/06/05 PHP
Yii框架响应组件用法实例分析
2019/09/04 PHP
关于laravel 子查询 &amp; join的使用
2019/10/16 PHP
用javascript实现的支持lrc歌词的播放器
2007/05/17 Javascript
jQuery 入门级学习笔记及源码
2010/01/22 Javascript
window.onload和$(function(){})的区别介绍
2013/10/30 Javascript
利用jquery.qrcode在页面上生成二维码且支持中文
2014/02/12 Javascript
javascript框架设计读书笔记之字符串的扩展和修复
2014/12/02 Javascript
JS显示下拉列表框内全部元素的方法
2015/03/31 Javascript
javascript实现炫酷的拖动分页
2015/05/11 Javascript
javaScript中slice函数用法实例分析
2015/06/08 Javascript
完善的jquery处理机制
2016/02/21 Javascript
JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)
2016/06/02 Javascript
JS关闭窗口时产生的事件及用法示例
2016/08/20 Javascript
详解Vue 普通对象数据更新与 file 对象数据更新
2017/04/26 Javascript
微信JSSDK调用微信扫一扫功能的方法
2017/07/25 Javascript
vue项目打包后打开页面空白解决办法
2018/06/29 Javascript
Vue项目使用localStorage+Vuex保存用户登录信息
2019/05/27 Javascript
element-ui中Table表格省市区合并单元格的方法实现
2019/08/07 Javascript
Javascript实现鼠标点击冒泡特效
2019/12/24 Javascript
js实现扫雷源代码
2020/11/27 Javascript
一行JavaScript代码如何实现瀑布流布局
2020/12/11 Javascript
[03:24]CDEC.Y赛前采访 努力备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
[00:13]天涯墨客二技能展示
2018/08/25 DOTA
python字符串的常用操作方法小结
2016/05/21 Python
python+mysql实现学生信息查询系统
2019/02/21 Python
在pytorch中实现只让指定变量向后传播梯度
2020/02/29 Python
Python callable内置函数原理解析
2020/03/05 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
2020/08/07 Python
CSS3提交意见输入框样式代码
2014/10/30 HTML / CSS
html5基础教程常用技巧整理
2013/08/20 HTML / CSS
英格兰橄榄球商店:England Rugby Store
2016/12/17 全球购物
有趣的睡衣和礼物:LazyOne
2019/11/27 全球购物
研发工程师的岗位职责
2013/11/18 职场文书
在职证明书范本(2014新版)
2014/09/25 职场文书
工厂仓管员岗位职责
2015/04/01 职场文书