分类 默认分类 下的文章

Centos 7默认gcc版本为4.8,有时需要更高版本的,这里以升级至8.3.1版本为例,分别执行下面三条命令即可,无需手动下载源码编译

PS:我在安装的时候已经可以使用11这个版本了

1、安装centos-release-scl

sudo yum install centos-release-scl

2、安装devtoolset,注意,如果想安装7.版本的,就改成devtoolset-7-gcc,以此类推

sudo yum install devtoolset-8-gcc*

3、激活对应的devtoolset,所以你可以一次安装多个版本的devtoolset,需要的时候用下面这条命令切换到对应的版本

scl enable devtoolset-8 bash

大功告成,查看一下gcc版本

gcc -v

显示为 gcc version 8.3.1 20190311 (Red Hat 8.3.1-3) (GCC)

补充:这条激活命令只对本次会话有效,重启会话后还是会变回原来的4.8.5版本,要想随意切换可按如下操作。

**首先,安装的devtoolset是在 /opt/rh 目录下的

每个版本的目录下面都有个 enable 文件,如果需要启用某个版本,只需要执行

source ./enable

所以要想切换到某个版本,只需要执行

source /opt/rh/devtoolset-8/enable

可以将对应版本的切换命令写个shell文件放在配了环境变量的目录下,需要时随时切换,或者开机自启

4、直接替换旧的gcc

旧的gcc是运行的 /usr/bin/gcc,所以将该目录下的gcc/g++替换为刚安装的新版本gcc软连接,免得每次enable

mv /usr/bin/gcc /usr/bin/gcc-4.8.5
ln -s /opt/rh/devtoolset-8/root/bin/gcc /usr/bin/gcc
mv /usr/bin/g++ /usr/bin/g++-4.8.5
ln -s /opt/rh/devtoolset-8/root/bin/g++ /usr/bin/g++
gcc --version
g++ --version

$f = fopen('curl_debug', 'wb');
curl_setopt($ch,CURLOPT_VERBOSE,true);//默认是标准错误输出中
curl_setopt($ch,CURLOPT_STDERR ,$f);//有了该指令,请求过程记录会写到该文件中

记录的文件内容大致如下 :

