大概思路
Excel 也是文件的一种,文件上传 复制文件 即 不在临时存储空间处理数据
然后 一键处理,直接调用方法 importExecl 即可
if (!empty($_FILES['file']) && $_FILES['file']['error'] == 0) {
$file = $_FILES['file']; //上传文件
//判定文件大小
$maxsize = 10; //最大上传文件大小
$size = floor(((ceil($file['size'] / 1024)) / 1024) * 100) / 100;
if ($size > $maxsize) {
output("文件过大,无法处理");die;
}
// output("占用内存:" . $ALLClass->memory());
$filelink = file_copy($file); //复制文件
$_FILES['file'] = null; //资源释放
}
/**
* 数据导入
* @param string $file excel文件
* @param string $sheet
* @return string 返回解析数据
* @throws PHPExcel_Exception
* @throws PHPExcel_Reader_Exception
*/
function importExecl($file = '', $sheet = 0) {
$file = iconv("utf-8", "gb2312", $file); //转码
if (empty($file) OR ! file_exists($file)) {
die('file not exists!');
}
include ('./Classes/PHPExcel.php');//自行导入 php处理 Excel的类
// include('PHPExcel.php'); //引入PHP EXCEL类
$objRead = new PHPExcel_Reader_Excel2007(); //建立reader对象
if (!$objRead->canRead($file)) {
$objRead = new PHPExcel_Reader_Excel5();
if (!$objRead->canRead($file)) {
die('No Excel!');
}
}
$cellName = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV', 'AW', 'AX', 'AY', 'AZ');
$obj = $objRead->load($file); //建立excel对象
$currSheet = $obj->getSheet($sheet); //获取指定的sheet表
$columnH = $currSheet->getHighestColumn(); //取得最大的列号
$columnCnt = array_search($columnH, $cellName);
$rowCnt = $currSheet->getHighestRow(); //获取总行数
// output("统计完成,共 {$rowCnt} 行数据。");
$data = array();
$ALLClass = new ALLClass();
for ($_row = 1; $_row <= $rowCnt; $_row++) { //读取内容
for ($_column = 0; $_column <= $columnCnt; $_column++) {
$cellId = $cellName[$_column] . $_row;
$cellValue = $currSheet->getCell($cellId)->getValue();
//$cellValue = $currSheet->getCell($cellId)->getCalculatedValue(); #获取公式计算的值
if ($cellValue instanceof PHPExcel_RichText) { //富文本转换字符串
$cellValue = $cellValue->__toString();
}
//日期处理
// if ($cellName[$_column] == "A") {
// $cellValue = PHPExcel_Shared_Date::ExcelToPHP($cellValue);
//}
$data[$_row][$cellName[$_column]] = $cellValue;
}
if ($_row % 5000 == 0) {
output("第 {$_row} 行数据已读取");
}
}
output("读取完成,数据存档中。。。");
return $data;
}
/**
* 输出打印
* @param type $msg 需要打印的消息
* @param type $size 缓冲区大小 默认 4096
* @param type $datetime 是否打印时间
* @param type $br 打印BR个数 默认2
*/
function output($msg, $size = 4096, $datetime = true, $br = 2) {
if ($datetime) {
echo date("Y-m-d H:i:s");
}
echo " $msg";
for ($i = 0; $i < $br; $i++) {
echo "
";
}
echo str_pad('', $size); //使缓冲区溢出 复制输出4096个字节
flush(); //输出送出的缓冲内容
}
/**
* 创建多级目录
* mkdir() 只能在已经存在的目录中创建创建文件夹(即父级必须有才行)。
* mkdirs() 可以在不存在的目录中创建文件夹。诸如:a\b,既可以创建多级目录。
* dirname() 是返回路径中的目录部分。
* is_dir() 用于判断给出的文件名是否是一个有效的目录
*
* */
function create_folders($dir) {
return is_dir($dir) or ( create_folders(dirname($dir)) and mkdir(iconv("UTF-8", "GBK", $dir), 0777, true));
}
/**
* 上传文件
* @param type $file 上传的文件
* @return string 服务器路径
*/
public function file_copy($file, $bool = true) {
//判断是否存在日期文件
$filename = "/Public/Uploads/file/" . date("Ymd");
if (!file_exists("." . $filename)) {
create_folders("." . $filename);
}
//获取后缀
$ary = explode('.', $file['name']);
$su = end($ary);
//文件名
$filenames = $filename . "/" . time() . rand(1, 10000) . "." . $su;
move_uploaded_file($file['tmp_name'], "." . $filenames);
$_SESSION['ajaxfile'][] = $filenames;
return $filenames;
}