隔着屏幕轻易产生感情的你,肯定很孤独吧。

之前有写过用插件导入xlsx文件的方法,但是那个需要第三方插件,在某些项目里面不是很适用,所以这里介绍一种csv文件的导入方式。csv可以通过xlsx文件直接转换,很方便。

/**
     * @param string $file  文件地址
     * @param array $filed  预设字段,设置好这个,第一行数据会自动加上对应的key
     * @param int $line  读取几行
     * @param int $offset   偏移量
     * @return array|string 
     */
    private function csvHandle(string $file = '', $filed=['gif', 'title'], $line=0, $offset=1)
    {
        setlocale(LC_ALL, 'zh_CN');
        $handle = fopen($file,'r');
        if(!$handle){
            return  '文件打开失败';
        }

        $i = 0;

        $arr = [];
        while($data = fgetcsv($handle)){
            $j = 0;
            //小于偏移量则不读取,但$i仍然需要自增
            if($i < $offset && $offset){
                $i++;
                continue;
            }
            //大于读取行数则退出
            if($i > $line && $line){
                break;
            }

            $tmp = [];
            foreach ($data as $key => $value) {
                //$content = iconv("gbk","utf-8//IGNORE",$value);//转化编码
                $content = $this->convertToUTF8($value);

                //$arr[][$filed[$j]] = $content;
                $tmp[$filed[$j]] = $content;
                $j++;
            }
            $arr[] = json_encode($tmp);
            $i++;
        }
        return $arr;
    }

     private function convertToUTF8($text){

        $encoding = mb_detect_encoding($text, mb_detect_order(), true);

        if($encoding == "UTF-8")
        {
            $text = mb_convert_encoding($text, 'UTF-8', 'UTF-8');
        }
        if ($encoding === false) {
            $encoding = 'GBK';//短字符串无法判断字符串类型。。一般是文字出现这种问题,所以设置为gbk
        }

        $out = iconv($encoding, "UTF-8//IGNORE", $text);

        return $out;
    }

导出:
导出可老简单了,直接复制我的,改一改数据就能用,要注意如果数据过大可能需要分页等操作来进行下载

1.$exportUrl = 'php://output' 表示表示直接输出到浏览器自动下载。

2.exportUrl="服务器目录地址/文件名.csv"表示输出到指定路径文件下。举例:exportUrl = "/data/a.csv")。
/**
     * 导出Excel数据表格
     * @param  array    $dataList     要导出的数组格式的数据
     * @param  array    $headList     导出的Excel数据第一列表头
     * @param  string   $fileName     输出Excel表格文件名
     * @param  string   $exportUrl    直接输出到浏览器or输出到指定路径文件下
     * @return bool|false|string
     */
public function toExcel($dataList,$headList,$fileName,$exportUrl){
        //set_time_limit(0);//防止超时
        //ini_set("memory_limit", "512M");//防止内存溢出
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename="'.$fileName.'.csv"');
        header('Cache-Control: max-age=0');
        //打开PHP文件句柄,php://output 表示直接输出到浏览器,$exportUrl表示输出到指定路径文件下
        $fp = fopen($exportUrl, 'a');

        //输出Excel列名信息
        foreach ($headList as $key => $value) {
            //CSV的Excel支持GBK编码,一定要转换,否则乱码
            $headList[$key] = iconv('utf-8', 'gbk', $value);
        }

        //将数据通过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];
            foreach ($row as $key => $value) {
                $row[$key] = iconv('utf-8', 'gbk', $value);
            }
            fputcsv($fp, $row);
        }
        return $fileName;
    }

测试代码:
$headList = ['id', '姓名', '年龄'];
$dataList = [[1, 'zhangsan', 10], [2, 'lisi', 20]];
toExcel($dataList, $headList, '测试文件名称', 'php://output');

参考链接可以点击这里
前端注意不要用ajax,可以简单的一行代码来进行下载:

window=window.open('/lyt/data/export?user_id='+data.user_id);

0 条评论

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据