*   Trying 14.215.177.39...
* TCP_NODELAY set
* Connected to www.baidu.com (14.215.177.39) port 80 (#0)
> GET / HTTP/1.1
Host: www.baidu.com
Accept: */*

< HTTP/1.1 200 OK
< Accept-Ranges: bytes
< Cache-Control: no-cache
< Connection: keep-alive
< Content-Length: 14615
< Content-Type: text/html
< Date: Tue, 02 Nov 2023 16:34:39 GMT
< Pragma: no-cache
< Server: BWS/1.1
< Vary: Accept-Encoding
< 
* Connection #0 to host www.baidu.com left intact

curl本身的bug导致如果CURLINFO_HEADER_OUT设置为true时(即开启输出响应头), CURLOPT_VERBOSE会不生效.所以你需要将CURLINFO_HEADER_OUT配置去掉.

“ubuntu从17.10开始,已放弃在 /etc/network/interfaces 里固定IP的配置,即使配置也不会生效,而是改成netplan方式 ,配置写在 /etc/netplan/01-netcfg.yaml 或者类似名称的yaml文件里”

步骤一,修改配置

# 具体文件可能有变化,但一定在 netplan 下
sudo vim /etc/netplan/00-installer-config.yaml

步骤二,修改内容即可: 以下是启用dhcp的情况下,其它自定义IP可以搜索下格式

# This is the network config written by 'subiquity'
network:
  ethernets:
    ens3:
      dhcp4: true
    ens4:
      dhcp4: true
  version: 2

一个基于使用了PHPExcel类的生成excel表格下载文件的PHP用例代码,使用了一些比如设置单元格格式、跨列跨行的功能,作一下记录:

//xls下载
        $sitename = zmf::config('sitename');
        $filename = zmf::time($planInfo['planTime'], 'md') . $planInfo->areaInfo->title . $planInfo->styleInfo->title . Plans::exTypes($planInfo->type).'物料'.$groupByTitle.'清单';
        $charterArr = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
//引入phpexcel相关库类文件
        Yii::import('application.vendors.phpexcel.*');
        require_once 'PHPExcel.php';
        $objPHPExcel = new PHPExcel();
        // Set document properties
        $objPHPExcel->getProperties()->setCreator($sitename)
            ->setLastModifiedBy($sitename)
            ->setTitle($sitename);

        if($groupBy=='userDetail'){
            $attrKeys = array(
                array(
                    'title' => $groupByTitle,
                    'width' => 20,
                    'field' => $groupByField
                ),
                array(
                    'title' => '服务项目',
                    'width' => 40,
                    'field' => 'userTitle',
                    'color' => 'FF0000',
                ),
                array(
                    'title' => '介绍',
                    'width' => 50,
                    'field' => 'userDesc'
                ),
                array(
                    'title' => '数量',
                    'width' => 10,
                    'field' => 'userNum'
                ),
                array(
                    'title' => '单位',
                    'width' => 20,
                    'field' => 'userUnit'
                ),
                array(
                    'title' => '单价',
                    'width' => 20,
                    'field' => 'userPrice'
                ),
                array(
                    'title' => '总价',
                    'width' => 20,
                    'field' => 'userPriceTotal'
                ),
            );
        }else{
            $attrKeys = array(
                array(
                    'title' => '分区',
                    'width' => 20,
                    'field' => 'zone'
                ),
                array(
                    'title' => '名称',
                    'width' => 40,
                    'field' => 'title'
                ),
                array(
                    'title' => '数量',
                    'width' => 10,
                    'field' => 'num'
                ),
                array(
                    'title' => '单位',
                    'width' => 10,
                    'field' => 'unit'
                ),
//                array(
//                    'title' => '规格',
//                    'width' => 10,
//                    'field' => 'size'
//                ),
//                array(
//                    'title' => '形状',
//                    'width' => 10,
//                    'field' => 'shape'
//                ),
//                array(
//                    'title' => '颜色',
//                    'width' => 10,
//                    'field' => 'color'
//                ),
//                array(
//                    'title' => '材质/种类',
//                    'width' => 10,
//                    'field' => 'material'
//                ),
                array(
                    'title' => '备注',
                    'width' => 50,
                    'field' => '_desc',
                    'horizontal_center'=>false,  //水平居中
                    'mergeColumn'=>5, //横向合并后面单元格数量
                ),
            );
        }

        $attrKeysLen = count($attrKeys);
        $maxCharIdx = $attrKeysLen-1 + array_sum(array_column($attrKeys, 'mergeColumn'));
        $maxChar=$charterArr[$maxCharIdx];
        if($groupBy=='userDetail'){
            //表头
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', 'Quotation');
            $objPHPExcel->setActiveSheetIndex(0)->getStyle('A1')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
            $objPHPExcel->setActiveSheetIndex(0)->getStyle('A1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
            $objPHPExcel->getActiveSheet()->getRowDimension('1')->setRowHeight(50);
            $objPHPExcel->setActiveSheetIndex(0)->mergeCells('A1:' . $charterArr[$attrKeysLen-1] . '1');
            $objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setSize(20);
            $objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setBold(true);
            $objPHPExcel->setActiveSheetIndex(0)->getStyle('A1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
            //$objPHPExcel->setActiveSheetIndex(0)->getStyle('A1')->getFill()->getStartColor()->setRGB('F2DCDB');

            //简介
            $str='To:'.$planInfo->userInfo->truename.PHP_EOL.'惊喜时间 Date:'.zmf::time($planInfo->planTime, 'Y/m/d').PHP_EOL.'惊喜地点 Venue: '.$planInfo->areaInfo->title.PHP_EOL.'Tel:400-000-0000'.PHP_EOL.'Email:vip@tell520.com';
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A2', $str);
            $objPHPExcel->getActiveSheet()->getRowDimension('2')->setRowHeight(120);
            $objPHPExcel->setActiveSheetIndex(0)->mergeCells('A2:' . $charterArr[$attrKeysLen-1] . '2');
            $objPHPExcel->getActiveSheet()->getStyle('A2')->getFont()->setSize(16);
            $objPHPExcel->getActiveSheet()->getStyle('A2')->getFont()->setBold(true);
            $objPHPExcel->setActiveSheetIndex(0)->getStyle('A2')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
            $objPHPExcel->getActiveSheet()->getStyle('A2')->getAlignment()->setWrapText(true);
            //第三排
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A3', '本场惊喜,从活动策划+物料采购+制作设计+惊喜统筹+现场惊喜服务人员:预计'.$userNum.'人');
            $objPHPExcel->setActiveSheetIndex(0)->getStyle('A3')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
            $objPHPExcel->setActiveSheetIndex(0)->getStyle('A3')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
            $objPHPExcel->getActiveSheet()->getRowDimension('3')->setRowHeight(50);
            $objPHPExcel->getActiveSheet()->getStyle('A3')->getFont()->setSize(14);
            $objPHPExcel->getActiveSheet()->getStyle('A3')->getFont()->setBold(true);
            $objPHPExcel->setActiveSheetIndex(0)->mergeCells('A3:' . $charterArr[$attrKeysLen-1] . '3');
            $objPHPExcel->setActiveSheetIndex(0)->getStyle('A3')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
            //$objPHPExcel->setActiveSheetIndex(0)->getStyle('A3')->getFill()->getStartColor()->setRGB('F2DCDB');

        }else{
            //表头
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', $filename);
            $objPHPExcel->setActiveSheetIndex(0)->getStyle('A1')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
            $objPHPExcel->setActiveSheetIndex(0)->getStyle('A1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
            $objPHPExcel->getActiveSheet()->getRowDimension('1')->setRowHeight(50);
            $objPHPExcel->setActiveSheetIndex(0)->mergeCells('A1:' . $charterArr[$maxCharIdx] . '1');
            $objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setSize(20);
            $objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setBold(true);
            /*设置公共信息*/
            //第一排
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A2', '日期:' . zmf::time($planInfo->planTime, 'Y/m/d'));
            $objPHPExcel->setActiveSheetIndex(0)->getStyle('A2')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue('B2', '求婚时间:'.($qiuHunTimeInfo ? $qiuHunTimeInfo['results'] : ''));
            $objPHPExcel->setActiveSheetIndex(0)->getStyle('B2')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue('C2', '主角:' . $planInfo->userInfo->truename);
            $objPHPExcel->setActiveSheetIndex(0)->getStyle('C2')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
            $objPHPExcel->setActiveSheetIndex(0)->mergeCells('C2:D2');
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue('E2', '总部统筹:' . $excUserinfo->truename . '/' . $excUserinfo->phone);
            $objPHPExcel->setActiveSheetIndex(0)->getStyle('E2')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
            $objPHPExcel->setActiveSheetIndex(0)->mergeCells('E2:F2');
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue('G2', '紧急联系:周旭');
            $objPHPExcel->setActiveSheetIndex(0)->getStyle('G2')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
            $objPHPExcel->setActiveSheetIndex(0)->mergeCells('G2:H2');
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue('I2', '总部监督:王沛如');
            $objPHPExcel->setActiveSheetIndex(0)->getStyle('I2')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
            $objPHPExcel->setActiveSheetIndex(0)->mergeCells('I2:J2');

            //第二排
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A3', '城市:' . $planInfo->areaInfo->title);
            $objPHPExcel->setActiveSheetIndex(0)->getStyle('A3')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue('B3', '场地:' . $placeInfo['title']);
            $objPHPExcel->setActiveSheetIndex(0)->getStyle('B3')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue('C3', '彩排时间:');
            $objPHPExcel->setActiveSheetIndex(0)->getStyle('C3')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
            $objPHPExcel->setActiveSheetIndex(0)->mergeCells('C3:D3');
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue('E3', '执行策划:' . $partnerInfo['title'] . '/' . $contactInfo['name'] . '/' . $contactInfo['phone'] . ($contactInfo['otherPhone'] != '' ? '/' . $contactInfo['otherPhone'] : ''));
            $objPHPExcel->setActiveSheetIndex(0)->getStyle('E3')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
            $objPHPExcel->setActiveSheetIndex(0)->mergeCells('E3:F3');
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue('G3', '电话:18888888888');
            $objPHPExcel->setActiveSheetIndex(0)->getStyle('G3')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
            $objPHPExcel->setActiveSheetIndex(0)->mergeCells('G3:H3');
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue('I3', '电话:13888888888');
            $objPHPExcel->setActiveSheetIndex(0)->getStyle('I3')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
            $objPHPExcel->setActiveSheetIndex(0)->mergeCells('I3:J3');
            $objPHPExcel->getActiveSheet()->getRowDimension('2')->setRowHeight(35);
            $objPHPExcel->getActiveSheet()->getRowDimension('3')->setRowHeight(35);
        }

        //设置标题
        $tkey=4;
        $jump = 0;
        foreach ($attrKeys as $k => $_attr) {
            $_char = $charterArr[$k+$jump];
            $_mergeColumn = $_attr['mergeColumn']??0;
            $_horizontal_center = $_attr['horizontal_center']??true;
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue($_char . $tkey, $_attr['title']);
            $objPHPExcel->setActiveSheetIndex(0)->getColumnDimension($_char)->setWidth($_attr['width']);
            //加粗
            $objPHPExcel->getActiveSheet()->getStyle($_char . $tkey)->getFont()->setBold(true);
            //水平垂直居中
            $objPHPExcel->setActiveSheetIndex(0)->getStyle($_char . $tkey)->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
            if ($_horizontal_center) $objPHPExcel->setActiveSheetIndex(0)->getStyle($_char . $tkey)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
            //设置背景色
            $objPHPExcel->setActiveSheetIndex(0)->getStyle($_char . $tkey)->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
            //$objPHPExcel->setActiveSheetIndex(0)->getStyle($_char .$tkey)->getFill()->getStartColor()->setRGB('FFFF00');

            if ($_mergeColumn>0) {
                //合并列
                $jump+=$_mergeColumn;
                $_charEnd = $charterArr[$k+$jump];
                $objPHPExcel->setActiveSheetIndex(0)->mergeCells($_char . $tkey.':'.$_charEnd . $tkey);
            }
        }
        $objPHPExcel->getActiveSheet()->getRowDimension($tkey)->setRowHeight(30);
        $pk = 4;
        $colorIndex = 0;
        $totalPrice=0;
        if($groupBy=='userDetail'){
            foreach(['normal','senior','luxury'] as $ver){
                $suppArr=$suppliesArr[$ver];
                if(!$suppArr) continue;
                self::setVersionRow($objPHPExcel,$pk,$suppArr,$ver,$attrKeys,$zoneArr,$charterArr,$versionMoney,$totalMoney,$planInfo);
            }
            //价格汇总
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A'.($pk+1), '价格汇总');
            $objPHPExcel->setActiveSheetIndex(0)->getStyle('A'.($pk+1))->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
            $objPHPExcel->setActiveSheetIndex(0)->getStyle('A'.($pk+1))->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
            $objPHPExcel->getActiveSheet()->getRowDimension($pk+1)->setRowHeight(40);
            $objPHPExcel->getActiveSheet()->getStyle('A' . ($pk + 1))->getFont()->getColor()->setRGB('FF0000');
            $objPHPExcel->setActiveSheetIndex(0)->mergeCells("A".($pk + 1).":G".($pk + 1));
            $objPHPExcel->setActiveSheetIndex(0)->getStyle('A' . ($pk + 1))->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
            $objPHPExcel->setActiveSheetIndex(0)->getStyle('A'. ($pk + 1))->getFill()->getStartColor()->setRGB('fdeada');
            $pk++;

            foreach(['normal','senior','luxury'] as $ver){
                if(! $suppArr=$suppliesArr[$ver]) continue;
                $versionName=PlanSupplies::exVersion($ver);
                $vName=$versionName.'价格';
                $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A'.($pk+1), $vName);
                $objPHPExcel->setActiveSheetIndex(0)->getStyle('A'.($pk+1))->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
                $objPHPExcel->setActiveSheetIndex(0)->getStyle('A'.($pk+1))->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                $objPHPExcel->getActiveSheet()->getRowDimension($pk+1)->setRowHeight(40);
                $objPHPExcel->getActiveSheet()->getStyle('A' . ($pk + 1))->getFont()->getColor()->setRGB('FF0000');
                $objPHPExcel->setActiveSheetIndex(0)->mergeCells("A".($pk + 1).":F".($pk + 1));

                $objPHPExcel->setActiveSheetIndex(0)->setCellValue('G'.($pk+1), $totalMoney[$ver]);
                $objPHPExcel->setActiveSheetIndex(0)->getStyle('G'.($pk+1))->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
                $objPHPExcel->setActiveSheetIndex(0)->getStyle('G' . ($pk+1))->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                $objPHPExcel->getActiveSheet()->getRowDimension($pk+1)->setRowHeight(40);
                $objPHPExcel->getActiveSheet()->getStyle('G' . ($pk + 1))->getFont()->getColor()->setRGB('FF0000');
                $pk++;
            }
            foreach(['self','add','wait','del'] as $ver){
                $suppArr=$suppliesArr[$ver];
                if(!$suppArr) continue;
                self::setVersionRow($objPHPExcel,$pk,$suppArr,$ver,$attrKeys,$zoneArr,$charterArr,$versionMoney,$totalMoney,$planInfo);
            }
        }else{
            foreach ($suppliesArr as $ver=>$suppArr) {//分类数组
                $versionName=PlanSupplies::exVersion($ver);
                if ($ver!='normal') {
                    $vName = $ver == 'normal' ? $versionName . '物料' : $versionName . '增加物料';
                    //版本分类
                    $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A' . ($pk + 1), $vName);
                    $objPHPExcel->setActiveSheetIndex(0)->getStyle('A' . ($pk + 1))->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
                    $objPHPExcel->setActiveSheetIndex(0)->getStyle('A' . ($pk + 1))->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                    $objPHPExcel->getActiveSheet()->getRowDimension($pk + 1)->setRowHeight(40);
                    $objPHPExcel->getActiveSheet()->getStyle('A' . ($pk + 1))->getFont()->getColor()->setRGB('FF0000');
                    $objPHPExcel->setActiveSheetIndex(0)->mergeCells("A" . ($pk + 1) . ":I" . ($pk + 1));
                    $pk++;
                }
                foreach ($suppArr as $arr) {//分类数组
                    $pre = $pk + 1;
                    $_row = 0;
                    foreach ($arr as $val) {
                        if (trim($val['title']) == '') continue; //物料名称是空的行跳过
                        $_row++;
                        $jump = 0;
                        foreach ($attrKeys as $k => $_attr) {
                            if ($_attr['field'] != '') {
                                $_value = $val[$_attr['field']];
                                switch ($_attr['field']) {
                                    case 'type':
                                        if($_value==999999){
                                            $_value='其他相关服务';
                                        }elseif($_value==999998){
                                            $_value='工具类';
                                        }else{
                                            $_value=$typeArr[$_value];
                                        }
                                        break;
                                    case 'zone':
                                        $_value = $_value > 0 ? $zoneArr[$_value] : '其他项目';
                                        break;
                                    case 'num':
                                        if($groupBy=='userDetail'){
                                            $_value .= Supplies::exUnits($val['unit']);
                                        }
                                        break;
                                    case 'unit':
                                        $_value = Supplies::exUnits($val['unit']);
                                        break;
                                    case '_desc':
                                        $_value = $_value != '' ? $_value : ($val['size']);
                                        break;
                                    default:
                                        break;
                                }
                            } else {
                                $_value = '';
                            }

                            //设置内容
                            $_char = $charterArr[$k+$jump];
                            $_cell = $_char . ($pk + 1);
                            $_mergeColumn = $_attr['mergeColumn']??0;
                            $_horizontal_center = $_attr['horizontal_center']??true;
                            $objPHPExcel->setActiveSheetIndex(0)->setCellValue($_cell, $_value);
                            //水平垂直居中
                            $objPHPExcel->setActiveSheetIndex(0)->getStyle($_cell)->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
//                            if ($_attr['field'] != 'desc' && $_attr['field'] != 'field') {
                            if ($_horizontal_center) {
                                $objPHPExcel->setActiveSheetIndex(0)->getStyle($_cell)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                            }
                            if ($_mergeColumn>0) {
                                //合并列
                                $jump+=$_mergeColumn;
                                $_charEnd = $charterArr[$k+$jump];
                                $objPHPExcel->setActiveSheetIndex(0)->mergeCells($_cell.':'.$_charEnd . ($pk + 1));
                            }
                        }
                        $totalPrice+=$val['userPrice']*$val['num'];
                        ++$pk;
                        $objPHPExcel->getActiveSheet()->getRowDimension($pk)->setRowHeight(30);
                    }
                    ++$colorIndex;
                    if ($_row > 1) {
                        //合并单元格
                        $objPHPExcel->setActiveSheetIndex(0)->mergeCells('A' . $pre . ':A' . $pk);
                    }
                }
            }
        }
        $styleArray = array(
            'borders' => array(
                'allborders' => array(
                    'style' => PHPExcel_Style_Border::BORDER_THIN
                )
            )
        );
        $objPHPExcel->getActiveSheet()->getStyle('A1:'.$maxChar.($pk))->applyFromArray($styleArray);

        /*
          // 实例化插入图片类
          $objDrawing = new PHPExcel_Worksheet_Drawing();
          // 设置图片路径 切记:只能是本地图片
          $objDrawing->setPath('');
          // 设置图片高度
          $objDrawing->setWidth(200);
          // 设置图片要插入的单元格
          $objDrawing->setCoordinates('A18');
          // 设置图片所在单元格的格式
          $objDrawing->setOffsetX(10);
          $objDrawing->setOffsetY(10);
          $objDrawing->setRotation(0);
          $objDrawing->getShadow()->setVisible(true);
          $objDrawing->getShadow()->setDirection(50);
          $objDrawing->setWorksheet($objPHPExcel->getActiveSheet());
         */


        // Rename worksheet
        $objPHPExcel->getActiveSheet()->setTitle('活动策划公司');
        // Set active sheet index to the first sheet, so Excel opens this as the first sheet
        $objPHPExcel->setActiveSheetIndex(0);
        // Redirect output to a client’s web browser (Excel2007)
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment;filename="' . $filename . '.xlsx"');
        header('Cache-Control: max-age=0');
        // If you're serving to IE 9, then the following may be needed
        header('Cache-Control: max-age=1');
        // If you're serving to IE over SSL, then the following may be needed
        header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
        header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified
        header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
        header('Pragma: public'); // HTTP/1.0
        $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
        $objWriter->save('php://output');

