thinkphp_phpexcel导入导出数据demo

基于Thinkphp3.2+phpexcel1.7.7实现的数据导入导出功能

前台模板

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>thinkphp_phpexcel导入导出数据Demo</title>
</head>
<div class="formBox">
    <form id="addform" action="{:U('Index/upload')}" method="post" enctype="multipart/form-data">
        <div class="control-group">
            <label>Excel表格:</label>
            <input type="file" name="excelData" value=""/>
            <span class="Validform_checktip"></span>
        </div>
        <div class="control-group">
            <img style="display:none;" src="images/loading.gif"/>
            <input type="submit" class="btn btn-primary Sub" value="导入"/>
        </div>
    </form>
    <a href="{:U('Index/outport')}">导出</a>
</div>
</body>
</html>

控制器导出

//导出到excel
    public function outport()
    {
        $model = D("Orders");
        //查询数据得到$OrdersData二维数组
        $OrdersData = $model->select();
        //引入类库(PHPExcel的拓展名改为为PHPExcel.class.php)
        import('Vendor.Excel.PHPExcel');
        // Create new PHPExcel object
        $objPHPExcel = new \PHPExcel();
        // Set properties
        $objPHPExcel->getProperties()->setCreator("gimin")
            ->setLastModifiedBy("gimin")
            ->setTitle("Office 2007 XLSX Test Document")
            ->setSubject("Office 2007 XLSX Test Document")
            ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")
            ->setKeywords("office 2007 openxml php")
            ->setCategory("Test result file");

        //set width
        $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(8);
        $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(10);
        $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(25);
        $objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(12);
        $objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(50);
        $objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(10);
        $objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(12);
        $objPHPExcel->getActiveSheet()->getColumnDimension('H')->setWidth(12);
        $objPHPExcel->getActiveSheet()->getColumnDimension('I')->setWidth(12);
        $objPHPExcel->getActiveSheet()->getColumnDimension('J')->setWidth(30);
        $objPHPExcel->getActiveSheet()->getColumnDimension('K')->setWidth(8);

        //设置行高度
        $objPHPExcel->getActiveSheet()->getRowDimension('1')->setRowHeight(22);

        $objPHPExcel->getActiveSheet()->getRowDimension('2')->setRowHeight(20);

        //set font size bold
        $objPHPExcel->getActiveSheet()->getDefaultStyle()->getFont()->setSize(10);
        $objPHPExcel->getActiveSheet()->getStyle('A2:K2')->getFont()->setBold(true);

        $objPHPExcel->getActiveSheet()->getStyle('A2:K2')->getAlignment()
            ->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
        $objPHPExcel->getActiveSheet()->getStyle('A2:K2')->getBorders()
            ->getAllBorders()->setBorderStyle(\PHPExcel_Style_Border::BORDER_THIN);

        //设置水平居中
        $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()
            ->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
        $objPHPExcel->getActiveSheet()->getStyle('A')->getAlignment()
            ->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        $objPHPExcel->getActiveSheet()->getStyle('B')->getAlignment()
            ->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        $objPHPExcel->getActiveSheet()->getStyle('D')->getAlignment()
            ->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        $objPHPExcel->getActiveSheet()->getStyle('F')->getAlignment()
            ->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        $objPHPExcel->getActiveSheet()->getStyle('G')->getAlignment()
            ->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        $objPHPExcel->getActiveSheet()->getStyle('H')->getAlignment()
            ->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        $objPHPExcel->getActiveSheet()->getStyle('I')->getAlignment()
            ->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        $objPHPExcel->getActiveSheet()->getStyle('K')->getAlignment()
            ->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);

        //合并cell
        $objPHPExcel->getActiveSheet()->mergeCells('A1:K1');

        // set table header content
        $objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('A1', '订单数据汇总  时间:' . date('Y-m-d H:i:s'))
            ->setCellValue('A2', '订单ID')
            ->setCellValue('B2', '下单人')
            ->setCellValue('C2', '客户名称')
            ->setCellValue('D2', '下单时间')
            ->setCellValue('E2', '需求机型')
            ->setCellValue('F2', '需求数量')
            ->setCellValue('G2', '需求交期')
            ->setCellValue('H2', '确认BOM料号')
            ->setCellValue('I2', 'PMC确认交期')
            ->setCellValue('J2', 'PMC交货备注')
            ->setCellValue('K2', '质检');

        // Miscellaneous glyphs, UTF-8
        for ($i = 0; $i <= count($OrdersData) - 1; $i++) {
            $objPHPExcel->getActiveSheet(0)->setCellValue('A' . ($i + 3), $OrdersData[$i]['id']);
            $objPHPExcel->getActiveSheet(0)->setCellValue('B' . ($i + 3), $OrdersData[$i]['realname']);
            $objPHPExcel->getActiveSheet(0)->setCellValue('C' . ($i + 3), $OrdersData[$i]['customer_name']);
            $objPHPExcel->getActiveSheet(0)->setCellValue('D' . ($i + 3), date('Y-m-d', $OrdersData[$i]['create_time']));
            $objPHPExcel->getActiveSheet(0)->setCellValue('E' . ($i + 3), $OrdersData[$i]['require_product']);
            $objPHPExcel->getActiveSheet(0)->setCellValue('F' . ($i + 3), $OrdersData[$i]['require_count']);
            $objPHPExcel->getActiveSheet(0)->setCellValue('G' . ($i + 3), $OrdersData[$i]['require_time']);
            $objPHPExcel->getActiveSheet(0)->setCellValue('H' . ($i + 3), $OrdersData[$i]['product_bom_encoding']);
            $objPHPExcel->getActiveSheet(0)->setCellValue('I' . ($i + 3), $OrdersData[$i]['delivery_time']);
            $objPHPExcel->getActiveSheet(0)->setCellValue('J' . ($i + 3), $OrdersData[$i]['delivery_memo']);
            $objPHPExcel->getActiveSheet(0)->setCellValue('K' . ($i + 3), $OrdersData[$i]['quality']);
            $objPHPExcel->getActiveSheet()->getStyle('A' . ($i + 3) . ':K' . ($i + 3))->getAlignment()
                ->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
            $objPHPExcel->getActiveSheet()->getStyle('A' . ($i + 3) . ':K' . ($i + 3))->getBorders()
                ->getAllBorders()->setBorderStyle(\PHPExcel_Style_Border::BORDER_THIN);
            $objPHPExcel->getActiveSheet()->getRowDimension($i + 3)->setRowHeight(16);
        }
        //sheet命名
        $objPHPExcel->getActiveSheet()->setTitle('订单汇总表');
        //Set active sheet index to the first sheet, so Excel opens this as the first sheet
        $objPHPExcel->setActiveSheetIndex(0);
        //excel头参数
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename="订单汇总表(' . date('Ymd-His') . ').xls"');  //日期为文件名后缀
        header('Cache-Control: max-age=0');

        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');  //excel5为xls格式,excel2007为xlsx格式
        $objWriter->save('php://output');
    }
