PHP 高效导入导出Excel(csv)方法之fgetcsv()和fputcsv()函数

CSV,是Comma Separated Value(逗号分隔值)的英文缩写,通常都是纯文本文件。

一、CSV数据导入函数fgetcsv()

fgetcsv() 函数从文件指针中读入一行并解析 CSV 字段。

与 fgets() 类似,不同的是 fgetcsv() 解析读入的行并找出 CSV 格式的字段,然后返回一个包含这些字段的数组。

fgetcsv() 出错时返回 FALSE,包括碰到文件结束时。

具体使用时封装函数如下:

/**
     * 导入Excel数据表格
     * @param  string  $fileName  文件名
     * @param  int     $line      读取几行,默认全部读取
     * @param  int     $offset    从第几行开始读,默认从第一行读取
     * @return bool|array
     */
    public function importCsv($fileName, $line=0, $offset=0){
        //set_time_limit(0);//防止超时
        //ini_set("memory_limit", "512M");//防止内存溢出

        $handle = fopen($fileName,‘r‘);
        if(!$handle){
            return  ‘文件打开失败‘;
        }

        $i = 0;
        $j = 0;
        $arr = [];
        while($data = fgetcsv($handle)){
            //小于偏移量则不读取,但$i仍然需要自增
            if($i < $offset && $offset){
                $i++;
                continue;
            }
            //大于读取行数则退出
            if($i > $line && $line){
                break;
            }

            foreach ($data as $key => $value) {
                $content = iconv("gbk","utf-8//IGNORE",$value);//转化编码
                $arr[$j][] = $content;
            }
            $i++;
            $j++;
        }
        return $arr;
    }

二、CSV数据导入函数fputcsv()

前言:Excel表格最高支持104W行,导出数据达到上万的量,PHPExcel就显得有点无力了,经常卡死或者内存溢出,若做普通的数据导出功能,建议使用fputcsv()函数,因为此函数要比PHPexcel要高效的多,二十万数据导出大概需要2到3秒。

fputcsv() 函数将行格式化为 CSV 并写入一个打开的文件。

该函数返回写入字符串的长度。若出错,则返回 false。

具体使用时封装函数如下:

(注意点:

参数:$exportUrl分两种情况,根据需求选择其一

1.$exportUrl = ‘php://output‘ 表示表示直接输出到浏览器自动下载。

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

/**
     * 导出Excel数据表格
     * @param  array    $dataList     要导出的数组格式的数据
     * @param  array    $headList     导出的Excel数据第一列表头
     * @param  string   $fileName     输出Excel表格文件名
     * @param  string   $exportUrl    直接输出到浏览器or输出到指定路径文件下
     * @return bool|false|string
     */
    public static function toExcel($dataList,$headList,$fileName,$exportUrl){
        //set_time_limit(0);//防止超时
        //ini_set("memory_limit", "512M");//防止内存溢出
        header(‘Content-Type: application/vnd.ms-excel‘);
        header(‘Content-Disposition: attachment;filename="‘.$fileName.‘.csv"‘);
        header(‘Cache-Control: max-age=0‘);
        //打开PHP文件句柄,php://output 表示直接输出到浏览器,$exportUrl表示输出到指定路径文件下
        $fp = fopen($exportUrl, ‘a‘);

        //输出Excel列名信息
        foreach ($headList as $key => $value) {
            //CSV的Excel支持GBK编码,一定要转换,否则乱码
            $headList[$key] = iconv(‘utf-8‘, ‘gbk‘, $value);
        }

        //将数据通过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];
            foreach ($row as $key => $value) {
                $row[$key] = iconv(‘utf-8‘, ‘gbk‘, $value);
            }
            fputcsv($fp, $row);
        }
        return $fileName;
    }

原文地址:https://www.cnblogs.com/wenzheshen/p/10521400.html

时间: 2024-08-02 02:40:27

PHP 高效导入导出Excel(csv)方法之fgetcsv()和fputcsv()函数的相关文章

