PHPExcel

/**
	 * 下载excel数据表格
	 * @param $fileName
	 * @param $headArr
	 * @param $data
	 * @throws PHPExcel_Reader_Exception
	 */
	public function getExcel($fileName,$headArr,$data){
		//导入excel类库
		include APP.'/lib/PHPExcel.php';
		include APP.'/lib/PHPExcel/IOFactory.php';
		$date = date("Y_m_d",time());
		$fileName .= "_{$date}.xls";
		//phpExcel大数据量情况下内存溢出解决
		$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
	    $cacheSettings = array('memoryCacheSize'=>'16MB');
		PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);		
		//创建PHPExcel对象
		$objPHPExcel = new PHPExcel();		 
		$objPHPExcel->getProperties()->setTitle("export")->setDescription("none");
		//设置表头
		$key = ord("A");
		foreach($headArr as $v){
			$colum = chr($key);
			$objPHPExcel->setActiveSheetIndex(0) ->setCellValue($colum.'1', $v);
			$key += 1;
		}
		//数据从第二行开始		 
		$column = 2;
		foreach($data as $key => $rows){ //行写入
			$span = ord("A");
			foreach($rows as $keyName=>$value){// 列写入
				 $j = chr($span);
				 $objPHPExcel->getActiveSheet(0)->setCellValue($j.$column, $value);
				 $span++;
			}
			$column++;
		}
		//文件名
		$fileName = iconv("utf-8", "gb2312", $fileName);
		//  sheet命名		
		$objPHPExcel->getActiveSheet()->setTitle('列表');		
		// Set active sheet index to the first sheet, so Excel opens this as the first sheet		
		$objPHPExcel->setActiveSheetIndex(0);		
		$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);		
		// Set active sheet index to the first sheet, so Excel opens this as the first sheet		
		$objPHPExcel->setActiveSheetIndex(0);		
		$objWriter = IOFactory::createWriter($objPHPExcel, 'Excel2007');				
		/* 生成到浏览器,提供下载 */		
		ob_end_clean();  //清空缓存		
		header("Pragma: public");		
		header("Expires: 0");		
		header("Cache-Control:must-revalidate,post-check=0,pre-check=0");		
		header("Content-Type:application/force-download");		
		header("Content-Type:application/vnd.ms-execl");		
		header("Content-Type:application/octet-stream");		
		header("Content-Type:application/download");		
		header("Content-Disposition: attachment;filename=\"$fileName\"");		
		header("Content-Transfer-Encoding:binary");		
		$objWriter->save('php://output');		
		exit;
	}

PHP如何对CSV大文件进行读取并导入数据库?

对于数百万条数据量的CSV文件,文件大小可能达到数百M,如果简单读取的话很可能出现超时或者卡死的现象。

为了成功将CSV文件里的数据导入数据库,分批处理是非常必要的。

下面这个函数是读取CSV文件中指定的某几行数据:

/** * csv_get_lines 读取CSV文件中的某几行数据 * @param $csvfile csv文件路径 * @param $lines 读取行数 * @param $offset 起始行数 * @return array * */function csv_get_lines($csvfile, $lines, $offset = 0) {
    if(!$fp = fopen($csvfile, 'r')) {
    	return false;
    }
    $i = $j = 0;
	while (false !== ($line = fgets($fp))) {
		if($i++ < $offset) {
			continue; 
		}
		break;
	}
	$data = array();
	while(($j++ < $lines) && !feof($fp)) {
		$data[] = fgetcsv($fp);
	}
	fclose($fp);
    return $data;}

调用方法:

 

$data = csv_get_lines('path/bigfile.csv', 10, 2000000);

print_r($data);

函数主要采用行定位的思路,通过跳过起始行数来实现文件指针定位。

至于数据如何入库本文不再详细讲述。

