thinkphp使用phpoffice/phpspreadsheet,导入导出数据

PHP 专栏收录该内容
34 篇文章 0 订阅

由于PHPExcel已经不再维护,PhpSpreadsheet是PHPExcel的下一个版本。PhpSpreadsheet是一个用纯PHP编写的库,并引入了命名空间,PSR规范等。这里简单介绍下PhpSpreadsheet的导入导出功能。

1、安装

1.使用composer安装:

composer require phpoffice/phpspreadsheet

2.GitHub下载:

https://github.com/PHPOffice/PhpSpreadsheet

下载好的放入vendor下PhpOffice

excel测试数据:
在这里插入图片描述

mysql字段
在这里插入图片描述

2、导入

前端页面:

<form action="{:url('import')}" method="post" enctype="multipart/form-data">
     <table align="center" width="90%" border="0">
           <tr>
              <td>
                   <a href="javascript:;" class="file">选择
                       <input type="file" name="inputExcelclass">
                   </a>
                   <a href="javascript:;" class="file">导入
                       <input type="submit" value="导入数据">
                   </a>
              </td>
         	</tr>
     </table>
</form>

控制器:

use PhpOffice\PhpSpreadsheet\IOFactory;
use \PhpOffice\PhpSpreadsheet\Spreadsheet;
public function import()
{
	//获取表格的大小,限制上传表格的大小5M
        if(isset($_FILES['inputExcelclass'])){
            $file_size = $_FILES['inputExcelclass']['size'];
            if ($file_size > 5 * 1024 * 1024) {
                $this->error('文件大小不能超过5M');
                exit();
            }
        }
        //限制上传表格类型
        if(isset($_FILES['inputExcelclass'])){
            $fileExtendName = substr(strrchr($_FILES['inputExcelclass']["name"], '.'), 1);
        }
        //application/vnd.ms-excel  为xls文件类型
        if ($fileExtendName != 'xls' && $fileExtendName != 'xlsx') {
            $this->error('必须为excel表格,且必须为xls格式!');
            exit();
        }
        // 有Xls和Xlsx格式两种
        if( $fileExtendName =='xlsx' )
        {
            $objReader = IOFactory::createReader('Xlsx');
        }else{
       		$objReader = IOFactory::createReader('Xls');
        }
        $objReader->setReadDataOnly(TRUE);
        $filename = $_FILES['inputExcelclass']['tmp_name'];
        $objPHPExcel = $objReader->load($filename);  //$filename可以是上传的表格,或者是指定的表格
        $sheet = $objPHPExcel->getSheet(0);   //excel中的第一张sheet
        $highestRow = $sheet->getHighestRow();       // 取得总行数
        $highestColumn = $sheet->getHighestColumn();   // 取得总列数
        \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn);
        $lines = $highestRow -1;
        if($lines <= 0){
           $this->error('excel表格,没有数据!');
        }
        //循环读取excel表格,整合成数组。如果是不指定key的二维,就用$data[i][j]表示。
        for ($j = 2; $j <= $highestRow; $j++) {
           $data[$j - 2] = [
           		'title' => trim($objPHPExcel->getActiveSheet()->getCell("A" . $j)->getValue()),
                'content' => trim($objPHPExcel->getActiveSheet()->getCell("B" . $j)->getValue()),
                'prices' => trim($objPHPExcel->getActiveSheet()->getCell("C" . $j)->getValue()),
                'create_time' => ($objPHPExcel->getActiveSheet()->getCell("D" . $j)->getValue()-25569)*24*60*60,
                'end_time' => ($objPHPExcel->getActiveSheet()->getCell("E" . $j)->getValue()-25569)*24*60*60,
           ];
         }
         //使用模型
         $class = new ClassModel();
         $res = $class->saveAll($data);
         if ($res) {
            $this->success('上传成功!');
         }
}

注:PHP 的时间函数是从1970-1-1日开始计算的,单位是秒数。但是 EXCEL的是从1900-1-1日开始算的单位是天数。
这里的create_time列在Excel在这里插入图片描述格式这样的,发现获取到的却是浮点型43110,以后查资料才知道在Excel中时间格式默认常规格式下,读取出都为浮点型,所以我们要将其转换下.
先获得 EXCEL中 1970-1-1 代表的数字,我查了是25569。
把excel中的43110,在php中用函数正确的显示出来
$time = (43110 – 25569) * 24 *60 *60; //获得秒数

3、导出

前端页面:

<a href="{:url('export')}" class="layui-btn layui-btn-small layui-btn-normal"><i class="layui-icon">&#xe642;</i>导出</a>

控制器

public function export(){
	$newExcel = new Spreadsheet();  //创建一个新的excel文档
    $objSheet = $newExcel->getActiveSheet();  //获取当前操作sheet的对象
    //设置宽度为true,不然太窄了
    $newExcel->getActiveSheet()->getColumnDimension('A')->setAutoSize(true);
    $newExcel->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);
    //获取数据库的数据。//使用模型
    $class = new ClassModel();
    $List = $class->select();
    $objSheet->setTitle('班级表');  //设置当前sheet的标题
    //设置第一栏的标题
    $objSheet->setCellValue('A1', '名称')
	                ->setCellValue('B1', '内容')
	                ->setCellValue('C1', '金额')
	                ->setCellValue('D1', '开始时间')
	                ->setCellValue('E1', '结束时间');
	foreach ($List as $k => $val) {
     	 $k = $k + 2;
         $objSheet->setCellValue('A' . $k, $val['title'])
                    ->setCellValue('B' . $k, $val['content'])
                     ->setCellValue('C' . $k, $val['prices'])
                      ->setCellValue('D' . $k, $val['create_time'])
                       ->setCellValue('E' . $k, $val['end_time']);
     }
     $this->downloadExcel($newExcel, '表1', 'Xls');              
}
//公共文件,用来传入xls并下载
function downloadExcel($newExcel, $filename, $format)
{
		ob_end_clean() ;
        // $format只能为 Xlsx 或 Xls
        if ($format == 'Xlsx') {
            header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        } elseif ($format == 'Xls') {
            header('Content-Type: application/vnd.ms-excel');
        }

        header("Content-Disposition: attachment;filename="
            . $filename . date('Y-m-d') . '.' . strtolower($format));
        header('Cache-Control: max-age=0');
        $objWriter = IOFactory::createWriter($newExcel, $format);

        $objWriter->save('php://output');

        //通过php保存在本地的时候需要用到
        //$objWriter->save($dir.'/demo.xlsx');

        //以下为需要用到IE时候设置
        // If you're serving to IE 9, then the following may be needed
        header('Cache-Control: max-age=1');
//         If you're serving to IE over SSL, then the following may be needed
        header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
        header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified
        header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
        header('Pragma: public'); // HTTP/1.0
        exit;
}
  • 3
    点赞
  • 2
    评论
  • 9
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值