柔晶美网络工作室

柔晶美网络工作室,倾心于web技术的博客站点

关注我 微信公众号

您现在的位置是: 首页 > 博客日记

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);
}

记录完毕。

文章评论


需要 登录 才能发表评论
热门评论
0条评论

暂时没有评论!