因为工作需要将Excel的文件记录读出再写入数据库中,之前使用的是VBS,可是那也不是正规的应用程序,使用PowerBuilder也可以,但是PowerBuilder毕竟只是临时使用,C#好长时间不用了,就打算使用最近学习的PHP来操作。
下班后就开始干,折腾了将近4个小时,终于搞定了,遇到了好多的坑,快崩溃了,想一想为这些肤浅的代码所累,程序员的日子不好过!
要使用PHP读取Excel的文件记录,查了资料都是使用PHPExcel这个文件包,并且全部都要使用Composer来安装,结果遇到了第一个坑:Composer始终安装不上PHPOffice/PHPExcel。
首先安装Composer。
composer require phpoffice/phpspreadsheet,后面可加版本号也可以不加。
可能是因为我们上外网代理的缘故,始终安装不上,好不容易安装上了,使用Composer始终安装不上PHPOffice/PHPExcel,各种莫名其妙的错误提示。
接下来我下载了JetBrains PhpStorm,在它里面进行安装,错误提示变了一些,可是还不行,打开OPENSSL和下载证书也还是不行。
为这个耗费了3个小时,真心快崩溃了,想一想为什么别人可以呢?
为什么一定要Composer安装?其实安装不过是将PHPOffice的信息写到配置文件,方便程序员在编程环境下进行代码提示、错误检测还有后期的运行提示,不安装又怎样?
在网上下载一个付费的PHPOFFICE,解包到一个目录,引用一下,按照网上的方式读取,结果几十行的错误提示:
Deprecated: Array and string offset access syntax with curly braces is deprecated in G:\\PHP2021\\HTAPP\\phpexcel\\Classes\\PHPExcel\\Shared\\String.php on line 526
……
Deprecated: Array and string offset access syntax with curly braces is deprecated in G:\\PHP2021\\HTAPP\\phpexcel\\Classes\\PHPExcel\\Reader\\Excel5.php on line 1928
……
Deprecated: Array and string offset access syntax with curly braces is deprecated in G:\\PHP2021\\HTAPP\\phpexcel\\Classes\\PHPExcel\\Calculation.php on line 2551
……
Deprecated: Array and string offset access syntax with curly braces is deprecated in G:\\PHP2021\\HTAPP\\phpexcel\\Classes\\PHPExcel\\Worksheet\\AutoFilter.php on line 720
……
Deprecated: Array and string offset access syntax with curly braces is deprecated in G:\\PHP2021\\HTAPP\\phpexcel\\Classes\\PHPExcel\\Cell.php on line 812
这个意思是:不推荐使用:不推荐使用带大括号的数组和字符串偏移量访问语法,这个显示有几十行,让人沮丧,因为类库是别人写的,本来打算放弃的,将网页拉到最后,竟然有数据记录读出来,真是让人惊喜,意味着只要解决这个错误就可以了。
逐个打开有错误提示的文件,将数组的“{}”访问方式改成“[]”,错误太多了改了半个小时,问题解决了。
<?php error_reporting(E_ALL);//报告所有错误 date_default_timezone_set(\'PRC\'); //设置时区为中国 /** PHPExcel_IOFactory */ require_once \'./Classes/PHPExcel/IOFactory.php\'; $excelFilename=\"安装记录111.xlsx\"; $ext=substr($excelFilename,strripos($excelFilename,\'.\')); $dataSheet=[]; if($ext==\'.xlsx\'){ //按Excel2007文件格式读取 $reader = PHPExcel_IOFactory::createReader(\'Excel2007\'); $reader->setReadDataOnly(true); $spreadSheet=$reader->load($excelFilename); $workSheet=$spreadSheet->getActiveSheet(); foreach($workSheet->getRowIterator() as $key=>$row){ $cellIterator=$row->getCellIterator(); $cellIterator->setIterateOnlyExistingCells(false); foreach($cellIterator as $k=>$cell){ $dataSheet[$key][$k]=$cell->getValue(); } } }elseif($ext==\'.xls\'){ //以Excel5(Excel97-2003工作簿)的格式读取 $reader = PHPExcel_IOFactory::createReader(\'Excel5\'); //加载excel文件 $PHPExcel = $reader->load(\"WPS安装记录.xls\"); //读取第一个工作表 $sheet = $PHPExcel->getSheet(0); //获取总行数 $highestRow = $sheet->getHighestRow(); //获取总列数 $highestColumm = $sheet->getHighestColumn(); //读取单元格的数据(从第一行,A列开始先行后列) for ($row = 1; $row <= $highestRow; $row++){ for ($column = \'A\'; $column <= $highestColumm; $column++) { $dataSheet[] = $sheet->getCell($column.$row)->getValue(); } } }else{ exit(\"不能识别{$excelFilename}.\\n\"); } print_r($dataSheet); ?>
搞定!文件记录全部显示出来,既可以读取后缀为xls的文件也可以读取xlsx的文件。
后面就是写入数据库了。
这个方法还是有点麻烦,后面找其他的方法,至少ODBC应该是可以的。
补充
PHP其实不仅能读取Excel文件的记录,还可以生成Excel文件
下面这代码中函数arrayToExcel的功能是把一个二维数组的数据生成一个excel文件,并且保存在服务器上。
require_once \'Classes/PHPExcel/Reader/Excel2007.php\'; require_once \'Classes/PHPExcel/Reader/Excel5.php\'; include \'Classes/PHPExcel/IOFactory.php\'; function arrayToExcel($data){ $objPHPExcel = new PHPExcel(); $objPHPExcel->setActiveSheetIndex(0); $objPHPExcel->getActiveSheet()->setTitle(\'firstsheet\'); $objPHPExcel->getDefaultStyle()->getFont()->setName(\'Arial\'); $objPHPExcel->getDefaultStyle()->getFont()->setSize(10); //add data $i = 2; foreach ($data as $line){ $objPHPExcel->getActiveSheet()->setCellValue(\'A\'.$i, $line[\'From\']); $objPHPExcel->getActiveSheet()->getCell(\'A\'.$i)->setDataType(\'n\'); $objPHPExcel->getActiveSheet()->setCellValue(\'B\'.$i, $line[\'To\']); $objPHPExcel->getActiveSheet()->getCell(\'B\'.$i)->setDataType(\'n\'); $i++; } $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, \'Excel5\'); $file = \'excel.xls\'; $objWriter->save($file); }
如果你不希望保存在服务器上,希望生成以后直接下载到客户端,可以在输出文件的时候加入下面的代码,而不使用 $objWriter->save($file);
代码如下:
header(\"Pragma: public\"); header(\"Expires: 0\"); header(\"Cache-Control:must-revalidate, post-check=0, pre-check=0\"); header(\"Content-Type:application/force-download\"); header(\"Content-Type:application/vnd.ms-execl\"); header(\"Content-Type:application/octet-stream\"); header(\"Content-Type:application/download\"); header(\'Content-Disposition:attachment;filename=\"excel.xls\"\'); header(\"Content-Transfer-Encoding:binary\"); $objWriter->save(\'php://output\');
暂无评论内容