技术饭
PHP 导入导出csv文件函数:fgetcsv()、fputcsv()
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
文明上网理性发言!