自己封装了一个批量操作excel文件的方法,通过xls文件地址集合遍历,第三个参数传入一个匿名函数用于每个需求的不同进行的操作,实例中我想要得到列表中含有折字的行,封装成sql语句返回。
xls文件超过一万个的情况下,速度会比较慢,会遇到time_out(超时)的情况,这个时候你可能需要加上这两句话
set_time_limit(0); // 设置永不超时
ini_set('memory_limit', '13312M'); // 临时设置最大内存占用为12G(我的电脑内存是16G的)
下载PHPExcel
// 引入PHPExcel
include './PHPExcel/Classes/PHPExcel/IOFactory.php';
/**
* 批量处理excel
*
* @param $path [xls所在路径]
* @param $xls_arr [xls的地址数组集合]
* @param $function [传送一个匿名函数,调用该方法时会返回三个参数【sheet,key,value】,根据这三个参数编写你的业务逻辑代码]
* @param $is_return_false [单个xls处理文件结果为false的是否返回,默认返回]
* @return array 返回一个数组,每个xls文件的处理结果的集合。
* @throws PHPExcel_Exception
* @throws PHPExcel_Reader_Exception
* @author mengchenchen
*/
function batch_excel($path, $xls_arr, $function, $is_return_false = true)
{
$res = [];
foreach ($xls_arr as $k => $v) {
$fileName = $path . $v;
if (!file_exists($fileName))
continue;
$inputFileType = PHPExcel_IOFactory::identify($fileName);
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objPHPExcel = $objReader->load($fileName);
$sheet = $objPHPExcel->getSheet(0);
$result = $function($sheet, $k, $v);
if ($is_return_false == false && !$result)
continue;
$res[$k] = $function($sheet, $k, $v);
}
return $res;
}
// 使用案例
$res = batch_excel('./xls', $all, function ($sheet, $key, $value) {
$highestRow = $sheet->getHighestRow(); // 行数
$highestColumn = $sheet->getHighestColumn(); // 列
// 从倒数第四行开始,查到最后一行
for ($row = $highestRow > 4 ? $highestRow - 4 : 1; $row <= $highestRow; $row++) {
// 获取每行的数据
$rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);
foreach ($rowData as $k => $v) {
// 判断该行是否有 ‘折’
if (strpos($v[0], '折') !== false) {
$num = str_replace(['总费用', '折', ':'], '', $rowData[0][0]);
return "update table set field = {$num} where id = {$key}";
}
}
}
}, false);
// 打印结果
echo '<pre>';
var_dump(array_filter($res));
echo '</pre>';