/** * 下载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>