上述函数对500M以内的文件进行过测试,运行通畅,对于更大的文件未做测试,请斟酌使用或加以改进。

 /**
     * 导出数据
     *
     * @param unknown_type $ary
     * @param unknown_type $GetKeys
     */
    function ExecutionExportPrint($ary,&$GetKeys)//$ary是结果集,$GetKeys是你选择复选框才导出对应的数据字段
    {
    	//定义此数组存储excel列标
		$_totalmark  = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX');
		//定义表格title
		$_totaltitle = array(
		'WorkID'=>'稿件编号',
		'DesignTime'=>'设计日期',
		'ProdName'=>'期刊名称',
		'IssueTime'=>'刊期',
		'DeptID'=>'部门名称',
		'CorpName'=>'客户名称',
		'Pusn'=>'客户助理',
		'Designer'=>'设计师',
		'P'=>'p数',
		'Color'=>'颜色',
		'EditionName'=>'版位',
		'WorkType'=>'类型',
		'WorkStatus'=>'稿件状态',
		'Urgency'=>'紧急程度'
		);	
		
		//截取与字段数目等值的一段列标数组
		for ($i = 0; $i < count($GetKeys); $i++)
		{
			$columnmark[$i] = $_totalmark[$i];
		}
		//组装成 列标=>字段名 的数据结构。
		$fieldmap    = array_combine($columnmark,$GetKeys);
		$objExcel    = new PHPExcel();
		$objActSheet = $objExcel -> getActiveSheet(0); 
		//error_reporting(E_ALL);
		//使用cache_towincache方式,单元格对象会保存在Wincache中,只在内存中保存索引
        $cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_wincache;  
        $cacheSettings = array( 'cacheTime'        => 600  
                      );  
       PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
         
		//第一行插入title,设置居中
		for ($i = 1;$i <= count($ary);$i ++)
			{
				foreach ($fieldmap as $key=>$value)
				{
					$objActSheet -> setCellValue($key.'1', transformUtf8($_totaltitle[$value]));//列值
			        //$objActSheet -> getColumnDimension($key) -> setWidth();//宽度
			        $objActSheet -> getStyle($key.'1')       -> getAlignment() -> setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
					$objActSheet -> setCellValue($key.($i+1), transformUtf8($ary[$i-1] -> $value));
					$objActSheet -> getStyle($key.($i+1))    -> getAlignment() -> setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);  
				}
			}
		if(self::ex == '2007') 
		{ //导出excel2007文档  
   			header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');  
    		header('Content-Disposition: attachment;filename="'.date('Ymdhis').'.xlsx"');  
    		header('Cache-Control: max-age=0');  
    		$objWriter =  PHPExcel_IOFactory::createWriter($objExcel, 'Excel2007');  
    		$objWriter -> save('php://output');  
    		exit;
    
		} else 
		{  //导出excel2003文档  
    		header('Content-Type: application/vnd.ms-excel;charset=UTF-8');  
    		header('Content-Disposition: attachment;filename="'.date('Ymdhis').'_Excel.xls"');  
    		header('Cache-Control: max-age=0');  
    		$objWriter =  PHPExcel_IOFactory::createWriter($objExcel, 'Excel5');  
    		$objWriter -> save('php://output');  
    		exit;
		} 
	}
HTML:
<div class="tab_cells">可选择的导出列;</div><div>
  <table width="100%" border="0" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
    <tr>
 
      <td width="15%" bgcolor="#FFFFFF"><input name="WorkID" type="checkbox" id="WorkID" value="1" checked="checked"  />
稿件ID</td>
      <td width="17%" bgcolor="#FFFFFF"><input name="DesignTime" type="checkbox" id="DesignTime" value="1" checked="checked" />
制作日期</td>
      <td width="16%" bgcolor="#FFFFFF"><input name="ProdName" type="checkbox" id="ProdName" value="1" checked="checked" />
期刊名称</td>
      <td width="10%" bgcolor="#FFFFFF"><input name="IssueTime" type="checkbox" id="IssueTime" value="1" checked="checked" />
刊期</td>
      <td width="10%" bgcolor="#FFFFFF"><input name="DeptID" type="checkbox" id="DeptID" value="1" checked="checked" />
 
部门</td>
      <td width="14%" bgcolor="#FFFFFF"><input name="CorpName" type="checkbox" id="CorpName" value="1" checked="checked" />
客户 </td>
      <td width="18%" bgcolor="#FFFFFF"><input name="Pusn" type="checkbox" id="Pusn" value="1" checked="checked" />
客户助理</td>
      </tr>
    <tr>
      <td bgcolor="#FFFFFF"><input name="Designer" type="checkbox" id="Designer" value="1" checked="checked" />
设计师 </td>
 
      <td bgcolor="#FFFFFF"><input name="P" type="checkbox" id="P" value="1" checked="checked" />
P数</td>
      <td bgcolor="#FFFFFF"><input name="Color" type="checkbox" id="Color" value="1" checked="checked" />
色彩 </td>
      <td bgcolor="#FFFFFF"><input name="EditionName" type="checkbox" id="EditionName" value="1" checked="checked" />
版位</td>
      <td bgcolor="#FFFFFF"><input name="WorkType" type="checkbox" id="WorkType" value="1" checked="checked" />
类型</td>
      <td bgcolor="#FFFFFF"><input name="Urgency" type="checkbox" id="Urgency" value="1" checked="checked" />
 
紧急程度</td>
      <td bgcolor="#FFFFFF"><input name="WorkStatus" type="checkbox" id="WorkStatus" value="1" checked="checked" />
状态</td>
      </tr>
    
  </table>
</div>


你可能感兴趣的:(PHPExcel)