| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 | <?phpnamespace app\common\util;use PhpOffice\PhpSpreadsheet\Exception;use PhpOffice\PhpSpreadsheet\IOFactory;use PhpOffice\PhpSpreadsheet\Cell\Coordinate;/** * Excel表格功能封装类 */class PhpSpreadsheetImport{    /**     * 读取表格数据     * @param string $path 路径     * @param int $sheetIndex 工作簿索引     * @param array $field 初始化数组键名     * @param int $row 从第几行开始读     * @param string $scene     * @return array     */    public static function readData(string $path, array $field = [], int $row = 2, int $sheetIndex = 0, string $scene = 'excel'): array    {        try {            // 创建读操作对象            $reader = IOFactory::createReader('Xlsx');            // 忽略任何格式的信息            $reader->setReadDataOnly(true);            // 打开文件、载入excel表格            $spreadsheet = $reader->load($path);            // 获取活动工作薄            $sheet = $spreadsheet->getSheet($sheetIndex);            // 返回表格数据            return self::getCellData($row, $sheet, $field);        } catch (\Exception $e) {            // 有异常发生            return ['code' => $e->getCode(), 'errMsg' => $e->getMessage()];        }    }    /**     * 获取单元格数据     * @param $row     * @param object $sheet     * @param array $field     * @return array     * @throws Exception     */    private static function getCellData($row, object $sheet, array $field):array    {        # 获取最高列 返回字母 如: C        $highestColumn = $sheet->getHighestColumn();        # 获取最大行 返回数字 如: 4        $highestRow = $sheet->getHighestRow();        # 列数 改为数字显示        $highestColumnIndex = Coordinate::columnIndexFromString($highestColumn);        $data = [];        // 从第二行开始读取数据        for ($row; $row <= $highestRow; $row++) {            $build = [];            // 从第一列读取数据            for ($col = 1; $col <= $highestColumnIndex; $col++) {                // 'A' 对应的ASCII码十进制为 64                // 将ASCII值转为字符                $chr = chr(64 + $col);                // 列转为数据库字段名                $key = $field[$chr] ?? $chr;                // 构建当前行数据                $build[$key] = $sheet->getCellByColumnAndRow($col, $row)->getValue();            }            $data[] = $build; //当前行数据        }        return $data;    }}
 |