| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 | <?php/** * Export.php UTF-8 * 导出类 * * @date    : 2018/5/28 11:39 * * @license 这不是一个自由软件,未经授权不许任何使用和传播。 * @author  : wuyonghong <wyh@huosdk.com> * @version : HUOSDK 8.0 */namespace huolib\tool;use ZipArchive;class Export {    const MAX_ROWS = 10000;  /* 一个文件最多1万行 */    public static function ins() {        return new static();    }    /**     * 因为EXCEL单表只能显示104W数据,同时使用PHPEXCEL容易因为数据量太大而导致占用内存过大,     * 因此,数据的输出用csv文件的格式输出,但是csv文件用EXCEL软件读取同样会存在只能显示104W的情况,     * 所以将数据分割保存在多个csv文件中,并且最后压缩成zip文件提供下载     *     * @param array  $head      数据头     * @param array  $data      数据     * @param string $path      存储的相对路径     * @param string $file_name 文件名称     * @param string $extend    扩展     * @param bool   $is_output 是否直接输出     */    public static function exportCsv($head, $data, $path = '', $file_name = "", $extend = '.csv', $is_output = false) {        if (empty($path)) {            $_root_path = RUNTIME_PATH.'export';        } else {            $_root_path = RUNTIME_PATH.'export'.DS.$path;        }        if (!is_dir($_root_path)) {            @mkdir($_root_path, 0755, true);        }        set_time_limit(0);        if (empty($file_name)) {            $_file_name = date('YmdHi', time()).$extend;        } else {            $_file_name = $file_name.$extend;        }        $_limit = self::MAX_ROWS;        $_cnt = 0;        $_file_path = $_root_path.DS.$_file_name;        $_file_path = iconv('UTF-8', 'GBK', $_file_path);        // 逐行取出数据,不浪费内存        $_fp = fopen($_file_path, 'w'); //生成临时文件        // 将数据通过fputcsv写到文件句柄        if (!empty($head)) {            foreach ($head as $_key => $_val) {                $head[$_key] = iconv('utf-8', 'gbk', $_val);            }            fputcsv($_fp, $head);        }        foreach ($data as $_row) {            $_cnt++;            if ($_limit == $_cnt) {                //刷新一下输出buffer,防止由于数据过多造成问题                ob_flush();                flush();                $_cnt = 0;            }            foreach ($_row as $_key => $_val) {                $_row[$_key] = iconv('utf-8', 'gbk//IGNORE', $_val);            }            fputcsv($_fp, $_row);        }        fclose($_fp);  //每生成一个文件关闭        if ($is_output) {            // 输出Excel文件头,可把user.csv换成你要的文件名            header('Content-Type: application/vnd.ms-excel;charset=utf-8');            header('Content-Disposition: attachment;filename="'.$_file_name.'"');            header('Cache-Control: max-age=0');            @readfile($_file_path);//输出文件;            exit;        }    }    /**     * 输出为压缩文件     *     * @param array  $file_name_arr 需要压缩的文件名     * @param string $path          存储的相对路径     * @param string $mark          压缩文件名称     */    public static function exportZip($file_name_arr, $path = '', $mark) {        if (empty($file_name_arr)) {            return;        }        if (empty($path)) {            $_root_path = RUNTIME_PATH.'export';        } else {            $_root_path = RUNTIME_PATH.'export'.DS.$path;        }        if (!is_dir($_root_path)) {            @mkdir($_root_path, 0755, true);        }        //进行多个文件压缩        $_zip_class = new ZipArchive();        $_file_name = $mark.".zip";        $_file_path = $_root_path.DS.$_file_name;        $_file_path = iconv('UTF-8', 'GBK', $_file_path);        $_zip_class->open($_file_path, ZipArchive::CREATE);   //打开压缩包        foreach ($file_name_arr as $file) {            $_basename = $file;            $file = $_root_path.DS.$file;            $file = iconv('UTF-8', 'GBK', $file);            $_zip_class->addFile($file, $_basename);   //向压缩包中添加文件        }        $_zip_class->close();  //关闭压缩包        //输出压缩文件提供下载        header("Cache-Control: max-age=0");        header("Content-Description: File Transfer");        header('Content-disposition: attachment; filename='.$_file_name); // 文件名        header("Content-Type: application/zip"); // zip格式的        header("Content-Transfer-Encoding: binary"); //        header('Content-Length: '.filesize($_file_path)); //        @readfile($_file_path);//输出文件;        @unlink($_file_path); //删除压缩包临时文件        exit;    }}
 |