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自动跳转中英文页面
Jul 29 PHP
php中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
Mar 29 PHP
PHP中其实也可以用方法链
Nov 10 PHP
dhtmlxTree目录树增加右键菜单以及拖拽排序的实现方法
Apr 26 PHP
php遍历文件夹下的所有文件和子文件夹示例
Mar 20 PHP
ThinkPHP实现二级循环读取的方法
Nov 03 PHP
php判断对象是派生自哪个类的方法
Jun 20 PHP
WordPress中限制非管理员用户在文章后只能评论一次
Dec 31 PHP
thinkPHP中多维数组的遍历方法
Jan 09 PHP
详解PHP数据压缩、加解密(pack, unpack)
Dec 17 PHP
利用PHP_XLSXWriter代替PHPExcel的方法示例
Jul 16 PHP
PHP设计模式之注册树模式分析
Jan 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
在PHP中设置、使用、删除Cookie的解决方法
2013/05/06 PHP
php搜索文件程序分享
2015/10/30 PHP
HR vs CL BO3 第一场 2.13
2021/03/10 DOTA
xml文档转换工具,附图表例子(hta)
2010/11/17 Javascript
JavaScript建立一个语法高亮输入框实现思路
2013/02/26 Javascript
javascript实现文字图片上下滚动的具体实例
2013/06/28 Javascript
javascript Event对象详解及使用示例
2013/11/22 Javascript
js跳转页面方法总结
2014/01/29 Javascript
jQuery不兼容input的change事件问题解决过程
2014/12/05 Javascript
js实现按钮控制图片360度翻转特效的方法
2015/02/17 Javascript
JavaScript阻止回车提交表单的方法
2015/12/30 Javascript
JS简单生成随机数(随机密码)的方法
2017/05/11 Javascript
jQuery dateRangePicker插件使用方法详解
2017/07/28 jQuery
vue2.0在没有dev-server.js下的本地数据配置方法
2018/02/23 Javascript
Vue.js 时间转换代码及时间戳转时间字符串
2018/10/16 Javascript
Bootstrap 实现表格样式、表单布局的实例代码
2018/12/09 Javascript
小程序实现录音上传功能
2019/11/22 Javascript
Python只用40行代码编写的计算器实例
2017/05/10 Python
Python对List中的元素排序的方法
2018/04/01 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
2018/04/22 Python
Sanic框架蓝图用法实例分析
2018/07/17 Python
Python3实现统计单词表中每个字母出现频率的方法示例
2019/01/28 Python
使用celery执行Django串行异步任务的方法步骤
2019/06/06 Python
Python 的AES加密与解密实现
2019/07/09 Python
tensorflow 获取所有variable或tensor的name示例
2020/01/04 Python
浅析Python的命名空间与作用域
2020/11/25 Python
CSS3新增布局之: flex详解
2020/06/18 HTML / CSS
美国知名的时尚购物网站:Anthropologie
2016/12/22 全球购物
早读迟到检讨书
2014/01/24 职场文书
音乐教学反思
2014/02/02 职场文书
办公设备采购方案
2014/03/16 职场文书
闭幕式主持词
2014/04/02 职场文书
教育系统干部作风整顿心得体会
2014/09/09 职场文书
2016领导干部廉洁从政心得体会
2016/01/19 职场文书
Vue Element UI自定义描述列表组件
2021/05/18 Vue.js
Opencv实现二维直方图的计算及绘制
2021/07/21 Python