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;