PHPExcel内存溢出解决方案

一、当PHPEXCEL导出大数据时,PHP内存溢出时,可使用Table把数据分页追加到Excel文件

存在的问题:这种方法最多只能写入 65536 条数据,解决方案 请移步 >>> ThinkPhp 使用 PHP_XLSXWriter 代替 PHPExcel 百万级数据单次导出

1、代码

<?phpnamespace app\index\controller;class Ablog extends Base
{/*** 入口方法* 当PHPEXCEL导出大数据时,PHP内存溢出时,可使用该方法把数据分页追加到Excel文件*/public function run(){$title = self::getTitle();  //获取字段与标题的对应关系$data = self::randData();   //生成所有数据$count = count($data);      //总记录数$filePath = self::copyTableToExcel($title, $data, $count);echo '文件保存路径为:[ ' . $filePath . ' ]';exit();}/*** 分页把table追加存入excel中* @param $title 字段与标题的对应关系* @param $data  所有数据* @param $count 数据的总量* @param int $limit 分页数量* @return string 结果路径*/public function copyTableToExcel($title, $data, $count, $limit = 10){$path = 'download';         //设置文件保存的路径if(!file_exists($path)){    //如果目录不存在,则创建mkdir($path, 0777, true);}$fileName = '数据分页导出:' . time() . '_' . mt_rand(1000, 9999) . '.xlsx';   //文件名$filePath = $path . '/' . $fileName;    //文件保存目录$number = ceil($count / $limit);for($i = 1; $i <= $number; $i++) {  //处理分页数据$tableHtml = '<table border="1" cellspacing="0">';if($i == 1){    //第一次分页才需要设置标题,其他分页只需设置table-body即可$tableHtml .= '<tr>';foreach ($title as $value) {$tableHtml .= "<th>{$value}</th>";}$tableHtml .= '</tr>';}//array_slice函数模拟分页数据$start = $limit * ($i-1);$pageSize = $limit;$pageData = array_slice($data, $start, $pageSize);$tableHtml .= self::getTableBody($pageData, $title);file_put_contents($filePath, $tableHtml, FILE_APPEND);}//unlink(str_replace('\\','/', $filePath));   //删除本地文件return $filePath;}/*** 处理表格Body数据* @param $data 当前页的数据* @param $title 字段与标题的对应关系* @return string html字符串*/public function getTableBody($data, $title){$bodyHtml = '';    // 拼接表格body数据foreach ($data as $value){   //一行数据$bodyHtml .= '<tr>';foreach ($title as $field => $name){ //一行中的一列数据$bodyHtml .= "<td>{$value[$field]}</td>";//$bodyHtml .= "<td style='vnd.ms-excel.numberformat:@'>{$value[$field]}</td>";}$bodyHtml .= '</tr>';}return $bodyHtml . '</table>';}/*** 设置表格第一列数据* @return array*/public function getTitle(){$title = ['id' => 'ID','order_sn' => '订单号','amount' => '订单金额','payed_name' => '下单人','create_time' => '创建时间'];return $title;}/*** 生成$number条随机数据* @param int $number 数据的数量* @return array*/public function randData($number = 100){$data = [];for ($x = 0; $x < $number; $x++){//订单号随机生成$prefix = '';if ($x%2 == 0){$prefix = 'HELLO';}$orderSn = $prefix . 123456 . mt_rand(1000, 9999) . mt_rand(100, 999) . 999;//创建时间随机生成$createTime = 1572 . mt_rand(100, 999) . mt_rand(100, 999);$data[] = ['id' => ($x+1),'order_sn' => $orderSn,'amount' => mt_rand(100, 999),'payed_name' => '下单人','create_time' => date('Y-m-d H:i:s', $createTime)];}return $data;}
}

2、【情况1】执行的结果:订单号为十几位数字时,被转成了科学计数法;创建时间也不整齐。

3、【情况2】修改

注释这一行

$bodyHtml .= "<td>{$value[$field]}</td>";

打开这一行

$bodyHtml .= "<td style='vnd.ms-excel.numberformat:@'>{$value[$field]}</td>";

结果为:

4、【情况1】11KB 和【情况2】29KB 的文件大小对比,

二、php导出数据到excel,防止身份证等数字字符格式变成科学计数的方法

#以下内容来自 https://www.cnblogs.com/jcz1206/p/3837723.html
1、首先,我们了解一下excel从web页面上导出的原理。
    当我们把这些数据发送到客户端时,我们想让客户端程序(浏览器)以excel的格式读取它,所以把mime类型设为:application/vnd.ms-excel,
    当excel读取文件时会以每个cell的格式呈现数据,如果cell没有规定的格式,则excel会以默认的格式去呈现该cell的数据。
    这样就给我们提供了自定义数据格式的空间,当然我们必须使用excel支持的格式。

2、下面就列出常用的一些格式:

    1) 文本:vnd.ms-excel.numberformat:@2) 日期:vnd.ms-excel.numberformat:yyyy/mm/dd3) 数字:vnd.ms-excel.numberformat:#,##0.004) 货币:vnd.ms-excel.numberformat:¥#,##0.005) 百分比:vnd.ms-excel.numberformat: #0.00%

这些格式你也可以自定义,比如年月你可以定义为:yy-mm等等。

3、那么知道了这些格式,怎么去把这些格式添加到cell中呢?
    很简单,我们只需要把样式添加到对应的标签对(即闭合标签)即可。
    如<td></td>,给标签对<td></td>添加样式,如下:

