2 min read

php:phpexcel类操作小记

PHP操作EXCEL类:PHPEXCEL.php

官网:http://www.codeplex.com/PHPExcel

引用文件(下面2段代码都需要)

require 'phpexcel/PHPExcel.php';

==================下面是上传EXCEL文件导入SQL的代码(含简易文件上传代码)

if (! empty ( $_FILES ['file_stu'] ['name'] )) 
{
    $tmp_file = $_FILES ['file_stu'] ['tmp_name'];
    $file_types = explode ( ".", $_FILES ['file_stu'] ['name'] );
    $file_type = $file_types [count ( $file_types ) - 1];

     /*判别是不是.xls文件,判别是不是excel文件*/
     if (strtolower ( $file_type ) != "xlsx"  ) exit('不是Excel文件,重新上传');

    /*设置上传路径*/
     $savePath = 'tmp/';
     $file_name = "data.xlsx";

     /*是否上传成功*/
     if (! copy ( $tmp_file, $savePath . $file_name )) exit('上传失败');


        //读取EXCEL文件
        set_time_limit(30); 
        $objPHPExcel = PHPExcel_IOFactory::load($savePath . $file_name); 
		 
        // 读取规则 【Sheet1是页名称,这里固定使用默认的第一页】
                //ABCD用于后面循环 A1,A2,A3,A4,A5,B1...
        $sheet_read_arr = array(); 
        $sheet_read_arr["Sheet1"] = array("A","B","C","D","E","F","G","H","I","J","K"); 
		 
        // 循环所有的页 (上面只定义了一页,所以循环才一次)
        foreach ($sheet_read_arr as $key => $val) 
        { 
            $currentSheet = $objPHPExcel->getSheetByName($key);// 通过页名称取得当前页 
            if (!$currentSheet) 
            {
                echo 'EXCEL的页名错误.确定是【Sheet1】.第一个字母大写';exit;
            }
            //var_dump($currentSheet);exit;
            $row_num = $currentSheet->getHighestRow();// 当前页行数 

		 
            // 循环从第二行开始,第一行往往是表头 
            for ($i = 2; $i <= $row_num; $i++) 
            { 
                $cell_values = array(); 

                foreach ($val as $cell_val) 
                { 
                    $address = $cell_val . $i;// 单元格坐标 ('A'+2=A2...)
		 
                    // 读取单元格内容 
                    $cell_values[] = $currentSheet->getCell($address)->getFormattedValue(); 
                } 
		 
                $cell_values_arr[] = $cell_values;
            } 

        }



    //开始导入数据库。开始计时
    $start = microtime(true);
    //开启SQLITE 事务。
    $conn->exec("begin transaction");
    //更新数据计数$x
        foreach ($cell_values_arr as $list) {
                                //数据处理略过...
                $conn->exec("INSERT INTO ..");//这里插入语句,这里插入并不会执行
            }
    $conn->exec("commit transaction"); //这里开始执行上面插入的数据
    $end = microtime(true);

    //清除临时文件夹
    file_put_contents($savePath . $file_name, '');
    //输出内容
    echo '<br>导入成功!';
    echo '<br>导入数据:'.$x.'条';
    echo '<br>执行时间:'.($end - $start);
    echo '<br>临时文件删除!';
}

==================================下面是PHP导出到EXCEL的代码

//....
//PHP查询SQL部分略过...最终导入数组文件$mainlist
//.......

// 首先创建一个新的对象  PHPExcel object
$objPHPExcel = new phpexcel();

//使用磁盘缓存。速度慢。但是占内存小
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_discISAM;
PHPExcel_Settings::setCacheStorageMethod($cacheMethod);  
			
// 设置文件的一些属性,在xls文件——>属性——>详细信息里可以看到这些值,xml表格里是没有这些值的
    $objPHPExcel
    ->getProperties()  //获得文件属性对象,给下文提供设置资源
    ->setCreator( "Maarten Balliauw")                 //设置文件的创建者
    ->setLastModifiedBy( "Maarten Balliauw")          //设置最后修改者
    ->setTitle( "Office 2007 XLSX Test Document" )    //设置标题
    ->setSubject( "Office 2007 XLSX Test Document" )  //设置主题
    ->setDescription( "Test document for Office 2007 XLSX, generated using PHP classes.") //设置备注
    ->setKeywords( "office 2007 openxml php")        //设置标记
    ->setCategory( "Test result file");                //设置类别

    // 给表格添加数据:设置标题(第一行)
    $objPHPExcel->setActiveSheetIndex(0)          //设置第一个内置表(一个xls文件里可以有多个表)为活动的
        ->setCellValue( 'A1', '你好' )         //给表的单元格设置数据
        ->setCellValue( 'B1', '安哥!' )      //数据格式可以为字符串
        ->setCellValue( 'C1', 12)            //数字型
        ->setCellValue( 'D1', 12)            //
        ->setCellValue( 'E1', true )           //布尔型
        ->setCellValue( 'F1', '=SUM(C1:D2)' );//公式

    //设置填充的样式和背景色(第一行)
    $objPHPExcel->getActiveSheet()->getStyle( 'A1:F1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
    $objPHPExcel->getActiveSheet()->getStyle( 'A1:F1')->getFill()->getStartColor()->setARGB('fff4f4f4');
    //字体设置粗体
    //$objPHPExcel->getActiveSheet()->getStyle( 'A1:S1')->getFont()->setBold(true);

    $num = 1; 
    foreach ($mainlist as $list) {
        $num++;
        $objPHPExcel->setActiveSheetIndex(0)
        ->setCellValue( 'A'.$num , $list['a]) )        
        ->setCellValue( 'B'.$num , $list['b'] )      
        ->setCellValue( 'C'.$num , $list['c'] )            
        ->setCellValue( 'D'.$num , $list['d'] )           
        ->setCellValue( 'E'.$num , $list['e'] )
        ->setCellValue( 'F'.$num , $list['f'] )
    }
    $num = $num+2;//空1行

    //合并最后一行单元格。显示统计信息
    $objPHPExcel->getActiveSheet()->mergeCells( 'A'.$num.':'.'S'.$num);
    $objPHPExcel->setActiveSheetIndex(0)             
        ->setCellValue( 'A'.$num , '本信息由系统自动生成.共导信息数:'.($num-3) );

    //得到当前活动的表,注意下文教程中会经常用到$objActSheet
    $objActSheet = $objPHPExcel->getActiveSheet();

    // 给当前活动的表设置名称
    $objActSheet->setTitle('XX列表');

    // 生成2003excel格式的xls文件
    //文件名:2014-3-4-3.xls (时间.xls)
    $filename = date("Y-m-d")'.xls';
    //ob_end_clean(); //防止乱码
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename="'.$filename.'"');
    header('Cache-Control: max-age=0');
        //直接弹出下载文件。
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
    $objWriter->save('php://output');
    exit;