免备案CDN推荐
Akamai
Akamai是全球顶级内容分发网络供应商之一,作为历史最悠久的CDN之一,分布在全球的网络为将近15-30%的网络流量提供服务。

Akamai成立于1998年,因其庞大的全球服务器网络而在竞争对手中脱颖而出,在全球部署了1,400多个网络系统,在超过135个国家拥有超过30万台服务器。

Akamai提供功能丰富的CDN和安全服务,如可靠分发、自适应媒体分发、API加速、云包装器、Ion、mPulse、NetStorage等,这些功能有助于提高整体网站的性能。

它的智能边缘平台(Intelligent Edge Platform)是业内最好的平台之一使用算法来评估流量和拥塞情况,并巧妙地处理和路由数据请求,以帮助提高性能、可用性、安全性和洞察力。

Kona Site Defender可以保护网站免受DDoS攻击和多重僵尸攻击,威胁情报防火墙可以通过卓越的基于信誉的分析和动态欺骗技术发现漏洞,阻止勒索软件劫持网站或云上的关键资产。

不过,作为一家大型CDN提供商,Akamai可能会受到一些限制,不如小型CDN灵活,而且Akamai没有免费计划,他们的定价只有在咨询后才会给出。

KeyCDN
KeyCDN是一个流行的CDN提供商,可以很容易地集成到你的WordPress网站。

