phpexcel读文件的时候cpu99%


 /**
     * 导入Excels
     *
     * @param string $file
     * @param array  $sheet_names
     *
     * @return array|bool
     * @throws \PHPExcel_Exception
     * @throws \PHPExcel_Reader_Exception
     */
    public static function importExcel($file, $sheet_names)
    {
        foreach ($sheet_names as $sheet_name) {
            $rowSize = 200;
            $startRow = 1;//从第二行开始读取
            $endRow = $rowSize;
            $data = [];
            while (true) {
                $excel_orders = self::readFromExcel($file, $startRow, $endRow, $sheet_name);
                if (empty($excel_orders)) {
                    break;
                }
                $data = array_merge($data, $excel_orders);
                $startRow = $endRow + 1;
                $endRow = $endRow + $rowSize;
            }
            $result[$sheet_name] = $data;
        }

        return $result;
    }



 /**
     * 读取excel转换成数组
     *
     * @param string $excelFile  文件路径
     * @param int    $startRow   开始读取的行数
     * @param int    $endRow     结束读取的行数
     * @param string $sheet_name sheet名称
     *
     * @return array
     * @throws \PHPExcel_Exception
     * @throws \PHPExcel_Reader_Exception
     */
    private static function readFromExcel($excelFile, $startRow = 1, $endRow = 100, $sheet_name)
    {
        $excelType = PHPExcel_IOFactory::identify($excelFile);
        $excelReader = PHPExcel_IOFactory::createReader($excelType);
        if (strtoupper($excelType) == 'CSV') {
            $excelReader->setInputEncoding('GBK');
        }
        if ($startRow && $endRow) {
            $excelFilter = new PHPExcelReadFilter();
            $excelFilter->startRow = $startRow;
            $excelFilter->endRow = $endRow;
            $excelReader->setReadFilter($excelFilter);
        }
        $php_excel = $excelReader->load($excelFile);
        $activeSheet = $php_excel->getSheetByName($sheet_name);
        if ( !$activeSheet) {
            return [];
        }
        $highestColumn = $activeSheet->getHighestColumn(); //最后列数所对应的字母,例如第1行就是A
        $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); //总列数
        $data = [];
        for ($row = $startRow; $row <= $endRow; $row++) {
            for ($col = 0; $col < $highestColumnIndex; $col++) {
                $data[$row][] = (string)$activeSheet->getCellByColumnAndRow($col, $row)->getFormattedValue();
            }
            if (implode($data[$row], '') == '') {
                unset($data[$row]);
            }
        }

        return $data;
    }
使用:
    $data = CommonHelper::importExcel($file, ['sheet', 'sheet1', 'sheet2', 'sheet3']);

clipboard.png

**在读取的时候 cpu瞬间98 99%,excel文件并不是很大 2M左右 更小也是这样,这是本机测试的,在服务器上也是一样的效果,4核 16G的配置;
有什么其他写法么?**

阅读 2.8k
1 个回答
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题