入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

PhpExcel的使用、示例及注意事项

创建时间:2017-04-01 投稿人: 浏览次数:12769

导出

导出excel主要有以下几个步骤:

Created with Raphaël 2.1.0加载PhpExcel核心文件创建一个excel设置excel属性导出excel结束

以下是以thinkphp框架为例:
步骤一:下载phpexcel压缩包,地址:https://github.com/PHPOffice/PHPExcel/tree/1.7.9,该压缩包中有一些示例可以参考,基本涵盖所有情况导出示例。在Examples文件夹中。将压缩包中Classes文件里边的所有文件复制到tp中ThinkPHPLibraryOrgUtil目录下,并将PHPExcel.php文件改名为PHPExcel.class.php,如下图,tp的import引入文件时命名规则,非tp,include加载文件不用修改名字。
这里写图片描述
步骤二:在控制器中写个方法。以下是实现excel导出最简单的示例代码:

<?php

namespace HomeController;

use ThinkController;

class IndexController extends Controller {

    public function test(){
        //获取你要导出的数据,你要获取的到数据库的数据
        $data = M("user")->field("id,username,password,img")->order("id DESC")->limit(520)->select();
        //设置要导出excel的表头 
        $fileheader= array("ID", "用户名对方的身份是否为热土还是打", "密码", "图片"); 
        $this->exportExcel($data,"测试",$fileheader,"Sheet1");
    }


    /**
    * 导出excel
    * @param array $data 导入数据
    * @param string $savefile 导出excel文件名
    * @param array $fileheader excel的表头
    * @param string $sheetname sheet的标题名
    */
    public function exportExcel($data, $savefile, $fileheader, $sheetname){
        //引入phpexcel核心文件,不是tp,你也可以用include(‘文件路径’)来引入
        import("Org.Util.PHPExcel");
        import("Org.Util.PHPExcel.Reader.Excel2007");
        //或者excel5,用户输出.xls,不过貌似有bug,生成的excel有点问题,底部是空白,不过不影响查看。
        //import("Org.Util.PHPExcel.Reader.Excel5");
        //new一个PHPExcel类,或者说创建一个excel,tp中“”不能掉
        $excel = new PHPExcel();
        if (is_null($savefile)) {
            $savefile = time();
        }else{
            //防止中文命名,下载时ie9及其他情况下的文件名称乱码
            iconv("UTF-8", "GB2312", $savefile);
        }
        //设置excel属性
        $objActSheet = $excel->getActiveSheet();
        //根据有生成的excel多少列,$letter长度要大于等于这个值
        $letter = array("A","B","C","D","E","F","F","G");
        //设置当前的sheet
        $excel->setActiveSheetIndex(0);
        //设置sheet的name
        $objActSheet->setTitle($sheetname);
        //设置表头
        for($i = 0;$i < count($fileheader);$i++) {
            //单元宽度自适应,1.8.1版本phpexcel中文支持勉强可以,自适应后单独设置宽度无效
            //$objActSheet->getColumnDimension("$letter[$i]")->setAutoSize(true); 
            //设置表头值,这里的setCellValue第二个参数不能使用iconv,否则excel中显示false
            $objActSheet->setCellValue("$letter[$i]1",$fileheader[$i]); 
            //设置表头字体样式
            $objActSheet->getStyle("$letter[$i]1")->getFont()->setName("微软雅黑");
            //设置表头字体大小
            $objActSheet->getStyle("$letter[$i]1")->getFont()->setSize(12);
            //设置表头字体是否加粗
            $objActSheet->getStyle("$letter[$i]1")->getFont()->setBold(true);
            //设置表头文字垂直居中
            $objActSheet->getStyle("$letter[$i]1")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
            //设置文字上下居中
            $objActSheet->getStyle($letter[$i])->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
            //设置表头外的文字垂直居中
            $excel->setActiveSheetIndex(0)->getStyle($letter[$i])->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        }
        //单独设置D列宽度为15
        $objActSheet->getColumnDimension("D")->setWidth(15);
        //这里$i初始值设置为2,$j初始值设置为0,自己体会原因
        for ($i = 2;$i <= count($data) + 1;$i++) {
            $j = 0;
            foreach ($data[$i - 2] as $key=>$value) {
                //不是图片时将数据加入到excel,这里数据库存的图片字段是img
                if($key != "img"){
                    $objActSheet->setCellValue("$letter[$j]$i",$value);
                }
                //是图片是加入图片到excel
                if($key == "img"){
                    if($value != ""){
                        $value = iconv("UTF-8","GB2312",$value); //防止中文命名的文件
                        // 图片生成
                        $objDrawing[$key] = new PHPExcel_Worksheet_Drawing();
                        // 图片地址
                        $objDrawing[$key]->setPath(".Uploads".$value);
                        // 设置图片宽度高度
                        $objDrawing[$key]->setHeight("80px"); //照片高度
                        $objDrawing[$key]->setWidth("80px"); //照片宽度
                        // 设置图片要插入的单元格
                        $objDrawing[$key]->setCoordinates("D".$i);
                        // 图片偏移距离
                        $objDrawing[$key]->setOffsetX(12);
                        $objDrawing[$key]->setOffsetY(12);
                        //下边两行不知道对图片单元格的格式有什么作用,有知道的要告诉我哟^_^
                        //$objDrawing[$key]->getShadow()->setVisible(true);
                        //$objDrawing[$key]->getShadow()->setDirection(50);
                        $objDrawing[$key]->setWorksheet($objActSheet);
                    }
                }
                $j++;
            }
            //设置单元格高度,暂时没有找到统一设置高度方法
            $objActSheet->getRowDimension($i)->setRowHeight("80px");
        }
        header("Content-Type: application/vnd.ms-excel");
        //下载的excel文件名称,为Excel5,后缀为xls,不过影响似乎不大
        header("Content-Disposition: attachment;filename="" . $savefile . ".xlsx""); 
        header("Cache-Control: max-age=0");
        // 用户下载excel
        $objWriter = PHPExcel_IOFactory::createWriter($excel, "Excel2007");
        $objWriter->save("php://output");
        // 保存excel在服务器上
        //$objWriter = new PHPExcel_Writer_Excel2007($excel);
        //或者$objWriter = new PHPExcel_Writer_Excel5($excel);
        //$objWriter->save("保存的文件地址/".$savefile);
    }
}