<td style="vnd.ms-excel.numberformat:@">410522198402161833</td>

同样,我们也可以给<div></div>添加样式,也可以给<tr></tr>,<table></table>添加样式;
当我们在父标签对和子标签对都添加样式时,数据会以哪一个样式呈现呢?经过测试,会以离数据最近的样式呈现.

4、转文本使用案例如下:
1)、直接在浏览器弹出框下载

echo "<td style='vnd.ms-excel.numberformat:@'>{$orderSn}</td>";

2)、拼接字符串,直接下载到项目中

$table = "<td style='vnd.ms-excel.numberformat:@'>{$orderSn}</td>";

PHPExcel内存溢出解决方案相关推荐

  1. vue2打包时内存溢出解决方案

    vue2打包时内存溢出解决方案 参考文章: (1)vue2打包时内存溢出解决方案 (2)https://www.cnblogs.com/ZT0219/p/7872258.html 备忘一下.

  2. WEBLOGIC 内存溢出 解决方案

    WEBLOGIC 内存溢出 解决方案 相关教程:     很好听 听听吧 朱禹齐(原创)   正文     前几天部署WebLogic出现线程阻塞情况,查看后台报错:<[STUCK] Execu ...

  3. 应用jacob组件造成的内存溢出解决方案(java.lang.OutOfMemoryError: Java heap space)

    http://www.educity.cn/wenda/351088.html 使用jacob组件造成的内存溢出解决方案(java.lang.OutOfMemoryError: Java heap s ...

  4. java.lang.OutOfMemoryError: Java heap space内存溢出解决方案

    java.lang.OutOfMemoryError: Java heap space内存溢出解决方案 一.设置环境变量 JAVA_OPTS= -Xms2048m -Xmx2048m 二.在Eclil ...

  5. Laravel的excel读取表格内存溢出解决方案

    技术栈:php laravel maatwebsite/excel 问题描述 :用户上传excel表格,php程序读取表格数据,由于表格不规范出现大量空行数据(列和行都存在同样的问题),导致读取表格数 ...

  6. Handler内存溢出解决方案

    Handler引起内存溢出,解决方案 1.介绍 public class SampleActivity extends Activity {private final Handler mLeakyHa ...

  7. node内存溢出解决方案

    前后端分离项目中,当项目过大,启动开发环境内存溢出无法正常启动, 解决方案: 找到package.json文件,在"devDependencies"下面添加"increa ...

  8. Android 内存溢出解决方案(OOM) 整理总结

    在最近做的工程中发现加载的图片太多或图片过大时经常出现OOM问题,找网上资料也提供了很多方法,但自己感觉有点乱,特此,今天在不同型号的三款安卓手机上做了测试,因为有效果也有结果,今天小马就做个详细的总 ...

  9. 内存溢出_关于PermGen Space内存溢出解决方案

    内存溢出分为Heap Space和PermGen Space两种异常.正巧的是我这次就碰到了PermGen space异常,为了解决这个异常花了我 半天的时间,所以今天写这个方案就是做一种笔记. 刚开 ...

  10. Android 内存溢出解决方案(OOM)

    众所周知,每个Android应用程序在运行时都有一定的内存限制,限制大小一般为16MB或24MB(视平台而定).因此在开发应用时需要特别关注自身的内存使用量,而一般最耗内存量的资源,一般是图片.音频文 ...

最新文章

  1. html css图标怎么跟文字并排,CSS高级技巧:精灵图、字体图标、CSS三角做法、CSS用户界面样式、vertical-align属性应用、溢出文字省略号、常见布局技巧...
  2. MyBatis增删改对二级缓存的影响
  3. Taro+react开发(91):chidren和组合
  4. Mysql处理海量数据时的一些优化查询速度方法
  5. vfp程序改错 计算机和英语,vfp程序改错教案.doc
  6. [网络流24题-6]孤岛营救问题
  7. tp5分页不加载搜索参数
  8. 《Windows服务器配置与管理》------磁盘管理
  9. 转:visio 2013 激活软件 -- 记录
  10. numpy 矩阵运算
  11. Flume Agent 组件如何协同工作
  12. HDU5773(The All-purpose Zero LIS变形)
  13. 分析MP4的名人博客
  14. 沈航-数理统计-17-18B-有答案
  15. excel如何批量让图片水平居中垂直居中对齐?
  16. java 当前时间加12小时_Java设置时间的24或12小时机制
  17. 计算机视觉滤波器大小,计算机视觉——加权最小二乘(WLS)滤波器
  18. 2020华为杯E题——基于灰色预测的大雾能见度预测模型(附代码)
  19. 如何搭建一个自己的网站
  20. 用友T+财务软件数据库——SQL生成含上级科目名称的标准化凭证表

热门文章

  1. NYOJ题目252-01串(动态规划)
  2. opencv裁剪图像(不规则裁剪)
  3. linux ios文件是否存在,Linux如何读取iOS镜像文件
  4. c语言第三周编程作业答案,c语言程序设计第3周编程作业(数字特征)
  5. linux c语言播放midi,C语言实现--计算MIDI音符的频率
  6. python mro算法_Python MRO C3算法实现
  7. 绩效考核及评估活动的实施步骤及疑难问题汇编
  8. http 协议入门
  9. LLDB使用详解以及断点调试教程
  10. bat备份mysql数据库