Net使用Npoi导入导出Excel的方法

www.qdmm.com/BookReader/41468,68391862.aspxwww.qdmm.com/BookReader/41468,68391863.aspxwww.qdmm.com/BookReader/41468,68391864.aspxwww.qdmm.com/BookReader/41468,68391870.aspxwww.qdmm.com/BookReader/41468,68391871.aspxwww.qdmm.com/BookReader/41468,68391

.Net MVC 导入导出Excel总结(三种导出Excel方法,一种导入Excel方法)

.Net MVC  导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) 通过MVC控制器导出导入Excel文件(可用于java SSH架构) public class ExcelController : Controller { // // GET: /Excel/ Models.zbwxglEntities myMdl = new Models.zbwxglEntities(); /// <summary> /// 第一种方法,利用文件输出流进行读写操作 /// <

从SQL Server中导入/导出 Excel 的基本方法

/*=================== 导入/导出 Excel 的基本方法 ===================*/ 从Excel文件中,导入数据到SQL数据库中,很简单,直接用下面的语句: /*===================================================================*/ --如果接受数据导入的表已经存在 insert into 表 select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.

goalng导出excel(csv格式)

最近项目中有个小需求,需要将查询结果导出到excel.之间前java比较容易,使用POI很容易就能实现,查了下golang的文档,发现golang下边并没有导出excel的包,但是却有一个encoding/csv的包,看了下发现可以导出csv文件,大家都知道csv文件其实就是文本格式的excel文件,可以直接通过excel打开或是导入excel. 看起来挺好的,问题如愿解决,但是事实证明对已一个还不成熟的语言或是库最好还是先测一下的好.兴冲冲的卸了测试例子,成功导出了一个text.csv文件,一

thinkphp导入导出excel表单数据

在PHP项目经常要导入导出Excel表单. 先去下载PHPExcel类库文件,放到相应位置. 我在thinkphp框架中的位置为ThinkPHP/Library/Org/Util/ 导入 在页面上传excel文件提交到后台,利用form表单提单即可 <form method="post" enctype="multipart/form-data" action="" > <input type="submit"

导入导出Excel的Java工具类ExcelUtil

在编写ExcelUtil之前,在网上查了一些资料.java中用来处理Excel的第三方开源项目主要就是POI和JXL.poi功能强大,但是比较耗资源,对于大数据量的导入导出性能不是太好:jxl功能简单,但是性能比较好. 由于本项目的导入导出更多关注性能问题,而且jxl提供的功能基本也都够用了,于是选择了jxl作为支持. 实战 导出就是将List转化为Excel(listToExcel) 导入就是将Excel转化为List(excelToList) 导入导出中会出现各种各样的问题,比如:数据源为空

C#用Infragistics 导入导出Excel(一)

最近项目中有数据的导入导出Excel的需求,这里做简单整理. 公司用的是Infragistics的产品,付费,不需要本地安装Office. 有需要的朋友可以下载 Infragistics.2013.2.2098,提取密码:5u17 本文完整代码下载 Demo.Excel.zip 当然,我知道还有其他开源的类库来操作Excel,希望有资源的博友可以一起共享一下. Infragistics安装使用 直接安装Infragistics_WinForms_20132.msi后再项目Reference中引用

jxl导入/导出excel

转自:http://www.cnblogs.com/linjiqin/p/3540266.html 1.jxl导入/导出excel案例,黏贴即可运行 package junit.test; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import jxl.Cell; import jxl.Sheet; import jxl.Workbook;

页面导入导出EXCEL

引用 using Microsoft.Office.Interop.Excel;using System.Reflection;//反射命名空间using System.IO; protected void Button1_Click(object sender, EventArgs e) { //项目引入Microsoft.office.Excel组件 //导出二大部分 //第一部分,生成EXCEL文件 //对象1 应用程序对象 Microsoft.Office.Interop.Excel.A