PhpSpreadsheet
PhpSpreadsheet是什么PhpSpreadsheet是一个纯以PHP编写的库,通过供应的类来处理不同类型的电子表格文件读写功能,而且PhpSpreadsheet支持的电子表格格式也算是比较丰富,而且对付spreadsheet-reader专注于数据读取最大的差异是同时支持读取和写入的功能。如下是PhpSpreadsheet支持的电子表格格式,虽然还有一些不支持写入,但是主流文件格式全都支持的:
PhpSpreadsheet支持的电子表格类型

PhpSpreadsheet对付PHP的版本哀求要略高,须要7.2以上的版本,相对付spreadsheet-reader的PHP 5.3的版本哀求来说,可能还须要对付做事器的PHP版本做个更新,不过PHP7的确供应了不少不错的功能升级,以是将PHP版本更新成7乃至更新的8还是不错的选择。
安装PhpSpreadsheet
可以直接通过Composer来安装PhpSpreadsheet,可以一步将PhpSpreadsheet的依赖库一起管理起来,直接composer require就可以了:
composer require phpoffice/phpspreadsheet
先来一个Hello World:
<?phprequire 'vendor/autoload.php';use PhpOffice\PhpSpreadsheet\Spreadsheet;use PhpOffice\PhpSpreadsheet\Writer\Xlsx;$spreadsheet = new Spreadsheet();$sheet = $spreadsheet->getActiveSheet();$sheet->setCellValue('A1', 'Hello World !');$writer = new Xlsx($spreadsheet);$writer->save('hello world.xlsx');?>
直接实行这个PHP之后就会在相同的文件夹中天生一个hello world.xlsx了,比较建议直策应用PHP的命令行来实行
php path/to/helloworld.php
利用方法
加载excel文件
在PhpSpreadsheet须要通过IOFactory的静态方法createReader来创建一个阅读器的工具,在创建的时候须要设置阅读文件的格式,然后直接通过阅读器工具的load方法就可以加载须要的文件了,例如下面是一个加载xlsx文件的代码:
$inputFileType = 'Xlsx';// $inputFileType = 'Xls';// $inputFileType = 'Xml';// $inputFileType = 'Ods';// $inputFileType = 'Slk';// $inputFileType = 'Gnumeric';// $inputFileType = 'Csv';$inputFileName = './sampleData/example1.xls';/ 根据$inputFileType天生一个阅读器工具 /$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType);/ 加载 $inputFileName 并天生一个Spreadsheet工具 /$spreadsheet = $reader->load($inputFileName);
当然也可以用更直接的办法加载文件,便是通过IOFactory的静态方法load,这个方法会考试测验识别文件类型,然后加载相对应的阅读器实例:
$inputFileName = './sampleData/example1.xls';/ 加载 $inputFileName 并天生一个Spreadsheet工具 /$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($inputFileName);
还有一种办法,便是直接通过new来创建阅读器工具,然后在通过阅读器的load方法加载文件,如下:
$inputFileName = './sampleData/example1.xls';/ 创建一个Xlsx阅读器工具 /$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();// $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls();// $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xml();// $reader = new \PhpOffice\PhpSpreadsheet\Reader\Ods();// $reader = new \PhpOffice\PhpSpreadsheet\Reader\Slk();// $reader = new \PhpOffice\PhpSpreadsheet\Reader\Gnumeric();// $reader = new \PhpOffice\PhpSpreadsheet\Reader\Csv();/ 加载 $inputFileName 并天生一个Spreadsheet工具 /$spreadsheet = $reader->load($inputFileName);
PhpSpreadsheet还供应了一些阅读器的设置,例如设置文件数据只读,只加载制订事情表等,详细可以参考文档
个中Spreadsheet工具便是电子表格文件相对应的可操为难刁难象,在之后可以直接调用这个工具中方法来完身分歧的目的。
获取相应的事情表
首先对付包含多个事情表的电子表格文件,可以先获取到事情表的数量,然后在通过循环来遍历所有的事情表,当然也可以根据事情表标题来加载制订事情表,或者是获取当前生动的事情表,也便是用Excel打开电子表格时,当前显示的事情表。
/ 获取事情表数量 /$sheetCount = $spreadsheet->getSheetCount();for($i=0; $i<$sheetCount; $i++){/ 根据下标来获取对应的事情表 /$sheet = $spreadsheet->getSheet($i);/ 对每个事情表的操作 /}/ 根据事情表名称获取事情表 /$sheet = $spreadsheet->getSheetByName('Sheet1');/ 直接获取活动的事情表 /$sheet = $spreadsheet->getActiveSheet();
读取单元格数据
当获取到Sheet工具之后,就可以获取事情表中每一个单元格的工具,终极获取单元格内的数据。由于我这里紧张是大量数据的导入,以是我首先利用的是遍历所有有数据的单元格以完成所有的数据导入,要遍历全体事情表内的数据,首先须要获取事情表中统共有多少列和多少行数据,可以通过如下的代码:
// 获取相应事情表内,最高的行数和列数$highestRow = $sheet->getHighestRow(); // 如: 10$highestColumn = $sheet->getHighestColumn(); // 如: 'F'// 末了须要将列数转换成数字,由于绝大多数电子表格列数是用字母来表示的$highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn); // 如 5
有了最高的行数和列数之后,就可以用一个大略的嵌套For循环来遍历全体事情表内的每个单元格:
for($row = 1;$row<=$highestRow;$row++){for($col = 1;$col<=$highestColumnIndex;$col++){/ 获取单元格的工具 /$cell = $sheet->getCellByColumnAndRow($col,$row);/ 获取单元格的数值 /$value = $cell->getValue();/ 也可以是将方法串联起来 /// $value = $sheet->getCellByColumnAndRow($col,$row)->getValue();/ 如果数据是通过一个公式得出的话,可以利用getCalculatedValue() /// $calculatedValue = $sheet->getCellByColumnAndRow($col,$row)->getCalculatedValue();/ 如果须要格式化相应单元格内的数据,例如日期等,可以利用getFormattedValue() /// $formatedValue = $sheet->getCellByColumnAndRow($col,$row)->getFormattedValue();}}
基于习气我是直策应用下标的办法来遍历这个事情表中的单元格,实际PhpSpreadsheet还供应了一种通过迭代器(Iterator)遍历的办法,这样代码可以更简洁一些,代码如下:
foreach($sheet->getRowIterator() as $row){$cellIterator = $row->getCellIterator();/ 设置遍历所有单元格,就算单元格是空的 /$cellIterator->setIterateOnlyExistingCell(FALSE);foreach($cellIterator as $cell){$value = $cell->getValue();}}
对付其他的运用处景,可能直接通过事情表内的坐标值或者行列对来获取一个单元格的工具会更直接一些,例如:
/ 获取坐标为A1的单元格内的值 /$value=$sheet->getCell('A1')->getValue();/ 获取第1列 第5行的单元格内的值 /$value=$sheet->getCellByColumnAndRow(1,5)->getValue();
末了一种办法可以通过一个范围来获取范围内单元格的值,然后输出到数组,如下:
/ 获取C3至E5内的数据$dataArray = $sheet->rangeToArray( 'C3:E5', // 事情表内的单元格坐标范围 NULL, // 当单元格为空时,返回的值 TRUE, // 如果是公式,是否要打算值,等同利用getCalcuatedValue() TRUE, // 是否须要利用格式化的数据,等同利用getFormattedValue() TRUE // 输出数组是否利用表格单元格的行数和列数作为下标 );
数据库操作
由于这次读入的数据须要插入相应的数据库中,而且每个事情表中的数据列所代表的属性也不同,以是还须要在表格的第一行加入相应属性的名称,也便是在遍历全体事情表的时候,当处于第一行的时候,须要将此行内单元格的内容保存为键,然后在之后的行数中就可以用相应的列数来获取对应的键来添加入数据的数组中,终极在每一行数据读取完成后,来处理数据库插入的操作。当然,如果导入数据构造相比拟较直不雅观的话,也可以通过一个insert语句导入,这样可以大幅度提升数据写入的效率。
总结这次紧张是分享了PhpSpreadsheet数据读取的部分,也是这次在我自己项目中用到的部分,总之PhpSpreadsheet的功能还是比较完善的,文档也是非常完善的还包含了不少示例,只是目前核心文档还是英文的,中文文档相比拟较零散。如果大家感兴趣理解更多关于PhpSpreadsheet的其他功能,欢迎在评论区谈论!
如果大家对PhpSpreadsheet 或者其他开拓方面的话题感兴趣的话,可以关注我!
感激阅读!