php的excel数据批量导入

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

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


一.模板下载 (创建export.php文件,存放模板代码)

1.下载导入PHPExcel库

php的excel数据批量导入_第1张图片

点击连接,进入下载界面.

php的excel数据批量导入_第2张图片

下载完毕,解压并记下文件路径.

将类导入程序中:

    //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文件用于展示导入文件和模板下载操作界面,如下:




    
    Title


模版下载

 php代码用于接收session中存放的提交信息: 
  

";
}else{
    echo "";
}
//有插入失败时,输出错误信息
if(isset($errors[0])){
    echo "$errors[0]";
}else{
    foreach($errors as $linenumber => $errmsg){
        if($errmsg){
            echo "第 $linenumber 行:$errmsg
"; } } } //没有错误信息时,提示成功 if(count($errors)==0 && isset($_SESSION['error'])){ echo "全部插入成功!"; } echo "
"; //销毁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)......
可以大幅度提高效率.












你可能感兴趣的:(PHP)