1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- <?php
- namespace 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;
- }
- }
|