PHPExcel内存溢出解决方案
一、当PHPEXCEL导出大数据时,PHP内存溢出时,可使用Table把数据分页追加到Excel文件
1、代码
';
if($i == 1){ //第一次分页才需要设置标题,其他分页只需设置table-body即可
$tableHtml .= '';
foreach ($title as $value) {
$tableHtml .= "{$value} ";
}
$tableHtml .= ' ';
}
//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 .= '';
foreach ($title as $field => $name){ //一行中的一列数据
$bodyHtml .= "{$value[$field]} ";
//$bodyHtml .= "{$value[$field]} ";
}
$bodyHtml .= ' ';
}
return $bodyHtml . '';
}
/**
* 设置表格第一列数据
* @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 .= "{$value[$field]} ";
打开这一行
$bodyHtml .= "{$value[$field]} ";
结果为:
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/dd
3) 数字:vnd.ms-excel.numberformat:#,##0.00
4) 货币:vnd.ms-excel.numberformat:¥#,##0.00
5) 百分比:vnd.ms-excel.numberformat: #0.00%
这些格式你也可以自定义,比如年月你可以定义为:yy-mm等等。
3、那么知道了这些格式,怎么去把这些格式添加到cell中呢?
很简单,我们只需要把样式添加到对应的标签对(即闭合标签)即可。
如
410522198402161833
同样,我们也可以给
添加样式,也可以给4、转文本使用案例如下:
1)、直接在浏览器弹出框下载
echo "{$orderSn} ";
2)、拼接字符串,直接下载到项目中
$table = "{$orderSn} ";