php 导入/导出 csv 文件

php 导入/导出 csv 文件

1、简介

项目开发中,很多时候要将外部CSV文件导入到数据库中或者将数据导出为CSV文件,那么具体该如何实现呢?本文将使用原生PHP,实现了CSV格式数据的导入和导出功能。并解决相关乱码问题。

将xls转换成csv的文本格式,然后再用php分析这个文件,和PHP分析文本没有什么区别。
优点:跨平台,效率比较高、可以读写。
缺点:只能直接使用csv的文件,如果经常接受.xls二进制文件的话需要手工转换,不能自动化。一个文件只有一个SHEET。

2、相关函数介绍

2.1、fgetcsv

参考:http://www.w3school.com.cn/php/func_filesystem_fgetcsv.asp

2.2、fputcsv

参考:http://www.w3school.com.cn/php/func_filesystem_fputcsv.asp

2.3、fopen

参考:http://www.w3school.com.cn/php/func_filesystem_fputcsv.asp

2.4、iconv

参考:http://php.net/manual/fr/function.iconv.php

本次大致会使用以上4个函数,实现csv文件的导入导出

3、如何导出csv文件

注:默认导出是utf8编码,需要对字符串进行转码,excel 打开文件默认是gbk编码,所以utf8导出在txt文件打开是正常,在excel打开是乱码

3.1、测试utf8导出

导出的数据格式

$head = array(‘编号‘,‘姓名‘,‘年龄‘,‘出生年月‘);
$data = array(
	array(‘001‘,‘zs‘,10,‘1991-1-1‘),
	array(‘002‘,‘李四‘,10,‘1991-1-1‘),
	array(‘003‘,‘王五‘,10,‘1991-1-1‘),
);
$obj->putCsv(‘putCsv.csv‘, $data, $head);
导出的方法:
class Excel{
	/**
	 * [putCsv description]
	 * @param  string  $csvFileName [description] 文件名
	 * @param  array   $dataArr     [description] 数组,每组数据都是使用,分割的字符串
	 * @param  string  $haderText   [description] 标题(默认第一行)
	 * @param  integer $line        [description] 从第几行开始写
	 * @param  integer $offset      [description] 共计写几行
	 * @return [type]               [description]
	 */
	public function putCsv($csvFileName, $dataArr ,$haderText = ‘‘, $line = 0, $offset = 0){
		$handle = fopen($csvFileName,"w");//写方式打开
		if(!$handle){
			return ‘文件打开失败‘;
		}
		//判断是否定义头标题
		if(!empty($haderText)){
			$re = fputcsv($handle,$haderText);//该函数返回写入字符串的长度。若出错,则返回 false。。
		}
		foreach ($dataArr as $key => $value) {
			$re = fputcsv($handle,$value);//该函数返回写入字符串的长度。若出错,则返回 false。。
		}
	}
}
运行结果:
找到生成的csv文件,先使用记事本打开;

编码和内容都正常,唯一的不足就是没有自动换行;
在使用excel打开

因为excel默认打开是gbk编码,所以乱码,可以使用记事本改编码为ANSI格式

3.2、提前对中文进行转码导出

<?php
class Excel{
	/**
	 * [putCsv description]
	 * @param  string  $csvFileName [description] 文件名
	 * @param  array   $dataArr     [description] 数组,每组数据都是使用,分割的字符串
	 * @param  string  $haderText   [description] 标题
	 * @return [type]               [description]
	 */
	public function putCsv($csvFileName, $dataArr ,$haderText = ‘‘){
		$handle = fopen($csvFileName,"w");//写方式打开
		if(!$handle){
			return ‘文件打开失败‘;
		}
		//判断是否定义头标题
		if(!empty($haderText)){
			foreach ($haderText as $key => $value) {
				$haderText[$key] = iconv("utf-8","gbk//IGNORE",$value);//对中文编码进行处理
			}
			$re = fputcsv($handle,$haderText);//该函数返回写入字符串的长度。若出错,则返回 false。。
		}
		foreach ($dataArr as $key => $value) {
			foreach ($value as $k => $v) {
				$value[$k] = iconv("utf-8","gbk//IGNORE",$v);//对中文编码进行处理
			}
			$re = fputcsv($handle,$value);//该函数返回写入字符串的长度。若出错,则返回 false。。
		}
	}
}
导出结果:

这样处理,不管在txt文本还是excel中都是正常的。不会出现乱码

4、导入csv文件

导入csv文件也需要对中文进行转码处理

/**
 * [getCsv description]  导出csv文件
 * @param  string  $csvFileName [description] 文件名
 * @param  integer $line        [description] 读取几行,默认全部读取
 * @param  integer $offset      [description] 从第几行开始读,默认从第一行读取
 * @return [type]               [description]
 */
public function getCsv($csvFileName, $line = 0, $offset = 0){
	$handle = fopen($csvFileName,‘r‘);//打开文件,如果打开失败,本函数返回 FALSE。
	if(!$handle){
		return ‘文件打开失败‘;
	}
	//fgetcsv() 出错时返回 FALSE,包括碰到文件结束时。
	$i = 0;//用于记录while的循环次数,方便与$line,$offset比较
	$arr = array();//结果的存放数组
	while($data = fgetcsv($handle)){
		//小于偏移量则不读取,但$i仍然需要自增
		if($i < $offset && $offset){
			$i++;
			continue;
		}
		//大于读取行数则退出
		if($i > $line && $line){
			break;
		}
		$i++;
		foreach ($data as $key => $value) {
			$content = iconv("gbk","utf-8//IGNORE",$value);//转化编码
			$arr[] = $content;//至于如何处理这个结果,需要根据实际情况而定
		}
	}
	return $arr;
}

