PHP批量操作Excel

自己封装了一个批量操作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>';

猜你喜欢

转载自www.cnblogs.com/mengchenchen/p/9399712.html