PhpExcel PHP TP6导出excel,导出excel受保护不被编辑

在前后端开发中,我们会遇见这样的需求,导出excel,相信大家都遇见过此类场景。目前有2种纬度的解决方案:

1. 介绍 :前端库(js-export-excel),2.后端(PhpExcel)库。

本章主要讲解如果在TP6里面进行excel的导出,并且导出的excel受保护某些指定的列不能被修改。

演示 :


php导出的excel.gif

2. 安装

在tp6的项目的根目录执行
$: composer require phpoffice/phpexcel

3. 项目中使用

因为通过composer加载的第三方类,所以直接在头部引入一下就可以了.

use PHPExcel_IOFactory;
use PHPExcel;

4. 整体代码块

<?php
/**
 * Created by PhpStorm.
 * User: faith
 * motto 学习可以改变自己
 * Date: 2020-02-24
 * Time: 22:25
 */


namespace app\api\controller;
use app\BaseController;
use PHPExcel_IOFactory;
use PHPExcel;
use think\facade\Cache;
class PhpToExcel extends BaseController {

    /**
     * 该方法是配合dataExportExcel 用作数据的缓存
     * Created by PhpStorm.
     * User: faith
     * motto 学习可以改变自己
     * Date: 2020-02-25
     * Time: 00:31
     * @return \think\response\Json
     */
    public function setDataRedis() {
        $data_redis = isset($_REQUEST['data_redis']) ? $_REQUEST['data_redis'] : '';
        if(empty($data_redis)) {
            return setResponse(config("status.param_null"), "缺少参数data_redis", false);
        }
        $key = md5(uniqid(md5(microtime(true)),true));
        Cache::set($key, $data_redis, 60);
        return setResponse(config("status.success"),"导出excel缓存数据成功", $key);
    }


    /**
     * 该方法是生成escel表格的
     * Created by PhpStorm.
     * User: faith
     * motto 学习可以改变自己
     * Date: 2020-02-25
     * Time: 00:32
     * @param array $data
     * @param string $name
     * @return \think\response\Json
     * @throws \PHPExcel_Exception
     * @throws \PHPExcel_Reader_Exception
     * @throws \PHPExcel_Writer_Exception
     */
    public function dataExportExcel($data = [],$name = 'excel') {
        $data_redis_key = isset($_REQUEST['data_redis_key']) ? $_REQUEST['data_redis_key'] : '';
        if(empty($data_redis_key)) {
            return setResponse(config("status.param_null"), "缺少参数data_redis_key", false);
        }
        $res = Cache::get($data_redis_key);
        if(empty($res)) {
            return setResponse(config("status.no_find"), "没有找到对应的数据", false);
        }
        $user_arr = json_decode($res);
        $excel = new \PHPExcel(); //引用phpexcel
        iconv('UTF-8', 'gb2312', $name); //针对中文名转码
        $excel->setActiveSheetIndex(0);
        $excel->getActiveSheet()->setTitle($name); //设置表名
        $excel->getActiveSheet()->getDefaultRowDimension()->setRowHeight(18);
        $excel->getActiveSheet()->getColumnDimension('B')->setWidth(80);
        //        $excel->getActiveSheet()->freezePaneByColumnAndRow(1,1);//冻结首列
        $excel->getActiveSheet()->protectCells('A1:A2', 'order_id');

        //受保护的地址列
        //$excel->getActiveSheet()->protectCells('A1:A7', 'password');

        //解除指定列锁定
        // $excel->getActiveSheet()->getStyle('B1:B7')->getProtection()->setLocked(\PHPExcel_Style_Protection::PROTECTION_UNPROTECTED);
        $excel->getActiveSheet()->getStyle('H')->getProtection()->setLocked(\PHPExcel_Style_Protection::PROTECTION_UNPROTECTED);

        //设置sheet锁定属性

        $excel->getActiveSheet()->getProtection()->setSheet(true);


        // 设置单元格的宽度
        $excel->getActiveSheet()->getColumnDimension('A')->setWidth(15);#设置单元格宽度
        $excel->getActiveSheet()->getColumnDimension('B')->setWidth(30);#设置单元格宽度
        $excel->getActiveSheet()->getColumnDimension('C')->setWidth(30);#设置单元格宽度
        $excel->getActiveSheet()->getColumnDimension('D')->setWidth(15);#设置单元格宽度
        $excel->getActiveSheet()->getColumnDimension('E')->setWidth(15);#设置单元格宽度
        $excel->getActiveSheet()->getColumnDimension('F')->setWidth(15);#设置单元格宽度
        $excel->getActiveSheet()->getColumnDimension('G')->setWidth(15);#设置单元格宽度
        $excel->getActiveSheet()->getColumnDimension('H')->setWidth(15);#设置单元格宽度


        //设置表头
        $excel->setActiveSheetIndex(0)
            ->setCellValue('A1', 'id')
            ->setCellValue('B1', '合作方名称')
            ->setCellValue('C1', '统一社会信用代码')
            ->setCellValue('D1', '经营者')
            ->setCellValue('E1', '联系方式')
            ->setCellValue('F1', '任务领取时间')
            ->setCellValue('G1', '结算月份')
            ->setCellValue('H1', '结算金额');


        //写入数据
        $data = [[
            "order_id" => 1,
            "order_status" => 1,
            "name" => 1,
            "order_name" => 1,
            "create_time" => 1,
            "remark" => 1,
            "poper_size" => 1,
            "color_num" => 1,
        ]];

        foreach ($user_arr as $k => $v) {
            //从第二行开始写入数据(第一行为表头)
            //$excel->getActiveSheet()->setCellValue('A'.($k+2),$v['gid']);
//            $excel->getActiveSheet()->setCellValue('A' . ($k + 2), $v['id']."\t");
            $excel->getActiveSheet()->setCellValue('A' . ($k + 2), $v->id."\t");
            $excel->getActiveSheet()->setCellValue('B' . ($k + 2), $v->合作方名称);
            $excel->getActiveSheet()->setCellValue('C' . ($k + 2), $v->统一社会信用代码 ?: '');
            $excel->getActiveSheet()->setCellValue('D' . ($k + 2), $v->经营者);
            $excel->getActiveSheet()->setCellValue('E' . ($k + 2), $v->联系方式);
            $excel->getActiveSheet()->setCellValue('F' . ($k + 2), $v->任务领取时间);
            $excel->getActiveSheet()->setCellValue('G' . ($k + 2), $v->结算月份);
            $excel->getActiveSheet()->setCellValue('H' . ($k + 2), $v->结算金额);
        }

        //设置单元格边框
        $excel->getActiveSheet()->getStyle("A1:E" . (count($data) + 1))->getBorders()->getAllBorders()->setBorderStyle();

        ob_end_clean();
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename="' . $name . '.xls"');
        header('Cache-Control: max-age=0');

        $res_excel = PHPExcel_IOFactory::createWriter($excel, 'Excel2007');
        $res_excel->save('php://output');

    }
}

5. 调用接口就能直接下载excel。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,104评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,816评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,697评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,836评论 1 298
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,851评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,441评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,992评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,899评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,457评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,529评论 3 341
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,664评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,346评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,025评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,511评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,611评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,081评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,675评论 2 359

推荐阅读更多精彩内容