csv导入数据是一格一格读取,所以在处理过程中相对麻烦,需要提前知道一行有几列,因为是测试,所以没有对结果进行特殊的处理。

5、总结

注意导入和导出的过程中,遇到中文字符一定要记得转码,否则可能会出现中文乱码的情况。
csv文件的导入导出相对于xls文件操作容易。原文地址:http://www.cnblogs.com/ImCehnyx/p/7198139.html
时间: 2024-10-25 11:49:33

php 导入/导出 csv 文件的相关文章

mysql SQLyog导入导出csv文件

1.选择数据库表 --> 右击属性 --> 备份/导出 --> 导出表数据作为 --> 选择cvs --> 选择下面的“更改” --> 字段 --> 变量长度 --> 字段被终止 -->输入逗号,(这是重点,否则导出的csv文件内容都在一列中,而不是分字段分列)下面两个选项框取消. 2.导出csv文件后,使用UE编辑器打开,另存为,选择编码为utf-8格式,保存. 3.打开csv文件,这样中文为正确的显示,如果不转码保存的话,为中文乱码. 4.选择数据

[转]PL/SQL Developer 导入导出csv文件

PL/SQL Developer 可以导入或者导出CSV文件. 导入CSV文件步骤: 1.选择tools->text importer.... 2.选择第二个Data to oracle选项卡,然后选择Open Data file....,选择要导入的csv文件,确定 3.选择对应的owner和table,将字段一一对应,最后点击下方的导入,数据即导入到了选定的table中了. 导出csv文件相对比较简单: 1.先用sql语句查询得到结果 2.选择export query results ...

导入导出csv文件

在工作中需要把csv文件数据导入数据库或者把数据库数据导出为csv文件.以下是我的简单的实现. 1 <?php 2 class csv 3 { 4 public $db_connection; 5 public $table_name; 6 public $file_path; 7 8 public function __construct($db_connection,$table_name,$file_path) 9 { 10 $this->db_connection=$db_connec

mysql导入导出csv文件

问题:为什么要导入导出为csv文件呢? (1)所谓大数据处理,仅仅关心某些列的数据,而非整个表结构,这些数据就需要保存为csv通用的存储格式,不仅可以在widows下作为文本文件进行处理:也可以在hadoop分布式系统上上进行处理: (2)mysql 数据库 迁移为 Oracle .SQLServer数据库,或者反过来,由于各自的设计不同,不能直接的导入导出为dmb sql等格式的文件,可能需要数据的导出导入为csv,而数据表结构的设计可能得通过其它途径. 一:MYSQL如何导出文本文件  (备

PHP导入导出csv文件

2017年11月9日09:25:56 根据项目实践总结的一个类文件, mac/win下没乱码 简体中文 默认从gb2312转到utf-8 https://gitee.com/myDcool/PHP-CSV 用法: 1 // 导入: 2 $arr = CSV::import($filepath); 3 4 // 导出: 5 $data = ['filename' => 'xxx', 'list' => [[xx,xx,x], [xx,xx,x]]]; 6 CSV::export($data);

C#中使用NPOI导入导出CSV文件

1.首先(NPOI官网下载dll) 添加引用:NPOI.dll,NPOI.OOXML.dll,NPOI.OpenXml4Net.dll,NPOI.OpenXmlFormats.dll 2.代码--CSVHelper 1 public class CSVHelper 2 { 3 /// <summary> 4 /// 写入CSV 5 /// </summary> 6 /// <param name="fileName">文件名</param>

使用PHP导入和导出CSV文件

1.配置文件:connect.php <?php $host="localhost"; $db_user="root"; $db_pass="root"; $db_name="wh"; $timezone="Asia/Shanghai"; $link=mysql_connect($host,$db_user,$db_pass); mysql_select_db($db_name,$link); mys

【代码实现】使用PHP导入和导出CSV文件

文章来源:PHP开发学习门户 地址:http://www.phpthinking.com/archives/558 项目开发中,很多时候要将外部CSV文件导入到数据库中或者将数据导出为CSV文件,那么具体该如何实现呢?本文将使用PHP并结合mysql,实现了CSV格式数据的导入和导出功能. 下载源码 我们先准备mysql数据表,假设项目中有一张记录学生信息的表student,并有id,name,sex,age分别记录学生的姓名.性别.年龄等信息.   CREATE TABLE `student`

Phoenix 导出csv文件

1. 是否存在高效的csv导出工具? phoenix提供了BulkLoad工具,使得用户可以将大数据量的csv格式数据高效地通过phoenix导入hbase,那么phoenix是否也存在高效导出csv数据的工具类呢? 这里可能有人会想是否能够按照导出常规hbase的方法来导出数据.比如自己写Java代码,或者用hbase原生支持的工具类,或者说采用pig提供的hbase工具类.是否能这么干取决于你phoenix建表时候字段的数据类型.如果字段采用的不是varchar.char等字符类型以及uns