PHP 操作 Excel ,你的瓶颈不再是PHP!

1,867 阅读2分钟

xlswriter是一个 PHP C 扩展,可用于在 Excel 2007+ XLSX 文件中读取数据、插入多个工作表,写入文本、数字、公式、日期、图表、图片和超链接。

项目地址:github.com/viest/php-e…

特性

一、写入

  • 100%兼容的Excel XLSX文件
  • 完整的Excel格式
  • 合并单元格
  • 定义工作表名称
  • 过滤器
  • 图表
  • 插入PNG/JPEG图像
  • 用于写入大文件的内存优化模式
  • 适用于Linux,FreeBSD,OpenBSD,OS X,Windows
  • 编译为32位和64位
  • FreeBSD许可证
  • 唯一的依赖是zlib

二、读取

  • 完整读取数据
  • 光标读取数据
  • 按数据类型读取

三、工具

  • XLSX 转 CSV

基准测试

测试环境

  • Macbook Pro 13 inch
  • CPU:Intel Core i5
  • Memory:16GB 2133MHz LPDDR3

测试数据

ABCDEFGHIJKLMNOPQRSTUVWXYZ

导出

两种内存模式导出50万行数据(每行20列)

  • 普通模式:耗时 16S,内存 991.8 MB;
  • 固定内存模式:耗时 24S,内存 <1 MB;

读取

50万行数据(单行20列)

  • 游标模式:耗时 23S,内存仅 <1 MB;
  • 回调模式:耗时 24S,内存仅 <1 MB;

安装

Unix

pecl install xlswriter

Windows

GitHub Release 下载 dll

快速上手

普通模式导出

$config = [
  'path' => '/home/viest/xlswriter'
];

$excel = new \Vtiful\Kernel\Excel($config);

$excel->fileName('tutorial.xlsx', 'sheet1')
    ->header(['Item', 'Cost'])
    ->data([
        ['Rent', 1000],
        ['Gas',  100],
        ['Food', 300],
        ['Gym',  50],
    ])
    ->output();

固定内存模式导出

$config = [
  'path' => '/home/viest/xlswriter'
];

$excel = new \Vtiful\Kernel\Excel($config);

$excel->constMemory('tutorial.xlsx', 'sheet1')
    ->header(['Item', 'Cost'])
    ->data([
        ['Rent', 1000],
        ['Gas',  100],
        ['Food', 300],
        ['Gym',  50],
    ])
    ->output();

游标模式读取

$config = [
  'path' => '/home/viest/xlswriter'
];

$excel = new \Vtiful\Kernel\Excel($config);

$sheet = $excel->openFile('tutorial.xlsx')
    ->openSheet();

while ($row = $sheet->nextRow()) {
    var_dump($row);
}

回调模式读取

$config = [
  'path' => '/home/viest/xlswriter'
];

$excel = new \Vtiful\Kernel\Excel($config);

$excel
    ->openFile('tutorial.xlsx')
    ->nextCellCallback(function ($row, $cell, $data) {
  	    //
    });

性能对比

xlswriter

行数(万) 常规模式内存(MB) 常规模式耗时(S) 固定内存模式内存(MB) 固定内存模式耗时(S)
0.1 12.57 0.056 <1 0.0896
0.3 16.42 0.104 <1 0.1664
0.5 18.82 0.175 <1 0.28
1 29.35 0.36 <1 0.576
5 127.87 1.806 <1 2.8896
10 251.91 3.576 <1 5.7216
15 376.98 5.316 <1 8.5056
20 499.94 7.012 <1 11.2192

PHPSpreadSheet

行数(万) 内存(MB) 耗时(S)
0.1 11.31 0.632
0.3 28.51 1.271
0.5 48.47 2.219
1 95.58 4.443
5 457.94 24.003
10 914.52 52.824
15 1437.11 104.306
20 1827.69 130.093

PHP_XLSXWriter

行数(万) 内存(MB) 耗时(S)
0.1 5.55 0.213
0.3 5.55 0.627
0.5 5.47 1.035
1 5.27 2.066
5 5.51 10.373
10 5.37 20.557
15 5.42 31.328
20 5.35 41.505