代码说明:代码中exportExcel方法,可以根据自己实际需求,更改代码
导出注意事项:
1、数字导出时,第一个数字为0时,会被省略。将其以字符串格式导出即可,处理办法可以在该字段后加空格即可,导出显示是伪科学计算法导出也可以使用该办法,例如$data["num"] = $data["num"]." "
2、图片导出时,若出现图片导出有问题,可能是中文命名情况,可以用iconv对图片名先做处理。
3、在从数据库中取数据,数据是要导入到excel中显示的,有中文时不要用iconv,否则excel中显示都是false
4、下载的文件命名最好使用iconv处理下,因为可能会有浏览器兼容性问题导致下载的文件命名乱码而导致里边数据也是乱码的。
5、如果下载的excel打开时乱码,在header() 前面加上ob_end_clean() 函数, 清除缓冲区, 这样就不会乱码了!
ob_end_clean();//清除缓冲区,避免乱码
header(‘Content-Type: application/vnd.ms-excel’);

导入

导入excel主要有以下几个步骤:

Created with Raphaël 2.1.0上传excel文件到服务器检查excel是否符合要求取出excel中的数据导入数据库是否做删除excel处理结束

以下是以thinkphp框架为例:
步骤一: 与上边导出一样
步骤二: 在控制器中写个方法。以下是实现excel导入最简单的示例代码:

<?php
namespace HomeController;

use ThinkController;

class IndexController extends Controller {

    //上传excel文件,非tp框架可以使用move_uploaded_file写文件上传函数
    public function uploadExcel() {
        if(is_uploaded_file($_FILES["file"]["tmp_name"])){
            header("Content-Type:text/html;charset=utf-8");
            $upload = new ThinkUpload(); // 实例化上传类
            $upload->maxSize = 3145728; // 设置附件上传大小
            //文件真正类型判断可参考http://blog.csdn.net/qq_21386275/article/details/69987371
            $upload->exts = array("xls", "xlsx"); // 设置附件上传后缀
            $upload->savePath = "./Public/Uploads/"; // 设置附件上传目录
            // 上传文件
            $info = $upload->uploadOne($_FILES["file"]);
            $filename = "Uploads" . $info["savepath"] . $info["savename"];
            $exts = $info["ext"];
            if (!$info) {// 上传错误提示错误信息
                $this->error($upload->getError());
            } else {// 上传成功
                $this->getExcelData($filename, $exts);
            }
        }
    }

