PHP–Excel 异步导入数据库

1. 这里使用的是 phpoffice/phpspreadsheet , 首先 composer 安装

composer require phpoffice/phpspreadsheet

2. 异步上传的话,要先通过前端OSS上传等方式,获取文件url, 如:http://XXXX-hangzhou.aliyuncs.com/export/780b60f76f2774ae75396844.Xlsx

3. 直接上代码,使用 CV大法,嘿嘿嘿!!

public function importExcel(ImportRequest $request)
    {
        header("Access-Control-Allow-Origin: *");

        $file_url = $request->input('file_url');  // 第二部获取的文件 url

        $ext = pathinfo($file_url, PATHINFO_EXTENSION | PATHINFO_FILENAME);  // 获取文件后缀
        if (!in_array($ext, ['xls', 'xlsx', 'Xlsx', 'Xls'])) {
            ApiException::break(Status::ERR_USER_FILE_TYPE);   // 限制文件类型
        }
        $file = @file_get_contents($file_url);
        if (!$file) {
            ApiException::break(Status::ERR_USER_FILE_FALL);
        }
        $size_mb = round(strlen($file) / 1048576 * 100) / 100;
        if ($size_mb > 5) {
            ApiException::break(Status::ERR_USER_FILE_MAX);  // 限制文件大小,当前5M
        }
        $file_name = date("YmdHis") . '.' . $ext;
        file_put_contents($file_name, $file);          // 文件保存本地
        $data = $this->importData($file_name, $ext);   // 获取文件内容
        $data = array_filter(array_values($data));
        if (empty($data)) {
            ApiException::break('69022|未获取到文件内容');
        }
        if (file_exists($file_name)) {
            unlink($file_name);
        }

        foreach ($data as $key => $item) {
            $data[$key] = [
                'order_no' => $item['A'],      // 按自己的逻辑  取值
                'receiver_name' => $item['B'],
                'receiver_phone' => $item['C'],
                'platform_code' => $item['D'],
                'create_time' => time()
            ];
            
        }

        //插入数据库
        $res = Db::table('biaoming')->insert($data);
        if (!$res) {
            ApiException::break(Status::ERR_OPERATE_FAILED);
        }

        return $this->response->apiSuccess();
    }
 public function importData(string $file_path, $ext = 'Xls')
    {
        if (in_array($ext, ['xls', 'Xls'])) {
            $reader = IOFactory::createReader('Xls');
        } else {
            $reader = IOFactory::createReader('Xlsx');//设置以Excel5格式(Excel97-2003工作簿)
        }
        $phpExcel = $reader->load($file_path);// 载入excel文件
        $excelSheet = $phpExcel->getSheet(0);//读取第一个工作表
        $highestRow = $excelSheet->getHighestRow();//取得总行数

        $highestColumn = $excelSheet->getHighestColumn();//取得总列数
        $data = [];
        for ($row = 2; $row <= $highestRow; $row++) {   // 从第二行开始取数据
            for ($col = 'A'; $col < $highestColumn; $col++) {
                $value = $excelSheet->getCell($col . $row)->getValue();
                $data[$row][$col] = $value;
            }
        }
        return $data;
    }

4. 自测一下,看是否插入到数据库数据,然后可以催前端联调了,哈哈哈哈哈


原文地址:https://www.cnblogs.com/JGNotMe/p/14765653.html