PHP 高性能 Excel 扩展,五百年配方无内存泄漏

file

1、创建一个简单的Excel文件:

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

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

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

2、插入图片

insertImage(int $row, int $column, string $localImagePath)

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

$freeFile = $excel->fileName("free.xlsx");

$freeFile->insertImage(5, 0, '/vagrant/ASW-G-66.jpg');

$freeFile->output();

3、定义一个公式

insertFormula(int $row, int $column, string $formula)

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

$freeFile = $excel->fileName("free.xlsx")
    ->header(['name', 'money']);

for($index = 0; $index < 10; $index++) {
    $textFile->insertText($index+1, 0, 'vikin');
    $textFile->insertText($index+1, 1, 10);
}

$textFile->insertText(12, 0, "Total");
$textFile->insertFormula(12, 1, '=SUM(B2:B11)');

$freeFile->output();

4、性能如何?

测试脚本

for($index = 0 ; $index < 10000 ; $index++){
    $data[$index] = ['viest', 23, 666666666666666666, '银河市地球区程序村PHP组菜鸟湾66号', 15666666666];
}

$timeStart = microtime(true);

$config = [
    'path' => '/vagrant/',
];

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

$textFile = $excel->fileName("test.xlsx")
    ->header(['name', 'age', 'id_card', 'address', 'phone'])
    ->data($data)
    ->outPut();

$timeEnd = microtime(true);
$time = $timeEnd - $timeStart;

echo "导出Excel花费: $time seconds\n";

结果
file

5、最后附上Github地址

https://github.com/viest/php-excel-writer

bowtie:

本帖已被设为精华帖!
本帖由 Summer 于 6年前 加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 29

66666666666666666

6年前 评论
咖啡是個軟件猴

棒棒棒

6年前 评论

若若的问一下 brew 可以直接安装么?

6年前 评论

@736713830 目前还不行哦!

6年前 评论

有类似的 PHP_EXCEL_READER 么。。。。

6年前 评论

赞分享,一直用的 laravel-excel ,这个还需要安装扩展呢

6年前 评论
wenber

默默问句,能加到brew中吗?

6年前 评论

https://github.com/mk-j/PHP_XLSXWriter 有没有人对比一下这货,也是一个省内存的excel导出方案

6年前 评论

@hujghc 这个可以的,测试了下 25 万行,耗 9.4 秒,文件大小 5.76 MB

6年前 评论

@mingyun 我去那测试数据试一下,还是你的数据更好。

➜  PHP_XLSXWriter git:(master) ✗ php example-cli.php 
导出Excel花费: 21.182307004929 seconds
#98MB
➜  PHP_XLSXWriter git:(master) ✗ ll -h example.xlsx  
-rw-r--r--  1 hujg  staff   4.1M 12 31 12:48 example.xlsx
➜  PHP_XLSXWriter git:(master) ✗ 

测试代码如下

<?php
include_once("xlsxwriter.class.php");
ini_set('display_errors', 0);
ini_set('log_errors', 1);
error_reporting(E_ALL & ~E_NOTICE);

$filename = "example.xlsx";

for($index = 0 ; $index < 250000 ; $index++){
    $data[$index] = ['viest', 23, 666666666666666666, '银河市地球区程序村PHP组菜鸟湾66号', 15666666666];
}

$timeStart = microtime(true);

$writer = new XLSXWriter();
$writer->writeSheet($data);
$writer->writeToFile('example.xlsx');

$timeEnd = microtime(true);
$time = $timeEnd - $timeStart;

echo "导出Excel花费: $time seconds\n";
echo '#'.floor((memory_get_peak_usage())/1024/1024)."MB"."\n";
6年前 评论
hanzhao

谢谢分享,请问是不是要求 PHP Version >= 7.0?

我在Mac 上通过 brew 同时安装了5.6.32和7.2两个版本的PHP,7.2编译正常,使用正常。5.6执行make命令时报错:

./php_excel_writer.h:41:30: error: unknown type name 'zend_resource'
void _php_vtiful_excel_close(zend_resource *rsrc TSRMLS_DC);
                             ^
1 error generated.
make: *** [excel_writer.lo] Error 1
6年前 评论

总的来说~~ PHP 装这些太麻烦,又是编译又是安装系统依赖。
要是能像node 一样,让 composer install XXX 就完美了。
npm install 确实方便。

6年前 评论

@mingyun 我测了5.3秒, 碉堡了

6年前 评论

@hujghc 感谢分享,25万数据5.3秒

6年前 评论

new \Vtiful\Kernel\Excel 你好,想问一下这个类是哪里来的?

6年前 评论

@杨智鹏 扩展内创建的类

6年前 评论

你好,我想问下在导出图片单时候,图片没有将单元格撑开,是要设置单元格大小嘛?还是因为图片太大?如果要设置单元格大小,可否给个demo。

6年前 评论

@seven_lvxiujun 可否加一个QQ然后截图我看下,企鹅:986465329

6年前 评论

Class 'Vtiful\Kernel\Excel' not found
服务器上一直搞不定,能指点一下吗?
本地没问题。
------
已解决,加载 扩展,php-config 版本的问题。

6年前 评论

@andu 如果在使用,请下载最新版本哦,最近有更新

6年前 评论

@vikin 三步安装变成一步了啊,腻還。自从用了你的导出,腿也不酸了,腰也不疼了……
新版找机会试试,之前的就先不升级了……

6年前 评论

@依剑听雨 我也是这么认为,不过"maatwebsite/excel" 太耗内存了

5年前 评论

晃了一圈,还是你最好。让我回来,不再离开……

4年前 评论

file

file 是哪里不对吗

4年前 评论
viest (楼主) 4年前
xuri

推荐一个功能丰富、兼容性好、高性能的 Excel 文档基础库:github.com/xuri/excelize

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!