技术饭

PHP 导入导出csv文件函数:fgetcsv()、fputcsv()

copylian    0 评论    14493 浏览    2023.05.30

PHP 导入导出csv文件函数:fgetcsv()、fputcsv(),数据导出格式正常是execl的.xsl、.xslx格式,但导出这两种格式的文件体积很大,还很占用内存,所以一般推荐导出csv格式,csv能处理的数据量比较大,文件还小,是导出数据文件格式的首选。

<?php

function importCsvFile($fileName, $line = 0, $offset = 0){

    // set_time_limit(0);// 防止超时

    // ini_set("memory_limit", "512M");// 防止内存溢出

    $fp = fopen($fileName,'r');

    if(!$fp){

        return  '文件打开失败';

    }

    $i = 0;

    $j = 0;

    $arr = [];

    while($data = fgetcsv($fp)){

        //小于偏移量则不读取,但$i仍然需要自增

        if($i < $offset && $offset){

            $i++;

            continue;

        }


        //大于读取行数则退出

        if($i > $line && $line){

            break;

        }


        foreach ($data as $key => $value) {

            //      $arr[$j][] = iconv('gb2312','utf-8', $value); // excel导出csv,通过txt打开保存为utf-8

            $arr[$j][] = $value;

        }

        $i++;

        $j++;

    }

    return array_values($arr);

}


/**

* 导出Csv数据表格

* @param  array    $dataList     要导出的数组格式的数据

* @param  array    $headList     导出的Excel数据第一列表头

* @param  string   $fileName     输出Excel表格文件名

* @param  string   $exportUrl    直接输出到浏览器or输出到指定路径文件下

* @return void

*/

function exportCsv($dataList, $headList, $fileName, $exportUrl){

        // set_time_limit(0); // 防止超时

        // ini_set("memory_limit", "512M"); // 防止内存溢出

        

        // 1、$exportUrl = 'php://output' 或者 'php://memory' 表示表示直接输出到浏览器自动下载

        // 2、$exportUrl="服务器目录地址/文件名.csv"表示输出到指定路径文件下。如:exportUrl = "/data/a.csv"

        // 打开PHP文件句柄,php://output 表示直接输出到浏览器,$exportUrl表示输出到指定路径文件下

        $fp = fopen($exportUrl, 'w+');

        // 保存BOM表以与Miscrosoft Excel兼容

        fwrite($fp, "\xEF\xBB\xBF");

        // 将数据通过fputcsv写到文件句柄

        fputcsv($fp, $headList);

        // 计数器

        $num = 0;

        // 每隔$limit行,刷新一下输出buffer,不要太大,也不要太小

        $limit = 100000;

        // 逐行取出数据,不浪费内存

        $count = count($dataList);

        for ($i = 0; $i < $count; $i++) {

                $num++;

                // 刷新一下输出buffer,防止由于数据过多造成问题

                if ($limit == $num) {

                        ob_flush();

                        flush();

                        $num = 0;

                }

                

                $row = $dataList[$i];

                fputcsv($fp, $row);

        }

        

        // 关闭文件或者内存

        if(str_contains($exportUrl, 'memory')){

                // 将文件指针的位置倒回文件的开头

                rewind($fp);

                

                // 读取资源流到一个字符串

                echo stream_get_contents($fp);

        } else {

                fclose($fp);

        }

        

        // 如果是文件存储形式则不需要头部输出

        if(str_contains($exportUrl, 'php://')) {

                header('Content-Type: application/vnd.ms-excel');

                header('Content-Disposition: attachment;filename="' . $fileName . '.csv"');

                header('Cache-Control: max-age=0');

        }

}


//$fileName = "测试文件名称";

//$headList = ['id', '姓名', '年龄'];

//$dataList = [[1, 'zhangsan', 10], [2, 'lisi', 20]];

//exportCsv($dataList, $headList, $fileName, './a.csv');


/**

* 导入Csv数据表格

* @param  string  $fileName  文件名

* @param  int     $line      读取几行,默认全部读取

* @param  int     $offset    从第几行开始读,默认从第一行读取

* @return bool|array

*/

function importCsv($fileName, $line = 0, $offset = 0){

        // set_time_limit(0);// 防止超时

        // ini_set("memory_limit", "512M");// 防止内存溢出

        

        $fp = fopen($fileName,'r');

        if(!$fp){

                return  '文件打开失败';

        }

        

        $i = 0;

        $j = 0;

        $arr = [];

        while($data = fgetcsv($fp)){

                //小于偏移量则不读取,但$i仍然需要自增

                if($i < $offset && $offset){

                        $i++;

                        continue;

                }

                

                //大于读取行数则退出

                if($i > $line && $line){

                        break;

                }

                

                foreach ($data as $key => $value) {

                        $arr[$j][] = $value;

                }

                $i++;

                $j++;

        }

        return $arr;

}


// 读取

$data = importCsv("./a.csv");

echo "<pre>";

print_r($data);


代码附件:index.zip


参考:https://blog.csdn.net/adparking/article/details/109056982

只袄早~~~
感谢你的支持,我会继续努力!
扫码打赏,感谢您的支持!
PHP csv fgetcsv fputcsv 

文明上网理性发言!

  • 还没有评论,沙发等你来抢