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中利用XML技术构造远程服务(下)
Oct 09 PHP
菜鸟学PHP之Smarty入门
Jan 04 PHP
PHP 错误之引号中使用变量
May 04 PHP
一个简单的php加密解密函数(动态加密)
Jun 19 PHP
PHP中常用的转义函数
Feb 28 PHP
神盾加密解密教程(一)PHP变量可用字符
May 28 PHP
PHP中new static()与new self()的区别异同分析
Aug 22 PHP
php获取当月最后一天函数分享
Feb 02 PHP
织梦sitemap地图实时推送给百度的教程
Aug 03 PHP
微信利用PHP创建自定义菜单的方法
Aug 01 PHP
thinkphp3.2实现在线留言提交验证码功能
Jul 19 PHP
windows环境下使用Composer安装ThinkPHP5
May 18 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&amp;&amp;mysql)二
2006/10/09 PHP
php中看实例学正则表达式
2006/12/25 PHP
php URL跳转代码 减少外链
2011/06/25 PHP
安装ImageMagick出现error while loading shared libraries的解决方法
2014/09/23 PHP
php数组比较实现查找连续数的方法
2015/07/29 PHP
jQuery JSON的解析方式分享
2011/04/05 Javascript
jQuery的控件及事件(输入控件及回车事件)使用示例
2013/07/25 Javascript
JSuggest自动匹配下拉框使用方法(示例代码)
2013/12/27 Javascript
跟我学Nodejs(二)--- Node.js事件模块
2014/05/21 NodeJs
jquery实现TAB选项卡鼠标经过带延迟效果的方法
2015/07/27 Javascript
浅谈jQuery中ajaxPrefilter的应用
2016/08/01 Javascript
使用BootStrap实现用户登录界面UI
2016/08/10 Javascript
Angular.js指令学习中一些重要属性的用法教程
2017/05/24 Javascript
详解JavaScript按概率随机生成事件
2017/08/02 Javascript
Vue实现简易翻页效果源码分享
2018/11/08 Javascript
TypeScript中使用getElementXXX()的示例代码
2019/09/12 Javascript
微信小程序左右滚动公告栏效果代码实例
2019/09/16 Javascript
jQuery实现图片随机切换、抽奖功能(实例代码)
2019/10/23 jQuery
Layui实现数据表格默认全部显示(不要分页)
2019/10/26 Javascript
微信小程序实现弹框效果
2020/05/26 Javascript
[20:57]Ti4主赛事第三天开幕式
2014/07/21 DOTA
利用python批量修改word文件名的方法示例
2017/10/17 Python
Python实现登陆文件验证方法
2018/10/06 Python
运用Python的webbrowser实现定时打开特定网页
2019/02/21 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
2019/11/08 Python
pandas和spark dataframe互相转换实例详解
2020/02/18 Python
python3实现语音转文字(语音识别)和文字转语音(语音合成)
2020/10/14 Python
python判断all函数输出结果是否为true的方法
2020/12/03 Python
浅谈基于HTML5的在线视频播放方案
2016/02/18 HTML / CSS
中国跨境电子商务网站:NewFrog
2018/03/10 全球购物
常务副总经理岗位职责
2014/04/12 职场文书
社团活动总结
2014/04/28 职场文书
房产公证书
2015/01/23 职场文书
新生开学寄语大全
2015/05/28 职场文书
springboot临时文件存储目录配置方式
2021/07/01 Java/Android
关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
2021/12/06 Java/Android