php的excel数据批量导入
工作中常常有批量导入数据的需求,方法太多,掌握一个简单实用的足够了.下面为大家介绍一个好用的方法.
数据导入必须按照指定的格式系统方能识别,因此可两个大的步骤:一.导入模板下载 二.数据导入
一.模板下载 (创建export.php文件,存放模板代码)
1.下载导入PHPExcel库
点击连接,进入下载界面.
下载完毕,解压并记下文件路径.
将类导入程序中:
//1.导入PHPExcel库(引入文件路径) include "./PHPExcel_1.8.0_doc/Classes/PHPExcel.php"; //创建对象 $objPHPExcel = new PHPExcel(); //设置属性 $objPHPExcel->getProperties() ->setCreator("WOLF") ->setLastModifiedBy("WOLF") ->setTitle("Office 2007 XLSX Test Document") ->setSubject("Office 2007 XLSX Test Document") ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.");2.生成模板表头信息
//2.填充表头 $objActSheet = $objPHPExcel->setActiveSheetIndex(0); $objActSheet->setCellValue("A1","姓名"); $objActSheet->setCellValue("B1","年龄"); $objActSheet->setCellValue("C1","薪水");3.生成模板
//3.生成excel表 $objPHPExcel->getActiveSheet()->setTitle("导入模板"); $objPHPExcel->setActiveSheetIndex(0); $day = date("m-d"); $filename = $day."导入模板.xls"; ob_end_clean();//清除缓冲区,避免乱码 header("Content-Type: application/vnd.ms-excel; charset=utf-8"); header("Content-Disposition: attachment;filename=".$filename); header("Cache-Control: max-age=0"); $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel,"Excel5"); $objWriter->save("php://output"); exit;
这样,模板就生成了.接下来需要做的是导入数据.
二.导入数据
1.创建前端文件(这里取名inport.php)
inport.php文件分两部分,html文件用于展示导入文件和模板下载操作界面,如下:
<pre name="code" class="html"><!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form class="form-inline" method="post" action="import.php" enctype="multipart/form-data"> <div> <label><strong>文件:</strong></label> <input type="file" name="xls"> </div> <div style="margin: 20px 0"> <button type="submit" value="确认提交" class="btn btn-info">确认提交</button> <a href="export.php">模版下载</a> </div> </form>
php代码用于接收session中存放的提交信息:
<?php session_start(); // 首先开启session $errors=$_SESSION["error"]; // 取出session的值 //失败项提示红色,成功提示绿色 if(count($errors)){ echo "<span style="color:red;font-size:15px;">"; }else{ echo "<span style="color:green;font-size:15px;">"; } //有插入失败时,输出错误信息 if(isset($errors[0])){ echo "$errors[0]"; }else{ foreach($errors as $linenumber => $errmsg){ if($errmsg){ echo "第 $linenumber 行:$errmsg<br> "; } } } //没有错误信息时,提示成功 if(count($errors)==0 && isset($_SESSION["error"])){ echo "全部插入成功!"; } echo "</span>"; //销毁session unset($_SESSION["error"]); ?>2.创建后台解析文件(import.php)
思路: 接收提交的excel文件逐行进行解析,有问题的行记录存放在error数组中不进行数据更新.没有问题的更新数据库
解析完成后,将error数据存放在session中,跳转到原界面进行提示更新结果.
程序流程:
a.连接数据库 b.判断是否为excel类文件,是则进行解析 c.开始逐行解析,对每个字段加以判断内容是否合格,将错误信息存放数组
e.更新数据库 f.解析完毕,跳转回原界面
$conn=new mysqli("localhost","root","root","myDBPDO"); // 检测连接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } if (isset($_FILES["xls"])) { set_time_limit(0); ini_set("memory_limit", "1024M"); //导入PHPExcel库 include "./PHPExcel_1.8.0_doc/Classes/PHPExcel.php"; //获取导入文件名,并加以判断是否为excel文件 $xls = $_FILES["xls"]["tmp_name"]; $name = $_FILES["xls"]["name"]; $name = explode(".", $name); //新建二维数组,用于存放错误信息,存放在session中传到前端提示 $errors = array(); //若文件格式为xls,xlsx,cvs时,进行解析 if ($xls AND ($name[1] == "xls" OR $name[1] == "xlsx" OR $name[1] == "cvs")) { $objReader = PHPExcel_IOFactory::load($xls); $objReader = $objReader->getSheet(0); $rows = $objReader->getHighestRow(); //若文件有内容,则读取 if($rows > 1){ for($i = 2;$i <= $rows;$i ++){ $name = trim($objReader->getCell("A".$i)->getValue()); $age = trim($objReader->getCell("B".$i)->getValue()); $salary = trim($objReader->getCell("C".$i)->getValue()); //遇到空白行,跳出本次循环 if($name=="" && $age=="" && $salary==""){ continue; } //保存错误信息 if(empty($name)){ $errors["$i"] = "姓名必须填"; } if(empty($age)){ $errors["$i"] = "年龄必须填"; } if(empty($salary)){ $errors["$i"] = "薪水必须填"; } if (empty($errors["$i"])) { unset($errors["$i"]); // 更新emp表 $sql="insert into emp (name,salary,age) values ("$name",$salary,$age)"; $result=$conn->query($sql); } unset($name); unset($age); unset($salary); } //文件没有内容 }else{ $errors[0] = "请从表格第2行开始填写正确的数据"; } //不是excel类文件 }else{ $errors[0] = "请选择EXCEL文件"; } session_start(); // 首先开启session $_SESSION["error"] = $errors; // 把error存在$_SESSION["error"] 里面 header("Location:./adds.php"); //跳回页面 }
到此,批量导入功能就算完成,涉及的知识比较全面.实际工作中批量导入数据量大时,解析文件e步骤中更新数据库可以优化,
每150行或200行更新一次数据库,
insert into emp (name,salary,age) values ("$name1",$salary1,$age1),("$name2",$salary2,$age2)......可以大幅度提高效率.
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: phpexcel 批量导入数据
- 下一篇: 如何用PHPExcel读取超大excel文件