用户还可以配置CDN来更改自己的标题,Cookie,Robots.txt以及有关网站的许多其他内容,除此之外,还有一个高质量的DDoS缓解系统和一个全球服务器网络。

KeyCDN一直致力于通过不同的方式来升级和改进其服务,在全球有34个数据中心,一些重要功能包括Gzip压缩、实时报告、即时清除选项、双因素身份验证、DDoS保护等等。

KeyCDN的边缘服务器可以更好地检测访问者的位置,并使用它来调整所使用的缓存设置,这对于根据访问者的位置显示不同内容的网站来说是非常有帮助的。

KeyCDN可以帮助网站比以往更快、更可靠地运行,对于小型企业,博客和其他可能不需要市场上最先进或最强大的CDN的用户来说,这是一个非常实惠的绝佳选择。

他们向客户提供“随用随付”计划,用户只需为你使用的东西付费,不需要输入信用卡号码可以只用自己电子邮件地址在KeyCDN注册一个帐户,就能够免费获得25GB的服务。

Sucuri
Sucuri创立2010年,业务遍布全球20多个国家,拥有超过4万名付费客户,2017年被GoDaddy域名交易网站收购。

Sucuri可防止恶意流量和代码注入,以前只是提供网站防火墙和安全服务,但现在还捆绑了CDN服务。

