自己写的两个导数据函数

一、

/**

 * 导出数据到excel文件中(用样式处理)
 * @param array $data           输出主体部分内容
 * @param array $header_data    输出头部分内容
 * @param string $file_name     自定义文件名
 * @param string $unicode       自定义输出数据编码
 * @param string $start_time    开始运行时间(放在文件开始位置 $start_time = microtime(true))
 */
function exportExcel($data = [], $header_data = [], $file_name = '', $unicode = 'UTF-8', $start_time = '')
{
    if (empty($data) || empty($header_data) || $file_name == '') {
        return;
    }
    header('pragma:public');
    header('Content-type:application/vnd.ms-excel');
    header("Content-Disposition:attachment;filename=$file_name.xls");//attachment新窗口打印inline本窗口打印
    echo '<html>
             <head>
                <meta http-equiv="Content-type" content="text/html;charset='.$unicode.'" />
             </head>
             <body> ';
    echo '<table border="1" cellspacing="0" cellpadding="0">';
    echo '<tr>';
    $h_count = count($header_data);
    for ($i = 0; $i < $h_count; $i++) {
        echo '<th width="120" height="25" style="">' . iconv('GBK', $unicode, $header_data[$i]) . '</th>';
    }
    $c_count = count($data);
    for ($i = 0; $i < $c_count; $i++) {
        $row = $data[$i];
        echo '<tr>';
        foreach ($row as $key => $val) {
            if ($i % 2 == 0) {
                echo '<td height="25" >' .$val. '</td>';
            } else {
                echo '<td height="25" style="">' .$val. '</td>';
            }
        }
        echo '</tr>';
    }
    echo '</table>';
    echo '    </body>
            </html>';
}


二、
/**
 * 导出数据到csv文件
 * @param array $data           输出主体部分内容
 * @param array $header_data    输出头部分内容
 * @param string $file_name     自定义文件名
 * @param string $unicode       输出前数据编码(输出后会统一转为GBK编码格式)
 * @param string $start_time    开始运行时间(放在文件开始位置 $start_time = microtime(true))
 */
function exportCsv($data = [], $header_data = [], $file_name = '', $unicode = 'GBK', $start_time = '')
{
    if (empty($data) || empty($header_data) || $file_name == '') {
        return;
    }
    $fp = fopen($file_name . ".csv", 'a+');
    fputcsv($fp, $header_data);
    $num = 0;   //计数器
    //每隔$limit行,刷新一下输出buffer,不要太大也不要太小
    $limit = 100000;
    //逐行取出数据,不浪费内存
    $count = count($data);
    if ($count > 0) {
        for ($i = 0; $i < $count; $i++) {
            $num++;
            //刷新一下输出buffer,防止由于数据过多造成问题
            if ($limit == $num) {
                ob_flush();
                flush();
                $num = 0;
            }
            $row = $data[$i];
            if ($unicode != 'GBK') {
                foreach ($row as $key => $value) {
                    $row[$key] = iconv($unicode, 'GBK', $value);
                }
            }
            fputcsv($fp, $row);
            unset($row);
            //数据导出百分比
            $percent = intval((($i+1) / $count) * 100);
            //隐藏光标,显示进度条
            printf("\033[?25lmprogress: \033[41m\033[1m %d%% %s\r\033[0m", $percent, str_repeat(' ', $percent));
            /*usleep(1000 * 1);*/
        }
    }
    fclose($fp);
    echo "\n";
    if ($start_time != '') {
        //输出运行时间
        echo "runtime: ";
        $time_diff = round(microtime(true) - $start_time, 3);
        if ($time_diff >= 60) {
            $m = $time_diff / 60;
            $s = $time_diff - ($m * 60);
            echo $m . ":" . $s . "\n";
        } else {
            echo $time_diff . "s" . "\n";
        }
    }
    echo "Done.\n";
    printf("\033[?25h");    //显示光标
}
 

    
 
posted @ 2016-09-02 12:16  rhythm0121  阅读(233)  评论(0编辑  收藏  举报