牛骨文教育服务平台(让学习变的简单)
博文笔记

php的excel数据批量导入

创建时间:2016-04-03 投稿人: 浏览次数:1031

工作中常常有批量导入数据的需求,方法太多,掌握一个简单实用的足够了.下面为大家介绍一个好用的方法.

数据导入必须按照指定的格式系统方能识别,因此可两个大的步骤:一.导入模板下载  二.数据导入


一.模板下载 (创建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)......
可以大幅度提高效率.












声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。