网站应用防火墙平台是一个基于云的解决方案,可全天候检测可疑活动并防止不断演变的威胁,系统带有DDoS防范功能,可阻止攻击者,确保网站不停机。

借助CDN服务,可以实现智能缓存、高速HTTP/2支持、自动备份、DDoS缓解、负载平衡、GZIP压缩等功能,实现资源优化,从而将加载速度提高一半以上。

无论是WordPress、Magento、Prestashop、Drupal、Jumla还是Tumblr等各种平台都可以使用Sucuri来为自己的网站提供安全保护和加速服务。

Sucuri 没有任何免费计划,起价为每年199.99美元,产品更多是针对那些需要管理网站安全的用户,因此可能不太适合那些更喜欢直接动手操作的用户。

StackPath
StackPath是一个小型CDN,主要服务于北美和欧洲,以其支持CDN web应用防火墙(WAF)的边缘云平台而闻名。

StackPath成立于2015年,服务器主要集中在北美和欧洲,其他地区的边缘服务器更加分散,在35多个市场拥有50多个边缘站点。

它设计良好且易于使用,设置和配置很简单,可以根据地区和其他因素设置自定义配置;如果你运行的网站根据访问者的位置显示不同的内容,这至关重要。

StackPath其超低延迟功能由虚拟机提供支持,虚拟机的速度比竞争对手快2.6倍,端到端web应用程序防火墙,具有威胁识别、DDoS攻击缓解、证书管理和安全分析功能。