    //取出excel中的数据
    protected function getExcelData($filename, $exts){
        //导入PHPExcel类库
        import("Org.Util.PHPExcel");
        //不同类型的文件导入不同的类
        if ($exts == "xls") {
            import("Org.Util.PHPExcel.Reader.Excel5");
            $PHPReader = new PHPExcel_Reader_Excel5();
        } else if ($exts == "xlsx") {
            import("Org.Util.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开始
        for ($currentRow = 1; $currentRow <= $allRow; $currentRow++) {
            //从哪列开始,A表示第一列
            for ($currentColumn = "A"; $currentColumn <= $allColumn; $currentColumn++) {
                //数据坐标
                $address = $currentColumn . $currentRow;
                //读取到的数据,保存到数组$arr中
                $data[$currentRow][$currentColumn] = $currentSheet->getCell($address)->getValue();
            }
        }
        @unlink ( $filename ); //删除上传的文件
        $this->importData($data);
    }

    //保存数据到数据库
    public function importData($data){
        //检测模版是否标准
        $title = array(
            "A"=>"姓名",
            "B"=>"密码",
        );
        if($title != $data[1]){
            $this->error("您的模版不正确,请下载标准模版");
        }
        foreach ($data as $k => $v) {
            if ($k > 1) {
                $dataList[$k-2]["username"] = $v["A"];
                $dataList[$k-2]["password"] = $v["B"];
            }
        }
        //批量导入数组键名必须从0开始
        $result = M("user")->addAll($dataList);
        if ($result) {
            $this->success("用户导入成功");
        } else {
            $this->error("用户导入失败");
        }
    }
}

PDF生成

phpexcel中的例子代码,移植到tp中示例:
步骤一: phpexcel pdf writer 包装了三个pdf渲染库,tcPDF,mPDF,DomPDF。在1.7.8以前的版本phpexcel集成了tcPDF,但是从1.7.8开始被去掉了,所以必须安装一个pdf渲染器。
下载地址:
tcPDF 5.9 :http://www.tcpdf.org/ PDF_RENDERER_TCPDF
mPDF 5.4 :http://www.mpdf1.com/mpdf/ PDF_RENDERER_MPDF
domPDF 0.6.0 :https://github.com/dompdf/dompdf PDF_RENDERER_DOMPDF
下载地址后边对应的大写英文字母,不同的pdf渲染器对应下边代码$rendererName静态调用的方法。
下载压缩包后解压,放在项目的某个文件下,下边代码中$rendererLibraryPath写上该对应路径。

<?php
namespace HomeController;
use ThinkController;
class IndexController extends Controller {
    //导出pdf
    public function pdfImport(){
        import("Org.Util.PHPExcel");
        $rendererName = PHPExcel_Settings::PDF_RENDERER_MPDF;
        $rendererLibrary = "MPDF57";
        $rendererLibraryPath = "./Public/" . $rendererLibrary;
        // Create new PHPExcel object
        $objPHPExcel = new PHPExcel();

        // Set document properties
        $objPHPExcel->getProperties()->setCreator("Maarten Balliauw")
                                     ->setLastModifiedBy("Maarten Balliauw")
                                     ->setTitle("PDF Test Document")
                                     ->setSubject("PDF Test Document")
                                     ->setDescription("Test document for PDF, generated using PHP classes.")
                                     ->setKeywords("pdf php")
                                     ->setCategory("Test result file");
        $objPHPExcel->setActiveSheetIndex(0)
                    ->setCellValue("A1", "Hello")
                    ->setCellValue("B1", "world!")
                    ->setCellValue("C1", "Hello")
                    ->setCellValue("D1", "world!");
        $objPHPExcel->setActiveSheetIndex(0)
                    ->setCellValue("A4", "Miscellaneous glyphs")
                    ->setCellValue("A5", "éàèùâêîôûëïüÿäöüç");
        $objPHPExcel->getActiveSheet()->setTitle("Simple");
        $objPHPExcel->getActiveSheet()->setShowGridLines(false);
        $objPHPExcel->setActiveSheetIndex(0);

        if (!PHPExcel_Settings::setPdfRenderer(
            $rendererName,
            $rendererLibraryPath
        )) {
            die(
                "NOTICE: Please set the $rendererName and $rendererLibraryPath values" .
                "<br />" .
                "at the top of this script as appropriate for your directory structure"
            );
        }
        header("Content-Type: application/pdf");
        header("Content-Disposition: attachment;filename="01simple.pdf"");
        header("Cache-Control: max-age=0");

        $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "PDF");
        $objWriter->save("php://output");
        exit;
    }
}
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
  • 上一篇:没有了
  • 下一篇:没有了
未上传头像