PHP 批量操作 Excel
2024-08-29 10:46:35
自己封装了一个批量操作excel文件的方法,通过xls文件地址集合遍历,第三个参数传入一个匿名函数用于每个需求的不同进行的操作,实例中我想要得到列表中含有折字的行,封装成sql语句返回。
xls文件超过一千个的情况下,速度会比较慢,会遇到time_out(超时)的情况,这个时候你可能需要加上这两句话
set_time_limit(0); // 设置永不超时
ini_set('memory_limit', '13312M'); // 临时设置最大内存占用为12G(我的电脑内存是16G的)
出现文件找不到的情况:
第一、文件名称的目录中包含中文
$FileName = iconv('UTF-8', 'GBK', $file);
第二、文件名称拼接而来
header("Content-type: text/html; charset=utf-8");
如果需要使用 date 的函数,加上这个
date_default_timezone_set('PRC');
下载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 = iconv('UTF-8','GBK',$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>';
最新文章
- 【bzoj2648】 SJY摆棋子
- c#读取webconfig
- Linux下apache日志分析与状态查看方法
- 什么情况下include_path不起作用?
- 简述 Ruby 与 DSL 在 iOS 开发中的运用
- jquery select操作和联动操作
- 利用SQOOP将ORACLE到HDFS
- JXL 读取 Excel java中jxl导出数据到excel的例子 上传文件
- PHP中利用DOM和simplxml读取xml文档
- J2EE进阶(十六)Hibernate 中getHibernateTemplate()方法使用
- XMPP系列(六)---创建群组
- MR PAGERANK思路
- Unity Shader Learning
- Linux中断管理 (2)软中断和tasklet
- mysql存储过程异常处理
- 1.6 flask应用: 代码统计系统
- POJ 2395 Out of Hay (Kruskal)
- Android环境的搭建及Android Studio的安装
- 多线程IO通过并发IO来优化性能
- 使用css实现移动端导航条滚动