基本入门套餐CDN每月费用为25美元,拥有包括高达1TB的带宽,如果需要额外的流量,可以以低至3美分每GB的价格获得,非常适合多格式的数字公司,特别是在视频、游戏和物联网领域。

Amazon CloudFront
Cloudfront是一个受欢迎的CDN,由亚马逊网络服务(AWS)提供支持,于2008年首次推出。

它使用AWS的全球基础设施,包括Amazon S3、Amazon EC2和弹性负载平衡系统,来交付高质量的内容,速度非常快,技术也非常先进。

通过AWS骨干网连接了200多个接入点,提供超低延迟性能,还集成了AWS Shield Advanced和AWS Web应用防火墙(WAF),同时与现有的AWS服务和开发人员工具集成。

CloudFront可以满足任何类型的网站的需求,利用亚马逊网络服务(AWS)的大规模优势,帮助全球所有类型的客户网站运行得更快、更可靠。

CloudFront有一个开发人员友好的环境,非常适合那些需要深度定制和可编程边缘计算的人,因此它更适合程序员或开发人员,而不是初学者。

CloudFront的定价结构非常复杂,可能需要自定义报价,将根据使用的数据量为大多数服务付费,相比于市场上同类产品的价格要更高,技术支持服务也要进行额外付费。

CacheFly
CacheFly是市场上最古老的CDN提供商之一,专注于提供视频,同时也提供标准的内容交付服务。

