php 导入导出Csv 2022-06-04

  • 导入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);
    }

你可能感兴趣的:(php 导入导出Csv 2022-06-04)