zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    window下上传文件至linux(windows下如何访问linux)
    32位除法器的verilog语言实现
    socket编程——TCP数据传输的可靠与稳定性
    socket编程——TCP连接与断开
    C踩坑纪实——(一)
    CMAKE工具学习
    排序算法优化思考
    MQTT抓包分析
    C结构体与链表
    第二次作业
  • 原文地址:https://www.cnblogs.com/ImCehnyx/p/7198139.html
Copyright © 2011-2022 走看看