PhpOffice\PhpSpreadsheet读取excel的方法和常见问题
2020-03-22 admin php 1999
因为phpexcel已停止更新,而且不支持命名空间,因此推荐使用PhpOffice\PhpSpreadsheet替代。不过,在使用过程中存在一些问题,特此记录下来备用。
首先是安装,非常简单,直接compose吧:
composer require phpoffice/phpspreadsheet
读取excel的方法,自动判断xls和xlsx:
public function ImportExcel($files){ set_time_limit(90); ini_set("memory_limit", "200M"); //采用自动解析模式 $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReaderForFile($files); $reader->setReadDataOnly(TRUE);//仅读取 $spreadsheet = $reader->load($files); //载入excel表格 $sheetAllCount = $spreadsheet->getSheetCount(); // 工作表总数 $sheet = $spreadsheet->setActiveSheetIndex(0); //设置第1个工作表为活动工作表 $data = $spreadsheet->getActiveSheet()->toArray(); //$this->dd($data); return $data; }
这里设置了仅读取,所以导入速度提升很大,不过,存在一个重要的问题:工作簿(和PhpSpreadsheet)将日期和时间存储为简单的数字值:它们只能通过应用于该单元格的格式掩码与其他数字值区分开。将只读数据设置为true时,PhpSpreadsheet不会读取单元格格式掩码,因此无法区分日期/时间和数字,日期2020年3月23日会变成44369这样的数字。
因此,如果表格中有日期,最好还是不要设置仅读取。
一些技巧:
$highest_row = $sheet->getHighestRow(); // 取得总行数 $highest_column = $sheet->getHighestColumn(); ///取得列数 字母abc... $highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highest_column);//转化为数字 for ($i = 1; $i <= $highestColumnIndex; $i++) { for ($j = 1; $j <= $highest_row; $j++) { $conent = $sheet->getCellByColumnAndRow($i, $j)->getCalculatedValue(); $info[$j][$i] = $conent; } }
最后附上读取csv的两种方法:
//核心函数,读取Csv文件 public function ImportCsv($files){ $shuzhu = array();//字段数组用来写入条件 $table = array();//字段内容数组 set_time_limit(90); ini_set("memory_limit", "200M"); $handle = fopen($files, 'r'); if (!$handle) { exit('读取文件失败'); } while (($data = fgetcsv($handle)) !== false) { // 下面这行代码可以解决中文字符乱码问题 $data = $this->mult_iconv('gbk','utf-8',$data); $table[] = $data; } return $table; } //超大Csv文件导入 public function readLargeCsv($files) { set_time_limit(90); ini_set("memory_limit", "200M"); $handle = fopen($files, 'rb'); while (feof($handle)===false) { # code... yield fgetcsv($handle); } fclose($handle); }
记录完毕。