- 导入Csv(方法1)
/**
* 导入Csv
* @param $filePath Csv文件路径
* @param bool $remove_header 是否去除标题 true:去除标题,false:无标题
* @return array|mixed
*/
function imp_csv($filePath, $remove_header = true)
{
ini_set('memory_limit', '-1'); // 设置最大内存限制为无限制
ini_set('max_execution_time', 0); // 设置最大执行时间为无限制
$data = [];
$handle = fopen($filePath, "rb");
while (!feof($handle)) {
$tmp = fgetcsv($handle);
if ($tmp !== false) {
$data[] = gbk2utf8($tmp);
}
}
fclose($handle);
if ($remove_header) {
array_shift($data);//删除CSV中第一行标题
}
return $data;
}
//gbk 2 utf8
function gbk2utf8($data = '')
{
if (is_array($data)) {
return array_map('gbk2utf8', $data);
}
return iconv('gbk', 'utf-8', $data);
}
- 导入Csv(方法2:yield 生成器导入)
function read_csv($filename)
{
$file = @fopen($filename, 'r');
while (feof($file) === fales) {
yield fgetcsv($file);
}
fclose($file);
}
function imps_data($file, $isdelheader = true)
{
//$file = '../data.csv';
$data = read_csv($file);
if (!$data) {
return false;
}
$arr = array();
foreach ($data as $v) {
if ($v !== false) {
$arr[] = gbk2utf8($v);//转换中文乱码
}
}
if ($isdelheader) {
array_shift($arr);//删除第一行数据一般都是标题
}
return $arr;
}
//gbk 2 utf8
function gbk2utf8($data = '')
{
if (is_array($data)) {
return array_map('gbk2utf8', $data);
}
return iconv('gbk', 'utf-8', $data);
}
导出Csv
function put_csv($filename, array $title, array $list)
{
// 设置最大执行时间和内存限制
set_time_limit(0); // 设置最大执行时间为无限制
ini_set('memory_limit', -1); // 设置最大内存限制为无限制
// 设置 Content-Type 和 Content-Disposition 头
header('Content-Type: application/vnd.ms-excel;charset=utf-8');
header('Content-Disposition: attachment;filename="' . $filename . '.csv"');
// 禁止缓存
header('Cache-Control: no-cache, max-age=0');
header('Pragma: no-cache');
// 打开输出流
$file = fopen('php://output', 'w');
$limit = 1000;
$calc = 0;
foreach ($title as $v) {
$tit[] = iconv('UTF-8', 'GB2312//IGNORE', $v);
}
fputcsv($file, $tit);
foreach ($list as $v) {
$calc++;
if ($limit == $calc) {
ob_flush();
flush();
$calc = 0;
}
foreach ($v as $t) {
$tarr[] = iconv('UTF-8', 'GB2312//IGNORE', $t);
}
fputcsv($file, $tarr);
unset($tarr);
}
unset($list);
fclose($file);
exit();
}
function put_csv($filename, array $header, array $data, $size = 10000)
{
ini_set('memory_limit', '-1'); // 设置最大内存限制为无限制
ini_set('max_execution_time', 0); // 设置最大执行时间为无限制
// 清空缓冲区
ob_end_clean();
// 开启缓冲区
ob_start();
// 设置 Content-Type 和 Content-Disposition 头
header('Content-Type: application/vnd.ms-excel;charset=utf-8');
header('Content-Disposition: attachment;filename="' . $filename . '.csv"');
// 禁止缓存
header('Cache-Control: no-cache, max-age=0');
header('Pragma: no-cache');
// 打开输出流
$fp = fopen('php://output', 'w');
// 写入 BOM 头
fwrite($fp, chr(239) . chr(187) . chr(191));
// 写入列名
fputcsv($fp, $header);
/**
* 生成CSV数据的生成器函数
* @param array $arrs 数据数组
* @return Generator 生成器对象
*/
function csvGenerator($arrs)
{
foreach ($arrs as $v) {
yield (array)$v;
}
}
// 分块写入数据
$arrChunk = array_chunk($data, $size);
unset($data);
foreach ($arrChunk as $chunk) {
$generator = csvGenerator($chunk);
unset($chunk);
foreach ($generator as $row) {
fputcsv($fp, $row);
unset($row);
}
// 刷新输出缓冲,提高性能
ob_flush();
flush();
}
unset($arrChunk);
// 关闭输出流
fclose($fp);
// 刷新输出缓冲
ob_end_flush();
// 结束程序
exit();
}
调用
/**
* 调用导出Csv
* ThinkPHP5.1框架
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
public function csvDc()
{
$filename = 'test';//Csv文件名
$header = ['序号', '项目', '城市', '手机', '平台', '状态', '日期', '生效时间'];//标题(一位数组)
$data = Db::table('seach')->select();//数据内容(二维数组)
export_csv($filename, $header, $data);
}