之前写了导出的分享帖,现在写一下导入的方法。我用的是mysql数据库。
具体思路:1.上传需要导入的文件。
2.利用PHPExcel处理导入的文件。
3.处理PHPExcel转换的数组,并存入数据库。
直接把源码都贴上。//导入excel文件
public function assign_excel()
{
$data = I('post.') ? I('post.') : I('get.');
if(IS_File){
if (!empty ( $_FILES)) {
// 上传文件
$upload = new \Think\Upload(); // 实例化上传类
$upload->maxSize = 10485760; // 设置附件上传大小
$upload->exts = array('xls', 'xlsx'); // 设置附件上传类型
$upload->rootPath = './Uploads/'; // 设置附件上传根目录
$upload->autoSub = false; // 将自动生成以photo后面加时间的形式文件夹,关闭
$info = $upload->upload(); // 上传文件
$exts = $info['file']['ext']; // 获取文件后缀
$filename = $upload->rootPath . $info['file']['savename']; // 生成文件路径名
if (!$info) { // 上传错误提示错误信息
$this->error($upload->getError());
} else { // 上传成功
import("Vendor.excel.PHPExcel"); // 导入PHPExcel类库,因为PHPExcel没有用命名空间,只能inport导入
//$PHPExcel = new \PHPExcel(); // 创建PHPExcel对象,注意,不能少了\
if ($exts == 'xls') { // 如果excel文件后缀名为.xls,导入这个类
import("Vendor.excel.PHPExcel.Reader.Excel5");
$PHPReader = new \PHPExcel_Reader_Excel5();
} else
if ($exts == 'xlsx') {
import("Vendor.excel.PHPExcel.Reader.Excel2007");
$PHPReader = new \PHPExcel_Reader_Excel2007();
}
$PHPExcel = $PHPReader->load($filename); // 载入文件
$currentSheet = $PHPExcel->getSheet(0); // 获取表中的第一个工作表,如果要获取第二个,把0改为1,依次类推
$allColumn = $currentSheet->getHighestColumn(); // 获取总列数
$allRow = $currentSheet->getHighestRow(); // 获取总行数
for ($currentRow = 0; $currentRow <= $allRow; $currentRow++) {// 循环获取表中的数据,$currentRow表示当前行,从哪行开始读取数据,索引值从0开始
for ($currentColumn = 'A'; $currentColumn <= $allColumn; $currentColumn++) {// 从哪列开始,A表示第一列
$address = $currentColumn . $currentRow; // 数据坐标
$ExlData[$currentRow][$currentColumn] = $currentSheet->getCell($address)->getValue();// 读取到的数据,保存到数组$ExlData中
}
}
unset($ExlData[0]);//清楚数组0的空值,这一组没有数据
unset($ExlData[1]);//excel表头,第一行
ini_set('max_execution_time', '500');//设置导入最大时长。
$arr = array_values($ExlData);//重新排序数组键名
foreach($arr as $k=>$v){
if($v["A"] != null){//不导入空值
//处理时间格式错误
import("Vendor.excel.PHPExcel.Shared.Date");
$shared = new \PHPExcel_Shared_Date();
if(trim($v["J"])=="通过"){$zt = 2;}else{$zt = 1;}
if(trim($v["L"])=="流标"){$zb = 0;}else{$zb = 1;}
if($v["C"] !=null){$c = date("Y-m-d",$shared ->ExcelToPHP($v["C"]));}else{$c=null;}
if($v["D"] !=null){$d = date("Y-m-d",$shared ->ExcelToPHP($v["D"]));}else{$d=null;}
$data['a_user'] = $v["A"];
$data['a_xh'] = $v["B"];
$data['a_btime'] =$c;
$data['a_itime'] =$d;
$data['a_dh'] = $v["E"];
$data['a_content'] = $v["F"];
$data['a_khphone'] = $v["G"];//客户联系方式
$data['a_dtime'] = $v["H"];
$data['a_fzt'] = $v["I"];//完成情况
$data['a_zt'] = $zt;//状态,是否审核
$data['a_dprice'] = $v["K"];
$data['a_zb'] =$zb;
$data['a_ftime'] = date("Y-m-d ",$shared ->ExcelToPHP($v["M"]));
$data['a_bz'] = $v["N"];
$data['a_utime'] = date("Y-m-d H:i:s",time());
//dump($data);exit();
$re = M("commit")->add($data);//导入数据库
if($re){
unset($data);
}else{
die("");
}
}else{
die("");
}
}
}
}
}
//删除单条
if(I("get.del") != null){
$map['a_id'] = I("get.a_id");
M("commit")->where($map)->delete();
}
//后台管理导入任务的价格统计条件
$map2["a_zb"] = array("neq" ,0);
$map2["a_zt"] = 2;
//分页
$count = M("commit")->count(); // 查詢滿足要求的總記錄數
$p = getpage($count, 20);
$list = M("commit")->order('a_utime')->limit($p->firstRow, $p->listRows)->select();
$price =M("commit")->where($map2)->sum("a_dprice");//统计检索出任务的价格
foreach ($data as $key => $val) {// 保持分页参数
$p->parameter[$key] = urlencode($val);
}
$this->assign('data', $data);// 参数保持
$this->assign('price', $price);
$this->assign('list', $list); // 賦值數據集
$this->assign('page', $p->show()); // 賦值分頁輸出
$this->display("assign/assign_excel");
}这里有很多坑,请注意。
1.在运行时如果报未发现xxx类,找到对应位置,更改文件名为xxx.class.php。如,未发现PHPExcel_Reader_Excel5类。则找到位置,把这个类文件名改为Excel5.class.php
2.一定要注意转换的数组,最好打印看一下。dump($ExlData);
3.最重要的是时间,一开始老是发现时间不对。phpexcel有函数转换为php的时
间戳函数。//处理时间格式错误
import("Vendor.excel.PHPExcel.Shared.Date");
$shared = new \PHPExcel_Shared_Date();
if($v["C"] !=null){$c = date("Y-m-d",$shared ->ExcelToPHP($v["C"]));}else{$c=null;}
if($v["D"] !=null){$d = date("Y-m-d",$shared ->ExcelToPHP($v["D"]));}else{$d=null;}自己也是小白一枚,有什么问题希望大伙多多指教!
phpexcel源码百度云:http://pan.baidu.com/s/1nuEvJz7