我有大量的Excel工作表,我希望能够使用PHPExcel读入MySQL.
我正在使用最近的补丁,它允许您在不打开整个文件的情况下读取工作表.这样我就可以一次阅读一个工作表.
但是,一个Excel文件大27MB.我可以成功阅读第一个工作表,因为它很小,但第二个工作表是如此之大,以至于22:00启动进程的cron作业在上午8:00没有完成,工作表很简单.
是否有任何方法可以逐行读取工作表,例如:
$inputFileType = 'Excel2007';
$inputFileName = 'big_file.xlsx';
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$worksheetNames = $objReader->listWorksheetNames($inputFileName);
foreach ($worksheetNames as $sheetName) {
//BELOW IS "WISH CODE":
foreach($row = 1; $row <=$max_rows; $row+= 100) {
$dataset = $objReader->getWorksheetWithRows($row, $row+100);
save_dataset_to_database($dataset);
}
}
Run Code Online (Sandbox Code Playgroud)
@mark,我使用您发布的代码创建以下示例:
function readRowsFromWorksheet() {
$file_name = htmlentities($_POST['file_name']);
$file_type = htmlentities($_POST['file_type']);
echo 'Read rows from worksheet:<br />';
debug_log('----------start');
$objReader = PHPExcel_IOFactory::createReader($file_type);
$chunkSize = 20;
$chunkFilter = new ChunkReadFilter();
$objReader->setReadFilter($chunkFilter);
for ($startRow = 2; $startRow <= …Run Code Online (Sandbox Code Playgroud) 我使用PHPExcel从Excel工作表中读取数据并存储在mysql表中,直到现在我能够上传.xls以及.xlsx文件并在上传xls之后我得到了下面的数据表结构
name start_date end_date city
one 11/25/2011 3:30:00 PM 11/29/2011 4:40:00 AM Jaipur
two 10/22/2011 5:30:00 PM 10/25/2011 6:30:00 AM Kota
three 3/10/2011 2:30:00 PM 3/11/2011 12:30:00 AM Bikaner
chandigarh
Run Code Online (Sandbox Code Playgroud)
现在我有一些问题,请建议我优化的方法
现在我将这些数据存储到db中,下面是代码片段
$inputFileName = "test.xls";
$inputFileType = PHPExcel_IOFactory::identify($inputFileName);
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objReader->setReadDataOnly(true);
/** Load $inputFileName to a PHPExcel Object **/
$objPHPExcel = $objReader->load($inputFileName);
$total_sheets=$objPHPExcel->getSheetCount(); // here 4
$allSheetName=$objPHPExcel->getSheetNames(); // array ([0]=>'student',[1]=>'teacher',[2]=>'school',[3]=>'college')
$objWorksheet = $objPHPExcel->setActiveSheetIndex(0); // first sheet
$highestRow = $objWorksheet->getHighestRow(); // here 5
$highestColumn = $objWorksheet->getHighestColumn(); // …Run Code Online (Sandbox Code Playgroud)我正在使用phpexcel编写相当大的excel文件.
我是从一个看起来像的数组中写的
array(
[0] => stdClass Object
(
[sent] => Mar 31st, 2011 02:10PM
[to_number] => 64211111111
[additional_txt] =>
[misc_data] =>
)
...
[14058] => stdClass Object
(
[sent] => Mar 31st, 2011 02:10PM
[to_number] => 64211111111
[additional_txt] =>
[misc_data] =>
)
)
Run Code Online (Sandbox Code Playgroud)
循环是
$r = 0;
foreach ($replies_obj as $row) {
$c = 'A';
foreach ($row as $col)
$xlsx->getActiveSheet()->setCellValue($c++ . $r, $col);
$r++;
}
Run Code Online (Sandbox Code Playgroud)
而错误是
致命错误:第961行/home/webspace/xxxx/test/htdocs/application/libraries/PHPExcel/Worksheet.php中允许的内存大小为134217728个字节(尝试分配105个字节)
这是一个phpexcel问题还是我做错了什么?
我怎样才能解决这个问题?
我们正在开发和维护几个系统,这些系统需要以Excel格式将报告导出到最终用户.这些报告是从一个MySQL数据库中收集而来的,通过一些简单的处理,通常会产生大约40000行数据,包含10-15列,我们期望数据量稳步增长.
目前我们正在使用PHPExcel进行Excel生成,但它不再适用于我们.在我们超过5000行之后,内存消耗和加载时间变得无法容忍,无法通过无限增加PHP的内存使用和脚本执行时间的最大限制来解决.数据的处理尽可能精简,整个问题是PHPExcel是一个内存耗尽.CSV生成会更轻,但不幸的是,由于用户的需求,我们需要从我们的服务中导出Excel(和Excel).这是由于格式要求等原因,因此CSV不是一个选项.
有关第三方应用程序/模块/服务/产生大型Excel的任何想法/建议吗?如果它是商业许可证无关紧要,只要它符合我们的需求,就可以集成到现有的PHP应用程序中并完成它的工作.我们的服务通常在linux/php/mysql上运行,我们可以做任何我们需要对服务器做的事情.
谢谢!
即时通讯使用PHPExcel读取.xls文件.我见面的时间很短
Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 730624 bytes) in Excel\PHPExcel\Shared\OLERead.php on line 93
Run Code Online (Sandbox Code Playgroud)
经过一些谷歌搜索,我尝试chunkReader来防止这种情况(甚至在PHPExcel主页上提到),但我仍然坚持这个错误.
我的想法是,通过大块阅读器,我将逐个阅读文件,我的记忆不会溢出.但是必须有一些严重的记忆漏洞?或者我释放一些记忆力不好?我甚至试图将服务器ram提升到1GB.我试图阅读的文件大小约为700k,这不是那么多(我也读取~20MB pdf,xlsx,docx,doc等文件没有问题).所以我假设我可能会忽略一些小的巨魔.
代码看起来像这样
function parseXLS($fileName){
require_once dirname(__FILE__) . './sphider_design/include/Excel/PHPExcel/IOFactory.php';
require_once dirname(__FILE__) . './sphider_design/include/Excel/PHPExcel/ChunkReadFilter.php';
$inputFileType = 'Excel5';
/** Create a new Reader of the type defined in $inputFileType **/
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
/** Define how many rows we want to read for each "chunk" **/
$chunkSize = 20;
/** Create a new Instance of our Read Filter **/
$chunkFilter = …Run Code Online (Sandbox Code Playgroud) 我有一个脚本可以读取附带 Excel 文件的电子邮件。
我正在使用 PHPExcel 来解析这些文件。
我目前遇到的问题是一封附有五个电子表格的电子邮件。
每次加载第五个文件时,PHP 都会耗尽内存。
最初,我每次完成后都尝试取消 ( $objPHPExcel = NULL;) 和取消设置 ( ) unset($objPHPExcel);PHPExcel 对象。那没有帮助。
然后我尝试将垃圾收集添加到进程 ( gc_enable(); $cycles_collected = gc_collect_cycles();)。那没有帮助。
我将当前的 php 内存使用量打印到我的错误日志中,我可以看到它随着每个 Excel 文件加载到 PHPExcel 中而增长,我还可以看到内存使用量不会随着每个NULL,unset或gc_collect.
以下是 PHP 内存不足之前和之后我的 error_log 的一些示例输出:
[17-Aug-2017 16:04:29 America/Chicago] [Blackouts] Current Memory Usage at beginning of script before loading Excel file: 85575176
[17-Aug-2017 16:04:32 America/Chicago] [Blackouts] Current Memory Usage after loading Excel file: 104474632
[17-Aug-2017 16:04:34 America/Chicago] [Blackouts] Current Memory …Run Code Online (Sandbox Code Playgroud) 我写了一个PHP应用程序,它使用数据库数据生成Excel文件.我正在使用着名的库PHPExcel.与此库一起工作的每个人都知道内存管理是这个库的最差点.
所以,我的问题是,在我写excel然后把它关闭之前,可以增加内存吗?
就像是,
error_reporting(1);
ini_set('memory_limit', '500M');
@set_time_limit(0);
Run Code Online (Sandbox Code Playgroud)
一旦完成
error_reporting(1);
ini_set('memory_limit', '128M');
@set_time_limit(0);
Run Code Online (Sandbox Code Playgroud) php ×7
phpexcel ×6
memory ×2
arrays ×1
database ×1
excel ×1
file-upload ×1
large-data ×1
memory-leaks ×1
mysql ×1