记录一笔关于PHPEXCEL导出大数据超时和内存溢出的问题
通过查阅资料可以找到PHPEXCEL本身已经有通过缓存来处理大数据的导出了。但是昨晚一直没有成功,这可捉急了。最后想来想去就替换了phpExcel的版本了。最后就成功了。话不多说,代码附上
<?php
set_time_limit(0);
header("Content-Type:text/html;charset=utf-8");
define('EOL', '<br />');
define('CURSCRIPT', 'shell');
define('WEB',dirname(__FILE__).DIRECTORY_SEPARATOR);
define ( 'ROOT_PATH', dirname (WEB) . DIRECTORY_SEPARATOR . 'application' . DIRECTORY_SEPARATOR );
define ( 'FRAMEWORK_PATH', substr ( ROOT_PATH, 0, - 12 ) . 'jcphp' . DIRECTORY_SEPARATOR );
define ( 'WXSERVER_PATH', dirname (WEB) . DIRECTORY_SEPARATOR . 'wwwroot' . DIRECTORY_SEPARATOR.'wxserver'.DIRECTORY_SEPARATOR);
require FRAMEWORK_PATH . './class/class_core.php';
class_core::instance (false);
$rootexcel ='Classes/PHPExcel.php';
require_once($rootexcel);
$column_number = 14;
$objPHPExcel = new PHPExcel();// 创建一个处理对象实例
$objActSheet = $objPHPExcel->getActiveSheet();
ini_set("memory_limit", "1024M"); // 设置php可使用内存
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;
if (!PHPExcel_Settings::setCacheStorageMethod($cacheMethod)) {
die($cacheMethod . " 缓存方法不可用" . EOL);
}
echo date('H:i:s'), " 当前使用的缓存方法是: ", $cacheMethod, " 方式", EOL;
echo date('H:i:s'), " 开始设置文档属性", EOL;
$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"); echo date('H:i:s'), " 开始添加单元格标题", EOL;
$objPHPExcel->setActiveSheetIndex(0);
$title = '学员数据';
//设置表格标题
$objActSheet->setCellValue('A1', $title);
//设置字体大小
$objActSheet->getStyle('A1')->getFont()->setName('宋体');
$objActSheet->getStyle('A1')->getFont()->setSize(40);
$objActSheet->getStyle('A1')->getFont()->setBold(true);
//合并标题单元格
$objActSheet->getStyle('B2')->getAlignment()->applyFromArray(
array(
'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
'vertical' => PHPExcel_Style_Alignment::VERTICAL_CENTER,
'rotation' => 0,
'wrap' => true
) );
$styleArray1 = array(
'font' => array(
'bold' => true,
'size'=>12,
'color'=>array(
'argb' => '00000000',
),
),
'alignment' => array(
'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
),
);
$styleArray2 = array(
'font' => array(
'bold' => true,
'size'=>12,
'color'=>array(
'argb' => '00000000',
),
),
'alignment' => array(
'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
),
);
$arr=array('A','B','C','D','E','F','G','H','I','J','K','L','M','N');
// 将A1单元格设置为加粗,居中
$objPHPExcel->getActiveSheet()->getStyle('A1')->applyFromArray($styleArray1);
$objActSheet->mergeCells( 'A1:'.chr(ord('A')+$column_number-1).'1');//合并标题
$objActSheet->setCellValue('A2', '编号');
$objActSheet->setCellValue('B2', '学员姓名');
$objActSheet->setCellValue('C2', '性别');
$objActSheet->setCellValue('D2', '身份证号');
$objActSheet->setCellValue('E2', '手机号');
$objActSheet->setCellValue('F2', '学员状态');
$objActSheet->setCellValue('G2', '教练');
$objActSheet->setCellValue('H2', '训练车辆');
$objActSheet->setCellValue('I2', '联系地址');
$objActSheet->setCellValue('J2', '报名日期');
$objActSheet->setCellValue('K2', '招生人');
$objActSheet->setCellValue('L2', '过科一日期');
$objActSheet->setCellValue('M2', '过科二日期');
$objActSheet->setCellValue('N2', '过科三日期');
foreach ($arr as $v) {
$objPHPExcel->getActiveSheet()->getStyle($v.'2')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);// 居中
$objPHPExcel->getActiveSheet()->getStyle($v.'2')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
$objPHPExcel->getActiveSheet()->getColumnDimension($v)->setWidth(50);// 单元格宽度
$objPHPExcel->getActiveSheet()->getStyle($v.'2')->applyFromArray($styleArray2);
}
$styleArray = array(
'borders' => array(
'allborders' => array(
//'style' => PHPExcel_Style_Border::BORDER_THICK,//边框是粗的
'style' => PHPExcel_Style_Border::BORDER_THIN,//细边框
//'color' => array('argb' => 'FFFF0000'),
),
),
);
$i=3;
$xueyuanModel = model('kehu');
$where = " mdid=28 ";
$data = $xueyuanModel->get(array('*'),$where,0,10000);
if($data['count']){
$scoreModel = model('score');
foreach ($data['data'] as $k => $rk) {
$sex = $rk['UserSex']==1?'男':'女';
$objPHPExcel->getActiveSheet()->setCellValue('A' . $i, $rk['Id']);
$objPHPExcel->getActiveSheet()->setCellValue('B' . $i, $rk['UserName']);
$objPHPExcel->getActiveSheet()->setCellValue('C' . $i, $sex);
$objPHPExcel->getActiveSheet()->setCellValue('D' . $i, "`".$rk['sfz']);
$objPHPExcel->getActiveSheet()->setCellValue('E' . $i, $rk['UserMobile']);
$objPHPExcel->getActiveSheet()->setCellValue('F' . $i, xyztdesc($rk['xyzt']));
$objPHPExcel->getActiveSheet()->setCellValue('G' . $i, showtype2('jc_user','TrueName','Id',$rk['jlid']));
$objPHPExcel->getActiveSheet()->setCellValue('H' . $i, showtype2('jc_car','chepai','id',$rk['carID']));
$objPHPExcel->getActiveSheet()->setCellValue('I' . $i, $rk['UserAddr']);
$objPHPExcel->getActiveSheet()->setCellValue('J' . $i, date('Y-md',strtotime($rk['bmtime'])));
$objPHPExcel->getActiveSheet()->setCellValue('K' . $i, showtype2('jc_user','TrueName','Id',$rk['addid']));
//科目一,科目二,科目三通过时间
$suba = array('L'=>1,'M'=>2,'N'=>3);
foreach($suba as $sk=>$sv){
$scorerow = $scoreModel->get(array('testtime')," uId='".$rk['Id']."' AND score=1 AND subtype=".$sv."");
$objPHPExcel->getActiveSheet()->setCellValue($sk . $i, $scorerow['testtime']);
}
foreach ($arr as $va) {
$objPHPExcel->getActiveSheet()->getStyle($va.$i)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle($va.$i)->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
}
$objPHPExcel->getActiveSheet()->getRowDimension($i)->setRowHeight(20);
$i++;
}
}
$j=$i-1;
$objPHPExcel->getActiveSheet()->getStyle('A1:H'.$j)->applyFromArray($styleArray);
####################################################################################################### $objPHPExcel->getActiveSheet()->setTitle('客户信息');
echo date('H:i:s'), " 设置格式为Excel2007版格式", EOL;
$callStartTime = microtime(true); $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save(str_replace('.php', '.xlsx', __FILE__));
$callEndTime = microtime(true);
$callTime = $callEndTime - $callStartTime;
echo date('H:i:s'), " 设置生成的文件为: ", str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)), EOL;
echo date('H:i:s'), ' 写入Workbook中耗时 ', sprintf('%.4f', $callTime), " 秒", EOL;
echo date('H:i:s'), ' 当前内存使用情况: ', (memory_get_usage(true) / 1024 / 1024), " MB", EOL;
echo date('H:i:s'), " 内存使用峰值: ", (memory_get_peak_usage(true) / 1024 / 1024), " MB", EOL;
echo date('H:i:s'), " 完成写入文件", EOL;
echo date('H:i:s'), ' 文件被创建在: ', getcwd(), '目录', EOL;
记录一笔关于PHPEXCEL导出大数据超时和内存溢出的问题的更多相关文章
- php导出为excel文件避免内存溢出
轻松解决PHPExcel导出10W行超时和内存溢出问题 使用了一个轻量级的PHP的Excel操作库-PHP_XLSXWriter 10w行excel数据导出仅需要5.26秒,再也不用担心excel ...
- C#通过OLEDB导出大数据到Excel
C#导出数据到Excel,基本有两种方法,一种方法是通过Microsoft.Office.Interop.Excel.Application,一行一列的写入Excel中:另一种方法是通过OLEDB,利 ...
- Struts2 利用AJAX 导出大数据设置遮罩层
Struts2 利用AJAX 导出大数据设置遮罩层 需求背景: 每次我们导出excel的时候 ,如果数据量很大,导出花费的时间会很长,页面却有没人任何反应,这个时候用户会认为系统有问题,要么关了页面, ...
- zw·10倍速大数据与全内存计算
zw·10倍速大数据与全内存计算 zw全内存10倍速计算blog,早就在博客园机器视觉栏目发过,大数据版的一直挂着,今天抽空补上. 在<零起点,python大数据与量化交易>目录中 htt ...
- POI3.8解决导出大数据量excel文件时内存溢出的问题
POI3.8的SXSSF包是XSSF的一个扩展版本,支持流处理,在生成大数据量的电子表格且堆空间有限时使用.SXSSF通过限制内存中可访问的记录行数来实现其低内存利用,当达到限定值时,新一行数据的加入 ...
- phpmyadmin导入导出大数据文件的办法
在phpmyadmin的使用中,经常需要进行导入导出数据库的操作. 但是在导入导出大型数据库文件的时候经常会只是部分导出或者部分导入. 或者是导入导出不成功. 原因就是服务器和php.mysql限制了 ...
- Winform .NET 利用NPOI导出大数据量的Excel
前言:公司让做一个导出数据到Excel的小工具,要求是用户前端输入sql语句,点击导出按钮之后,将数据导出到Excel,界面如图所示:文件下端显示导出的进度 遇到的问题: 1.使用NPOI进行Exce ...
- oracle导出大数据
Sqluldr是什么:是一个oracle数据导出小工具. Sqluldr作用介绍:Sqluldr可以快速导出oracle数据库中的数据.该小工具可以将数据库中的数据,导出多种不同的格式(如.txt.. ...
- php导出大数据scv
1.我系统要导出30w的数据,刚开始我使用的是: ini_set('memory_limit', '1024M');set_time_limit(0); header("Content-ty ...
随机推荐
- Entity Framework——建模建库
1数据库初始化策略选择 三种初始化策略: 1)CreateDatabaseIfNotExists:默认的策略.如果数据库不存在,那么就创建数据库.但是如果数据库已存在,而且实体发生了变化,就会出现异常 ...
- layer,Jquery,validate实现表单验证,刷新页面,关闭子页面
1.表单验证 //获取父层 var index = parent.layer.getFrameIndex(window.name); //刷新父层 parent.location.reload(); ...
- 应用教程之帕克西AR虚拟试妆3D动态美妆
帕克西技术团队通过对美妆行业深度调研,凭借自主研发的人脸识别与面部追踪等技术,打造的超现实AR虚拟试妆应用已成功上线,内置万千妆容,包含口红.眉毛.睫毛等,一点即可试妆,就像照镜子一样简单. 那么,帕 ...
- 38.Linux驱动调试-根据系统时钟定位出错位置
当内核或驱动出现僵死bug,导致系统无法正常运行,怎么找到是哪个函数的位置导致的? 答,通过内核的系统时钟,因为它是由定时器中断产生的,每隔一定时间便会触发一次,所以当CPU一直在某个进程中时,我们便 ...
- 【转】Python微信好友头像拼接图
转自:Python微信好友头像拼接图 今天在朋友圈看到有人发了微信好友拼接图,心里满是新奇,看了下评论才知道用Python写的.心里痒痒,立马就安装了下Python. 安装好了之后,看了下大神的代码, ...
- (四):C++分布式实时应用框架——状态中心模块
C++分布式实时应用框架--状态中心模块 上篇:(三):C++分布式实时应用框架--系统管理模块 技术交流合作QQ群:436466587 欢迎讨论交流 版权声明:本文版权及所用技术归属smartguy ...
- Spring Cloud Zuul
新建Spring Boot工程,命名为zuul 1.pom.xml添加依赖 <?xml version="1.0" encoding="UTF-8"?&g ...
- B. Simple Game( Codeforces Round #316 (Div. 2) 简单题)
B. Simple Game time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- 怎样提升 RailS 应用的性能?
Is rails slow? 「铁路非常慢」,你或许听过这个笑话,那么我们的 Rails 框架呢? 假设说 Rails 慢,那么怎样提升 Rails APP 的性能就成了开发人员们最关注的问题. 或许 ...
- 微信小程序豆瓣电影项目的改造过程经验分享
在学习微信小程序开发过程中,一部分的难点是前端逻辑的处理,也就是对前端JS的代码编辑:一部分的难点是前端界面的设计展示:本篇随笔基于一个豆瓣电影接口的小程序开源项目进行重新调整,把其中遇到的相关难点和 ...