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