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

时间:2022-09-08 07:51:05

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;
}

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

  1. 使用Sqlserver Management Studio 导入导出 Excel的方法

    之前 帮同事  导入sql server数据     本来打算用 C# 写程序导入的 后来发现网上的方法  貌似 都会对版本  限制来限制去的 看的我好头晕(吐槽一下  难道就没有一个 普遍的方法嘛, ...

  2. uniapp导入导出Excel

    众所周知,uniapp作为跨端利器,有诸多限制,其中之一便是vue页面不支持传统网页的dom.bom.blob等对象. 所以,百度上那些所谓的导入导出excel的方法,大部分都用不了,比如xlsx那个 ...

  3. &period;Net MVC 导入导出Excel总结&lpar;三种导出Excel方法,一种导入Excel方法&rpar; 通过MVC控制器导出导入Excel文件&lpar;可用于java SSH架构&rpar;

    .Net MVC  导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) [原文地址] 通过MVC控制器导出导入Excel文件(可用于java SSH架构)   public cl ...

  4. 从SQL Server中导入&sol;导出Excel的基本方法&lpar;转&rpar;

    从sql server中导入/导出 excel 的基本方法 /*=========== 导入/导出 excel 的基本方法 ===========*/ 从excel文档中,导入数据到sql数据库中,很 ...

  5. Laravel 使用 maatwebsite&sol;Excel 3&period;1 实现导入导出的简单方法

    官方文档 https://docs.laravel-excel.com/3.1/getting-started git地址 https://github.com/maatwebsite/Laravel ...

  6. thinkphp导入导出excel表单数据

    在PHP项目经常要导入导出Excel表单. 先去下载PHPExcel类库文件,放到相应位置. 我在thinkphp框架中的位置为ThinkPHP/Library/Org/Util/ 导入 在页面上传e ...

  7. asp&period;net中导出Excel的方法

    一.asp.net中导出Excel的方法: 本文转载 在asp.net中导出Excel有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址输出在浏览器上:一种是将文件直接将文件输出 ...

  8. 导入导出Excel工具类ExcelUtil

    前言 前段时间做的分布式集成平台项目中,许多模块都用到了导入导出Excel的功能,于是决定封装一个ExcelUtil类,专门用来处理Excel的导入和导出 本项目的持久化层用的是JPA(底层用hibe ...

  9. NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中

    以下是NPOI导入导出EXCEL通用类,是在别人的代码上进行优化的,兼容xls与xlsx文件格式,供参考,可直接使用在WinForm项目中,由于XSSFWorkbook类型的Write方法限制,Wri ...

随机推荐

  1. 1 selenium3&period;0&period;1无法打开火狐浏览器

    [问题描述] 1.配置selenium3.0和java后,尝试打开火狐浏览器,提示缺少geckodriver驱动. [解决方案] 1.在http://www.seleniumhq.org/downlo ...

  2. jackson-mapper使用工具类

    import com.google.common.collect.Lists;import org.codehaus.jackson.annotate.JsonMethod;import org.co ...

  3. CentOS 6&period;5 x86&lowbar;64系统手动释放内存

    1.查询当前内存使用情况和释放缓存的参数 redismaster 10:29:24 [~] [root] free -m total used free shared buffers cachedMe ...

  4. apt-get用法

    转自apt-get语法- - 对于debian来说,安装软件大多都是通过apt-get来实现的. 1.apt-get update 更新软件包信息库.在Debian中,软件包是通过一个数据库来管理的, ...

  5. spring MVC fromeWork 與webwork2 mvc 比較

    http://www.blogjava.net/xxxzheng/articles/7614.html 在当今的MVC framework里,似乎Webwork2逐渐成为主流, Webwork2+Sp ...

  6. 基于JAX-WS的Web Service服务端&sol;客户端 ;JAX-WS &plus; Spring 开发webservice

    一.基于JAX-WS的Web Service服务端/客户端 下面描述的是在main函数中使用JAX-WS的Web Service的方法,不是在web工程里访问,在web工程里访问,参加第二节. JAX ...

  7. &lbrack;shiro学习笔记&rsqb;第二节 shiro与web融合实现一个简单的授权认证

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/39933993 shiro官网:http://shiro.apache.org/ shi ...

  8. redis 字符串&lpar;string&rpar;函数

    字符串(string)函数 get 命令/方法/函数 Description Get the value related to the specified key 取得与指定的键值相关联的值 Para ...

  9. &commat;RequestParam 和&commat;RequestBody 的区别&quest;

    @RequestParam用来接收: 1 用来处理简单的参数绑定 2 用来接收 Content-Type 是   application/x-www-form-urlencoded (这种格 式的数据 ...

  10. 学习devexpresschartControl控件

    devexpress官网chart:https://documentation.devexpress.com/WindowsForms/8117/Controls-and-Libraries/Char ...