在一些项目中,经常会需要将Excel文件导入到Mysql或其他数据库中,我们这里使用PHPExcel来进行导入。
PHPExcel是一个使用PHP语言开发的Excel操作类,拥有读取、写入等强大功能。
我们可以读取服务器上的文件进行导入,也可以通过上传进行导入。
首先进行文件上传:
$file='/tmp/excel.xlsx';
move_uploaded_file($_FILES["file"]["tmp_name"],$file);
之后我们需要进行一些设置,防止导入大文件时超时等:
ini_set("memory_limit","-1");
set_time_limit(1800);
在PHPExcel中,可以设置缓存已节省内存开始,但会影响读取与写入单元格的速度(官方文档中有此说明)。如果你的内存勾搭,获取并不需要进行缓存设置,但对于小内存的服务器,这是很有必要的。PHPExcel有多种缓存机制,我们使用gzip压缩方式来使用:
$cacheMethod=PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;
if(!PHPExcel_Settings::setCacheStorageMethod($cacheMethod)){
die($cacheMethod."cachingmethodisnotavailable".EOL);
}
官方文档中介绍,在脚本执行完成之前,已初始化过的缓存设置将不能被更改,会一直使用到脚本执行结束。
设置好缓存之后,我们就可以对Excel文件进行读取了:
$reader=PHPExcel_IOFactory::createReader('Excel');
$reader->setReadDataOnly(true);
我们读取的是Excel格式的文件,PHPExcel支持多种文件格式,如果需要查看对应格式的使用方式可以去查看官方文档。
设置 setReadDataOnly 有助于提高读取性能。
加载文件,之后获取当前的sheet进行操作:
$excel=$reader->load($file);
$sheet=$excel->getActiveSheet();
你可以通过读取单元格的方式来进行操作,也可以通过数组的方式进行操作。
数组方式:
$sheet->toArray(null,true,true,true);
单元格方式:
$sheet->getCell('A6')->getFormattedValue();
可以读取单元格数据之后,我们就可以将数据写入数据库了。
但这样远没有结束,如果你的Excel文件过大的话,load操作的时间会特别特别长(超强服务器请忽略此句),所以我们需要对数据进行分块处理。
我们可以通过Filter来进行分块操作,我们这里定义一个ReadFilter的过滤类:
classReadFilterimplementsPHPExcel_Reader_IReadFilter
{
private$_startRow=0;
private$_endRow=0;
publicfunctionsetRows($startRow,$chunkSize)
{
$this->_startRow=$startRow;
$this->_endRow=$startRow+$chunkSize;
}
publicfunctionreadCell($column,$row,$worksheetName='')
{
if($row>=$this->_startRow&&$row_endRow){
returntrue;
}
returnfalse;
}
}
我们读取的时候通过setRows来规定要读取的起始行和结束行,在readCell中对数据进行过滤,return false则为忽略此条数据。
我们通过URL参数来规定此页面需要读取哪些数据,读取完之后刷新,进行下一批操作,这个功能可以自行尝试。
我们对Excel的操作基本就可以完成了,其实这应该是一个很简单的功能,因为在我的本地服务器上只写了一遍代码就通过了,但传到在线服务器后,发现在线服务器有各种各样的限制,而我又不能修改这些限制,于是尝试了多种读取及数据库写入方式,今天面对的最多的一句话就是Mysql has gone away,当我无比心酸,但最后筛查后发现是框架里的数据库操作类有问题。 =_=
这篇博客就到这里了。
如果觉得《php如何将excel数据导入到数据库 【PHP】将Excel数据导入到MySQL数据库中》对你有帮助,请点赞、收藏,并留下你的观点哦!