thinkphp3.1中的phpexcel导入怎么用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了thinkphp3.1中的phpexcel导入怎么用相关的知识,希望对你有一定的参考价值。

  首先,去phpExcel官方网站下载PHPExcel,官方地址为;http://phpexcel.codeplex.com/.我下的是1.8.0版本的.解压后发现还是蛮大的,有十几M,不知道其他版本是不是会小点.
  这里写图片描述
  把解压好的PHPExcel文件放在ThinkPHP的Vender文件夹下(专门放第三方类库的),如下图
  这里写图片描述
  其次,创建Excel转换数组类,并把它放在ThinkPHP\\Extend\\Library\\ORG\\Util目录下
  class ExcelToArrary
  public function __construct()
  Vendor("PHPExcel.Classes.PHPExcel");//引入phpexcel类(留意路径,不了解路径可以查看下手册)
  Vendor("PHPExcel.Classes.PHPExcel.IOFactory"); //引入phpexcel类(留意路径)
  
  public function read($filename,$encode,$file_type)
  if(strtolower ( $file_type )==\'xls\')//判断excel表类型为2003还是2007
  
  Vendor("PHPExcel.Classes.PHPExcel.Reader.Excel5"); //引入phpexcel类(留意路径)
  $objReader = PHPExcel_IOFactory::createReader(\'Excel5\');
  elseif(strtolower ( $file_type )==\'xlsx\')
  
  Vendor("PHPExcel.Classes.PHPExcel.Reader.Excel2007");//引入phpexcel类(留意路径)
  $objReader = PHPExcel_IOFactory::createReader(\'Excel2007\');
  
  $objReader->setReadDataOnly(true);
  $objPHPExcel = $objReader->load($filename);
  $objWorksheet = $objPHPExcel->getActiveSheet();
  $highestRow = $objWorksheet->getHighestRow();
  $highestColumn = $objWorksheet->getHighestColumn();
  $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
  $excelData = array();
  for ($row = 1; $row <= $highestRow; $row++)
  for ($col = 0; $col < $highestColumnIndex; $col++)
  $excelData[$row][] =(string)$objWorksheet->getCellByColumnAndRow($col, $row)->getValue();
  
  
  return $excelData;
  
  
  1
  2
  3
  4
  5
  6
  7
  8
  9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  24
  25
  26
  27
  28
  29
  30
  1
  2
  3
  4
  5
  6
  7
  8
  9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  24
  25
  26
  27
  28
  29
  30
  如右图这里写图片描述
  现在来说Excel,表格的结构样式和mysql样式要类似,表格样式如下(本人对Excel使用只是一般,所以如果有Excel大神做的报表,不知后果如何).
  这里写图片描述
  前端页面相关代码:
  <div>
  <form method="post" action=":U(\'Index/upload\')" enctype="multipart/form-data">
  <font>导入Excel数据:</font>
  <label for="file_stu">上传</label>
  <input name="file_stu" type="file" id="file_stu" />
  <h3>温馨提示:</h3>
  <p>请确认您的Excel表格类型是xls的,以免出现兼容问题.</p>
  <inputtypeinputtype="submit" class="sure" value="导入" />
  </form>
  </div>
  1
  2
  3
  4
  5
  6
  7
  8
  9
  10
  1
  2
  3
  4
  5
  6
  7
  8
  9
  10
  最后,控制器部分使用了Thinkphp自带的上传类,使用unlink()函数是为了删除上传的excel表格,以免文件夹存入过多文件,调试代码时可先注释掉.或者不写也行,把删除文件的工作交给你们的运维.代码中foreach循环部分$v[]里的0, 1,2可以改动以下看看与Excel表格里的内容是什么关系.可以把数组打印出来看一看,你就很清楚了
  相关代码:
  public function upload()
  import(\'ORG.Util.ExcelToArrary\');//导入excelToArray类
  if (! empty ( $_FILES [\'file_stu\'] [\'name\'] ))
  import(\'ORG.Net.UploadFile\');
  $upload = new UploadFile();// 实例化上传类
  $upload->maxSize = 3145728 ;// 设置附件上传大小
  $upload->allowExts = array(\'xls\', \'xlsx\');// 设置附件上传类型
  $upload->savePath = \'./Uploads/\';// 设置附件上传目录
  if(!$upload->upload()) // 上传错误提示错误信息
  $this->error($upload->getErrorMsg());
  else// 上传成功 获取上传文件信息
  $info = $upload->getUploadFileInfo();
  
  else
  $this->error(\'(⊙o⊙)~没传数据就导入?!你在逗我?!\');
  
  //dump($info);die;
  $ExcelToArrary=new ExcelToArrary();//实例化
  $res=$ExcelToArrary->read($info[0][\'savepath\'].$info[0][\'savename\'],"UTF-8",$info[0][\'extension\']);//传参,判断office2007还是office2003
  $res = array_slice($res,1); //为了去掉Excel里的表头,也就是$res数组里的$res[0];
  //dump($res);
  foreach ( $res as $k => $v ) //循环excel表
  $data[$k][\'mobile\'] = $v [0];//创建二维数组
  $data[$k][\'name\'] = $v [1];
  $data[$k][\'duty\'] = $v [2];
  
  //dump($data);die;
  $result=M(\'appkey\')->addAll($data);
  if(!$result)
  $this->error(\'导入数据库失败\');
  exit();
  else
  $filename = \'./Uploads/\'.$info[0][\'savename\'];//上传文件绝对路径,unlink()删除文件函数
  if (unlink($filename))
  $this->success ( \'导入成功\' );
  else
  $this->error(\'缓存删除失败\');
  
  
  
参考技术A

一、上传Excel文件,使用PHP里自带的上传方法 “\\Think\\Upload();”,可以很方便的实现。为此我整理下使用这个方法的最简单方式

/**
 * TODO 上传文件方法
 * @param $fileid form表单file的name值
 * @param $dir 上传到uploads目录的$dir文件夹里
 * @param int $maxsize 最大上传限制,默认1024000 byte
 * @param array $exts 允许上传文件类型 默认array('gif','jpg','jpeg','bmp','png')
 * @return array 返回array,失败status=0 成功status=1,filepath=newspost/2014-9-9/a.jpg
 */
function uploadfile($fileid,$dir,$maxsize=5242880,$exts=array('gif','jpg','jpeg','bmp','png'),$maxwidth=430)
    $upload = new \\Think\\Upload();// 实例化上传类
    $upload->maxSize   =     $maxsize;// 设置附件上传大小,单位字节(微信图片限制1M
    $upload->exts      =     $exts;// 设置附件上传类型
    $upload->rootPath  =     './uploads/'; // 设置附件上传根目录
    $upload->savePath  =     $dir.'/'; // 设置附件上传(子)目录
    // 上传文件
    $info   =   $upload->upload();

    if(!$info) // 上传错误提示错误信息
        return array(status=>0,msg=>$upload->getError());
    else// 上传成功
        return array(status=>1,msg=>'上传成功',filepath=>$info[$fileid]['savepath'].$info[$fileid]['savename']);
    

这里默认上传到ThinkPHP入口文件index.php所在的文件夹uploads,此方法返回一个数据,状态status=1时为成功,也建议大家在写功能模块时或做封装时,整个系统的在架构初期应该有约定,在必要的情况下返回值用数组形式,成功返回

return array(status=>1,data=>....,info=>.....)

失败时可以返回

array(status->0,info=>'可以说明出错的原因',....)

这样用统一的方式有利于规范开发,团队协作时看代码时可以提高效率,减少思维运转,说远了,上传的方法调用方式如下:

   //excel 文件
        if(!empty($_FILES['xls']['name']))
            $upload=uploadfile('xls','tempxls',5242880,array('xls','xlsx'));
            if($upload['status'])
                $path=$upload['filepath'];
            else
                $this->error($upload['msg']);
            
        

二、获取Excel数据

  1.首先需要引入PHPExcel的类库

require_once 'module/PHPExcel/Classes/PHPExcel/IOFactory.php';

  2.获取Excel第0张表即(Sheet1)

//获取excel文件
$objPHPExcel = \\PHPExcel_IOFactory::load("uploads/$path");
$objPHPExcel->setActiveSheetIndex(0);
$sheet0=$objPHPExcel->getSheet(0);

  3.获取行数,并把数据读取出来$data数组

  $rowCount=$sheet0->getHighestRow();//excel行数
        $data=array();
        for ($i = 2; $i <= $rowCount; $i++)
            $item['name']=$this->getExcelValue($sheet0,'A'.$i);
            $item['sex']=$this->getExcelValue($sheet0,'B'.$i);
            $item['contact']=$this->getExcelValue($sheet0,'C'.$i);
            $item['remark']=$this->getExcelValue($sheet0,'D'.$i);
            $item['addtime']=$this->getExcelValue($sheet0,'E'.$i);

            $data[]=$item;
        


三、最后保存到数据

     $success=0;
        $error=0;
        $sum=count($data);
        foreach($data as $k=>$v)
            if(M('temp_area3')->data($v)->add())
                $success++;
            else 
                $error++;
            
        

        echo "总$sum条,成功$success条,失败$error条。";

thinkphp3.2和phpexcel导入

最简单的导入

$file_name= ./Upload/excel/123456.xls;
        import("Org.Util.PHPExcel");
        import("Org.Util.PHPExcel.IOFactory");
        $objReader = \PHPExcel_IOFactory::createReader(Excel5);
        $objPHPExcel = $objReader->load($file_name,$encode=utf-8);
        $sheet = $objPHPExcel->getSheet(0);
        $highestRow = $sheet->getHighestRow(); // 取得总行数
        $highestColumn = $sheet->getHighestColumn(); // 取得总列数
    
        $s = $objPHPExcel->getActiveSheet()->getCell("A2")->getValue();

 

以上是关于thinkphp3.1中的phpexcel导入怎么用的主要内容,如果未能解决你的问题,请参考以下文章

PHP 用PHPExcel往数据库导入大量数据

phpexcel导入excel表格,导入后自动为科学计数法5.1115E+14

php怎么导出大量数据的Excel

thinkphp5中的excel表的导入导出

基于ThinkPHP开发的PHPExcel导入

PHPExcel导入导出数据时候,部分小数会乱码。例如有一个30变成了29.:,在导入和导出的时候