在全球拥有50多个边缘计算节点,服务于80多个国家的3500多个客户,兼容AWS的S3、Azure存储和Google云存储的多云环境。

你可以使用他们的服务进行视频流、播客流和文件优化,支持对网站流量、内容速度、用户下载等进行实时报告和历史分析。

CacheFly是最快最可靠的CDN之一,简单的仪表板可以轻松管理一切,还提供DDoS和恶意软件保护等安全功能,以保护网站免受黑客攻击。

与其他流行的CDN提供商相比,CacheFly的CDN产品非常昂贵,他们的基本付费方案价格为每月295美元,这并不适合大多数用户的在线业务。

CDN77
CDN77是一个内容交付网络提供商,成立于2011年,专注于实时和点播用例。

在六大洲拥有35个数据节点,能够在任何位置实现低延迟交付,可以处理一些最复杂的内容需求,并在发生重大规模攻击时保护用户内容。

CDN77集成WordPress,Magento,Drupal,Joomla,SocialEngine,PrestaShop,允许通过HTTPS进行安全连接,有由机器学习提供支持的专有DDoS保护功能。

CDN777的实时分析每五分钟更新一次,会对流量、带宽、使用的数据中心、成本、账单进行广泛的报告,与任何托管环境兼容,并附带自己的基于云的CDN存储。

CDN77主要针对企业和大型内容提供商,但也为个人网站提供CDN服务,非常适合视频点播和直播平台,起步价格为每月199美元。

Bunny.net
Bunny.net是市场上最好的CDN服务之一,速度非常快,是一个专门的CDN提供商。

在世界各地都有数据中心,分布在6大洲和70多个国家,为小型企业和开发人员提供非常实惠的定价计划。

直观的控制面板提供了详细的见解、报告使用情况和所有相关统计数据,并且有99.99%的正常运行时间保证。

可以在CMS中非常容易地使用,内置集成与广泛使用的内容管理系统,如WordPress,Joomla,Magento,Drupal,Shopware。

Bunny.net也有一套图像,视频和文件优化工具,视频流选项和一些安全功能,还允许添加SSL证书或使用共享SSL证书,以确保通过SSL/HTTPS提供缓存内容。