outport

控制器导入

    //展示模板
    public function test()
    {
        $this->display();
    }
    //上传方法
    public function upload()
    {
        header("Content-Type:text/html;charset=utf-8");
        $upload = new \Think\Upload();  //实例化上传类
        $upload->maxSize   =     3145728 ;  //设置附件上传大小
        $upload->exts      =     array('xls', 'xlsx');  //设置附件上传类
        $upload->savePath  =      '/';  //设置附件上传目录
        //上传文件
        $info   =   $upload->uploadOne($_FILES['excelData']);
        $filename = './Uploads'.$info['savepath'].$info['savename'];    //上传的文件保存的目录
        $exts = $info['ext'];
        //dump($info);exit;
        if(!$info) {// 上传错误提示错误信息
            $this->error($upload->getError());
        }else{// 上传成功,执行导入数据操作
            $this->goods_import($filename, $exts);
        }
    }
    //导入数据方法
    protected function goods_import($filename, $exts='xls')
    {
        //导入PHPExcel类库,因为PHPExcel没有用命名空间,只能import导入
        import('Vendor.Excel.PHPExcel');
        //创建PHPExcel对象,注意,不能少了\
        $PHPExcel=new \PHPExcel();
        //如果excel文件后缀名为.xls,导入这个类
        if($exts == '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);
        //获取表中的第一个工作表,如果要获取第二个,把0改为1,依次类推
        $currentSheet=$PHPExcel->getSheet(0);
        //获取总列数
        $allColumn=$currentSheet->getHighestColumn();
        //获取总行数
        $allRow=$currentSheet->getHighestRow();
        //循环获取表中的数据,$currentRow表示当前行,从哪行开始读取数据,
        //索引值从0开始,0为空行,如果有表头,则需要根据表头来定义索引
        for($currentRow=3;$currentRow<=$allRow;$currentRow++){
            //从哪列开始,A表示第一列
            for($currentColumn='A';$currentColumn<=$allColumn;$currentColumn++){
                //数据坐标
                $address=$currentColumn.$currentRow;
                //读取到的数据,保存到数组$arr中
                $data[$currentRow][$currentColumn]=$currentSheet->getCell($address)->getValue();
            }
        }
        $this->save_import($data);
    }
    //保存导入数据
    protected  function save_import($data)
    {
        //dump($data);exit;
        foreach ($data as $k=>$v){
            //$date['id'] = $v['A'];  //若id为主键,如果主键冲突,会导致导入失败
            $date['realname'] = $v['B'];
            $date['customer_name'] = $v['C'];
            $date['create_time'] = $v['D'];
            $date['require_product'] = $v['E'];
            $date['require_count'] = $v['F'];
            $date['require_time'] = $v['G'];
            $date['product_bom_encoding'] = $v['H'];
            $date['delivery_time'] = $v['I'];
            $date['delivery_memo'] = $v['J'];
            $date['quality'] = $v['K'];
            $result = M('orders')->add($date);
        }
        if($result){
            $this->success('导入成功',U('Index/test'));
        }else{
            $this->error('导入失败');
        }
    }
upload

 

posted on 2016-03-26 17:04  gimin  阅读(302)  评论(0)    收藏  举报