composer 包地址: https://packagist.org/packages/yuxiaobo/simple-excel github 源代码: https://github.com/edk24/simple-excel
开发这个库的初衷是为了快速完成导入导出的功能开发, 一个人做项目的时候 时间就是金钱 哈哈
你有什么好的想法也欢迎提出, 我会继续打磨完善的.
🌈 简单使用, 方便快捷。 支持 xls
xlsx
csv
🌸
依赖:PhpSpreadsheet
要求 php >= 7.3
$arr = SimpleExcel::import(dirname(__DIR__) . '/test/test.xlsx', 'xlsx', array(
'姓名' => 'name',
'年龄' => 'age',
'性别' => 'gender'
));
var_dump($arr);
// 导出到文件
SimpleExcel::export('/tmp/dump.xlsx', 'xlsx', [
'name' => '姓名',
'idcard' => '身份证',
'mobile' => '手机号'
], [
['name' => '张三', 'idcard' => '`522131199703213342', 'mobile'=>'18311548011'],
['name' => '李四', 'idcard' => '`522131199703213342', 'mobile' => '18311548011'],
['name' => '赵五', 'idcard' => '`522131199703213342', 'mobile' => '18311548011'],
],'#ff0000', '#00ff00', '#333333');
// 直接下载导出数据
SimpleExcel::setDownloadHeader('导出数据.xlsx'); // 设置下载文件响应头
SimpleExcel::export('php://output', 'xlsx', [
'name' => '姓名',
'idcard' => '身份证',
'mobile' => '手机号'
], [
['name' => '张三', 'idcard' => '`522131199703213342', 'mobile'=>'18311548011'],
['name' => '李四', 'idcard' => '`522131199703213342', 'mobile' => '18311548011'],
['name' => '赵五', 'idcard' => '`522131199703213342', 'mobile' => '18311548011'],
],'#ff0000', '#00ff00', '#333333');
⭐️ 解决办法只有两个 ⭐️
Allowed memory size of 8388608 bytes exhausted (tried to allocate 1298358 bytes)
上述问题是由于内存不足导致的,可能是有死循环,或者代码对内存的使用量比较大。
临时解决办法:ini_set('memory_limit', '256M');
数据量太大的话,建议导出、导入做成异步任务
🌸 优化建议 🌸
临时解决:ini_set('max_execution_time', 600);
也需要注意一下 nginx 的最大保持 http 请求时间
数据量太大的话,建议导出、导入做成异步任务
🌸 优化建议 🌸
ini_set('max_execution_time', 600);
导出时在前面加个单元号或者反单元号,如身份证:522131199703253412
改成 '522131199703253412
🌸 建议 🌸
使用 csv 替代 xlsx ,
xls 最大行 65536 ,xlsx 最大行 1048576 (一百万)
, csv 没有限制
fputcsv
和 fgetcsv
UltraEdit
即可,很🐂🍺的遇到空行数据默认是跳过的
可以通过 simpleExcel::import() 函数的参数 4 ignoreEmptyRow
设置
1
bugsnail 206 天前 4
大数据建议支持 xlswriter 扩展
|
2
langziyang 206 天前
@bugsnail 正想回复,登录过程慢了一点被你抢先了
|
4
QlanQ 206 天前
xlswriter 不解释
|
5
ShineyWang 206 天前
|
6
edk24 OP |
7
edk24 OP @ShineyWang
我这个库依赖的 PhpSpreadsheet ,test100000row_and_100column 内存和耗时消耗都巨大,为此我优化了 csv 部分 足够跑通导出导入,但需要提前组装数据或一次性返回数据。 对内存的占用略高一点( 1.6GB)。 速度还行 This test printed output: CSV => 100000 行 100 列导出: 耗时:0.980793 sec This test printed output: CSV => 100000 行 100 列导入: 耗时:3.367294 sec 哈哈等我回过头编写 README 准备推荐 `xlswriter` 和 `swiftexcel` 的时候才发现 `swiftexcel` 是 C# 的库。 |
8
Xinu 206 天前
xlswriter 简直无敌,读取速度快就罢了 ,内存占用低到离谱,真的夸张,
100 多万的电话号 + 各种参数,一点压力没有,用 PhpSpreadsheet 内存 4g 都不够,读取还贼慢 |
9
maigebaoer 206 天前 via Android
等看百万级测试结果
|
10
manhere 206 天前
多工作表呢?
|
11
edk24 OP @manhere 这个库考虑的是单表数据的导入与导出, 这个场景最多。宗旨是简单使用,快速实现导入导出数据的功能。
如果涉及多工作表就会变得复杂起来,这样更推荐 PhpSpreadsheet 高度 diy 谢谢你的反馈,回头我把涉及多工作表无法实现的内容写到 README 中 |
12
edk24 OP @maigebaoer 多谢大佬的关注,上面有测试 10w 行 100 列的测试结果。 已经是优化后 csv 的结果了。
这个库的初衷是为了能快速的实现导入导出功能, 易用性是我主要关注的内容,十万左右数据量足够覆盖大多数场景了。 字段少一点的话 100w 估计也挺快的, 问题就是内存占用会比较大。 csv 是靠 fgetcsv 实现的,这个是 php 原生提供的,优化的空间我能想到的就是使用回调来读取每一行处理。这样可以减少内存的使用。 对性能速度内存有特殊要求的话,我更推荐上面朋友们推荐的 xlswriter , 使用也比较简单 速度快 内存占用低。 只是需要安装扩展来实现。 |
14
edk24 OP @Xinu 确实,我在做 100000row and 100column 时,4G 内存都不够 `PhpSpreadsheet` 吃。 csv 我还是依靠 fputcsv 实现可用的, 但也会占到 1.6GB 左右(全部读取存变量, 可能回调处理每一行效果更优)。
我这个库还是关注易用性方面吧 😭,无需安装三方扩展 composer 一句话安装, 一行代码搞定导出 也算是个小优点。 |
16
coderzhangsan 206 天前
项目中也用了不少 excel 扩展包,性能都不怎么好;很多数据导出,并不需要复杂的模板结构,csv 就够用了,简单封装下即可,实在不行直接上 xlswriter 。
|
18
moxixi 38 天前
xlswriter 还是不行,如果要一直写入会卡死。可以先写到 csv 文件,再批量写入到 excel 中 https://github.com/aVadim483/fast-excel-reader
|