作者归档:D丶H

关于D丶H

PHP学习开发交流,记录学习生活的点滴

PHP RabbitMQ 配置以及使用

本文主要介绍vm 虚拟机linux centos下安装,
CentOS Linux release 7.2.1511 (Core)
php环境PHP 7.0.7 (cli) (built: Sep  5 2016 16:43:59) ( NTS )

依赖包安装

yum install ncurses-devel unixODBC unixODBC-devel

erlang环境

wget http://erlang.org/download/otp_src_18.1.tar.gz
tar -zxvf otp_src_18.1.tar.gz
cd otp_src_18.1
./configure –prefix=/usr/local/erlang
make
make install
# 配置erlang环境变量
vim /etc/profile
# 增加内容:
export PATH=”$PATH:/usr/local/erlang/bin”
# 保存退出,并刷新变量
source /etc/profile
# 测试erlang是否安装成功
# 安装完成以后,执行erl看是否能打开eshell,用’halt().’退出,注意后面的点号,那是erlang的结束符。
[root@localhost src]# erl

halt(). 退出或者直接Ctrl+C

安装rabbitmq依赖文件,安装rabbitmq

# 安装rabbitmq依赖包
yum install xmlto

# 安装rabbitmq服务端
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.5.7/rabbitmq-server-3.5.7.tar.gz
tar -zxvf rabbitmq-server-3.5.7.tar.gz
cd rabbitmq-server-3.5.7/
make
make install TARGET_DIR=/usr/local/rabbitmq SBIN_DIR=/usr/local/rabbitmq/sbin MAN_DIR=/usr/local/rabbitmq/man DOC_INSTALL_DIR=/usr/local/rabbitmq/doc

# 配置hosts
vim /etc/hosts
# 增加一行内容
# 当前IP地址   绑定HOSTNAME名称(vim /etc/sysconfig/network)
192.168.115.128 localhost.localdomain

rabbitmq启动 查看状态 关闭 命令

/usr/local/rabbitmq/sbin/rabbitmq-server start & 启动rabbitmq
/usr/local/rabbitmq/sbin/rabbitmqctl status 查看状态
/usr/local/rabbitmq/sbin/rabbitmqctl stop 关闭rabbitmq

启用管理插件

/usr/local/rabbitmq/sbin/rabbitmq-plugins list 查看插件列表
/usr/local/rabbitmq/sbin/rabbitmq-plugins enable rabbitmq_management  (启用插件)
/usr/local/rabbitmq/sbin/rabbitmq-plugins disable rabbitmq_management (禁用插件)

配置可视化RabbitMQ管理界面

/usr/local/rabbitmq/sbin/rabbitmq-plugins enable rabbitmq_management,这样就可以添加可视化插件了。

查看可视化插件是否成功:

由于guest用户只能本机(localhost或127.0.0.1)访问,所以在linux上的还需要配置添加一个其他的用户名,以及对该用户名进行授权,才可以用web 的方式进行访问。

在web浏览器中,输入自己的ip地址和端口号访问,如:http://192.168.115.128:15672/

输入账号: admin  密码: admin

就可以登录查看rabbitmq里的资源信息。

这里可以先简单的输入以下的命令,添加admin用户,及对admin用户进行授权,使其可以用web的方式进行访问。

[root@iZ23x0cj5yiZ ~]# rabbitmqctl add_user admin admin

[root@iZ23x0cj5yiZ ~]# rabbitmqctl set_user_tags admin administrator

[root@iZ23x0cj5yiZ ~]# rabbitmqctl set_permissions -p / admin ‘.*’ ‘.*’ ‘.*’

[root@iZ23x0cj5yiZ ~]# rabbitmqctl list_permissions

添加admin用户及授权之后,就可以用ip的形式进行访问了。

# 如果有iptables
vim /etc/sysconfig/iptables

# 增加一下内容
-A INPUT -m state –state NEW -m tcp -p tcp –dport 15672 -j ACCEPT

# 重启动iptable
service iptables restart

开机自启动配置

#!/bin/sh
#start rabbitMq
sudo /usr/local/rabbitmq/sbin/rabbitmq-server & > /usr/local/rabbitmq/logs/rabbitmq.log 2>&1

相关配置

hostname mq        // 设置hostname名称,直接linux运行吧

RabbitMQ PHP扩展安装

# 安装rabbitmq-c依赖包
yum install libtool autoconf

# 安装rabbitmq-c ( 最好下载 0.5的,0.6安装可能会报错)
# 版本下载:https://github.com/alanxz/rabbitmq-c/releases/tag/v0.5.0
wget https://github.com/alanxz/rabbitmq-c/releases/download/v0.5.0/rabbitmq-c-0.5.0.tar.gz
tar -zxvf v0.5.0
cd rabbitmq-c-0.5.0/
autoreconf -i
./configure –prefix=/usr/local/rabbitmq-c
make
make install

# 安装PHP扩展 amqp
wget http://pecl.php.net/get/amqp-1.9.3.tgz
tar -zxvf amqp-1.9.3.tgz
cd amqp-1.9.3
/usr/local/php/bin/phpize
./configure –with-php-config=/usr/local/php/bin/php-config –with-amqp –with-librabbitmq-dir=/usr/local/rabbitmq-c
make
make install

# 编辑php.ini文件,增加amqp扩展支持
vim /usr/local/php/etc/php.ini
# 增加下面内容
extension=amqp.so
# 重启php-fpm
/etc/init.d/php-fpm restart

查看phpinfo

 

 

 

 

 

创建配置文件(看其他介绍忽略这两个配置)

#创建配置文件
#config文件路径/usr/local/rabbitmq/sbin/rabbitmq.config
#vm_memory_high_watermark 内存低水位线,若低于该水位线,则开启流控机制,阻止所有请求,默认值是0.4,即内存总量的40%,
#vm_memory_high_watermark_paging_ratio 内存低水位线的多少百分比开始通过写入磁盘文件来释放内存

vi /usr/rabbitmq/sbin/rabbitmq.config 添加

[
{rabbit, [{vm_memory_high_watermark_paging_ratio, 0.75},
{vm_memory_high_watermark, 0.7}]}
].

#创建环境文件
cat /usr/local/rabbitmq/sbin/rabbitmq-defaults
#查看conf配置地址
#我的是 CONF_ENV_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq-env.conf
[这里修改配置文件的时候,建议先关闭rabbitmq /usr/local/rabbitmq/sbin/rabbitmqctl stop]
cd /etc
mkdir rabbitmq
vi /etc/rabbitmq/rabbitmq-env.conf
#输入
RABBITMQ_NODENAME=Test-240088 #节点名称
RABBITMQ_NODE_IP_ADDRESS=127.0.0.1 #监听IP
RABBITMQ_NODE_PORT=5672 #监听端口

#启动

/usr/local/rabbitmq/sbin/rabbitmq-server start &

【以下php测试脚本,可以cli执行也可以直接浏览器,其中host根据实际情况修改】
php的server端脚本
<?php
$routingkey=’testkey’;
//设置你的连接
$conn_args = array(‘host’ => ‘localhost’, ‘port’ => ‘5672’, ‘login’ => ‘guest’, ‘password’ => ‘guest’);
$conn = new AMQPConnection($conn_args);

if ($conn->connect()) {
echo “connect  success \n”;
}
else {
echo “Cannot connect to the amqp\n “;
}
//创建channel
$channel = new AMQPChannel($conn);
//创建exchange
$ex = new AMQPExchange($channel);
$ex->setName(‘exchangetest’);//创建名字
$ex->setType(AMQP_EX_TYPE_DIRECT);
$ex->setFlags(AMQP_DURABLE);
echo “exchangetest status:”.$ex->declareExchange();
echo “\n”;
for($i=0;$i<10;$i++){
$ex->publish(json_encode(array(‘This is Message ‘.$i)),$routingkey);
}
php客户端脚本
<?php
$bindingkey=’testkey’;
//连接RabbitMQ
$conn_args = array( ‘host’=>’localhost’ , ‘port’=> ‘5672’, ‘login’=>’guest’ , ‘password’=> ‘guest’,’vhost’ =>’/’);
$conn = new AMQPConnection($conn_args);
if ($conn->connect()) {
echo “connect  success \n”;
}
else {
echo “Cannot connect to the amqp\n “;
}
//设置queue名称,使用exchange,绑定routingkey
$channel = new AMQPChannel($conn);
$q = new AMQPQueue($channel);
$q->setName(‘queuetest’);
$q->setFlags(AMQP_DURABLE);
$q->declare();
$q->bind(‘exchangetest’,$bindingkey);
//消息获取
$messages = $q->get(AMQP_AUTOACK) ;
if ($messages){
var_dump(json_decode($messages->getBody(), true ));

//没运行一次就会获取新的消息
}
$conn->disconnect();

laravel5.0在php7.0下异常解决

FatalErrorException in Handler.php line 25:

Uncaught TypeError: Argument 1 passed to App\Exceptions\Handler::report() must be an instance of Exception, instance of Error given, called in vendor\laravel\framework\src\Illuminate\Foundation\Bootstrap\HandleExceptions.php on line 73 and defined in app\Exceptions\Handler.php:25

Stack trace:
#0 vendor\laravel\framework\src\Illuminate\Foundation\Bootstrap\HandleExceptions.php(73): App\Exceptions\Handler->report(Object(Error))
#1 [internal function]: Illuminate\Foundation\Bootstrap\HandleExceptions->handleException(Object(Error))
#2 {main}
thrown

 

laravel5升级php7.0后报以上错误,

原因:PHP7的改动中,影响比较大的,包括异常处理。PHP7实现了一个全局的throwable接口,原来的Exception和部分Error都实现了这个接口(interface), 以接口的方式定义了异常的继承结构。于是,PHP7中更多的Error变为可捕获的Exception返回给开发者,如果不进行捕获则为Error,如果捕获就变为一个可在程序内处理的Exception。这些可被捕获的Error通常都是不会对程序造成致命伤害的Error,例如函数不存

 

解决办法:

vendor\laravel\framework\src\Illuminate\Foundation\Bootstrap\HandleExceptions.php

引入

use Symfony\Component\Debug\Exception\FatalErrorException;

然后在handleException使用大概73行

if (! $e instanceof Exception) {
    $e = new FatalThrowableError($e);
}

加入后如下

public function handleException($e)
{
    if (! $e instanceof Exception) {
        $e = new FatalThrowableError($e);
    }

    $this->getExceptionHandler()->report($e);

    if ($this->app->runningInConsole()) {
        $this->renderForConsole($e);
    } else {
        $this->renderHttpResponse($e);
    }
}

php图像处理,php图像裁剪

PHP图片处理库Grafika
Grafika是一个PHP图像处理库,是基于Imagick和GD,可以用于改变图片大小,剪裁,比较,添加水印等等功能。还有感知哈希,高级图像过滤,绘制贝塞尔曲线等功能,可谓非常强大。

缩略图的速度非常快,质量非常高
支持智能剪裁
很好的支持GIF图片
5种缩略图模式
图像对比功能
图像高级过滤功能
图像混合
其他图像处理库支持的API基本都支持

安装下载

1、直接下载:

Grafika的官网Github地址

2、composer:

composer require kosinix/grafika:dev-master –prefer-dist

环境需求

PHP >= 5.3,当然官方推荐php7
GD库 >= 2.0版本
Imagick最好(不强求)>=3.3.0 , ImageMagick >= 6.5.3

 

以下记录几篇国内翻译的比较好的文档地址

https://segmentfault.com/a/1190000007415756

 

官网下载地址

https://kosinix.github.io/grafika/index.html

PHP内置ZipArchive添加文件至压缩包zip

PHP内置ZipArchive添加文件至压缩包,PHP5.6 使用自带ZipArchive实现文件夹以及文件的压缩
$zip = new ZipArchive();
$zipfile = '1.zip';
$addfile = 'test\\';
if (file_exists($zipfile)) {
unlink($zipfile);
}
if(!file_exists($addfile)){
echo 'no add file';
}
$zip->open($zipfile, ZipArchive::CREATE);
$allFile = getAllFile($addfile);
foreach ($allFile as $allfiles) {
$zip->addFile($allfiles);
}
$zip->close();

function getAllFile($file, $fileRes = [])
{
if (!file_exists($file)) {
return [];
}
$dir = opendir($file);
while (false !== ($path = readdir($dir))) {
if ($path != '.' && $path != '..') {
if (is_dir($file . $path)) {
$fileRes = getAllFile($file . $path . '\\', $fileRes);
} else {
$fileRes[] = $file . $path;
}
}
}
return $fileRes;

}

实现添加文件夹内套文件夹及文件

Mysql主从服务配置

Mysql主从服务配置

操作实例两台服务器
Win7 mysql5.5.*
VM虚拟机 Centos7 lnmp2 mysql 5.5.*

1.主服务器配置

修改主服务器mysql配置文件
windows下mysql配置文件名称my.ini
添加或者修改
log-bin=mysql-bin
server-id=1
查看server-id可以执行sql语句
show variables like ‘server_id’;
显示结果
+—————+——-+
| Variable_name | Value |
+—————+——-+
| server_id     | 1     |
+—————+——-+

主服务器上执行sql语句创建slave帐户并授权slave:

GRANT REPLICATION SLAVE ON *.* to ‘slave’@’%’ identified by ‘123’;
这里可以指定从服务器的IP地址,先用%允许所有远程访问

登录主服务器的mysql查看master状态

mysql> show master status;
+——————+———-+————–+——————+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000004 |      107 |              |                  |
+——————+———-+————–+——————+
1 row in set (0.00 sec)

记录当前File,Position的值

重启主服务器mysql服务

2.从服务器配置

修改mysql配置文件,Lnmp的mysql配置文件位于/etc/my.cnf

添加或者修改server-id,不能于主服务器的server-id冲突

server-id=2

重启从服务器mysql服务

登录终端执行sql语句
1.停止slave:
stop slave;
2.执行master语句:
change master to master_host=’主服务器IP地址’,master_port=’3306′,master_user=’slave’,master_password=’123′,
master_log_file=’mysql-bin.000001′,master_log_pos=107;
3.启动slave
start slave

4.查看slave状态
show slave status \G

*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.168
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 107
Relay_Log_File: localhost-relay-bin.000015
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

Slave_IO_Running,Slave_SQL_Running如果任何一个No都是失败的,具体错误信息可以查看mysql错误日志

这里完成了简单mysql主从配置,可以在主服务器创建数据库表看看效果,
搭配读写分离的PHP框架开始装逼飞吧

Mysql开启慢查询日志

Mysql开启慢查询日志,查看MYSQL服务器的慢查询状态是否开启.执行如下命令:

mysql> show variables  like ‘%slow%’;

+———————+————————————————-+
| Variable_name       | Value                                           |
+———————+————————————————-+
| log_slow_queries    | OFF                                             |
| slow_launch_time    | 2                                               |
| slow_query_log      | OFF                                             |
| slow_query_log_file | D:\MySQL\data\I9GG-20160602NR-slow.log |
+———————+————————————————-+

看到当前log_slow_queries状态为OFF

开启慢查询:

找到mysql的配置文件 windows下my.ini linux下my.cnf

在[mysqld]中添加如下信息:

[mysqld]

log-slow-queries=”D:\MySQL\data\I9GG-20160602NR-slow.log ”

#代表MYSQL慢查询的日志, 此目录文件一定要有写权限;
long_query_time = 4

#最长执行时间.
log-queries-not-using-indexes

#没有使用到索引的查询也将被记录在日志中

配置好以后重新启动MYSQL服务
mysql> show variables  like ‘%slow%’;

+———————+————————————+
| Variable_name       | Value                              |
+———————+————————————+
| log_slow_queries    | ON                                 |
| slow_launch_time    | 2                                  |
| slow_query_log      | ON                                 |
| slow_query_log_file | D:\tmp\log\mysql_slow.log |
+———————+————————————+
4 rows in set (0.01 sec)

Ecshop几个Xss漏洞修复

Ecshop几个相关Xss漏洞
Ecshop pages.lbi.php Xss漏洞,search.php注入漏洞,Ecshop version XSS漏洞

1.Ecshop pages.lbi.php Xss漏洞

先来分析这个漏洞的原因:

直接访问temp/compiled/pages.lbi.php时,浏览源文件,会发现如下代码:

<form action=”temp/compiled/pages.lbi.php” method=”get”>

显然这个form是不完全的。当构造这样的url访问时,会造成在客户端执行代码:

temp/compiled/pages.lbi.php/”</form><sCripT>alert(/cfreer/)</scRipt>

很显然,这个漏洞的原理就是闭合了这个form再在客户端执行javascript.

然后分析出现不闭合form的原因,打开page.lbi.php文件,可以看到如下代码

<form action=”<?php echo $_SERVER[‘PHP_SELF’]; ?>” method=”get”> <?php if ($this->_var[‘pager’][‘styleid’] == 0): ?>

这里执行$this的时候就出现错误了,,因为没有进行template的初始化。

既然找到原因了,下面给出解决办法:

打开page.lbi文件,在第二行插入如下代码:

<?php if (!defined(‘IN_ECS’)) { die(‘Hacking attempt’); } ?>

2.search.php注入漏洞

search.php
大概300 源
if (is_not_null($val) )
修改为
if (is_not_null($val) && is_numeric($key))
就可以了

3.Ecshop version XSS漏洞

打开/admin/receive.php文件中,搜索如下代码:

$version=$_GET[‘version’];

修改为如下代码:

$version=htmlspecialchars($_GET[‘version’]);

PhpExcel中文帮助手册PhpExcel使用方法

PhpExcel中文帮助手册PhpExcel使用方法,总结一些常用的方法,方便大家使用

 

引入方法
下面是总结的几个使用方法
include 'PHPExcel.php';
include 'PHPExcel/Writer/Excel2007.php';
//或者include 'PHPExcel/Writer/Excel5.php'; 用于输出.xls的

创建一个excel

$objPHPExcel = new PHPExcel();

保存excel—2007格式

$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
//或者$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel); 非2007格式
$objWriter->save("xxx.xlsx");

直接输出到浏览器

$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
header("Pragma: public");
header("Expires: 0″);
header("Cache-Control:must-revalidate, post-check=0, pre-check=0″);
header("Content-Type:application/force-download");
header("Content-Type:application/vnd.ms-execl");
header("Content-Type:application/octet-stream");
header("Content-Type:application/download");;
header('Content-Disposition:attachment;filename="resume.xls"');
header("Content-Transfer-Encoding:binary");
$objWriter->save('php://output');

——————————————————————————————————————–
设置excel的属性:
创建人

$objPHPExcel->getProperties()->setCreator("Maarten Balliauw");

最后修改人

$objPHPExcel->getProperties()->setLastModifiedBy("Maarten Balliauw");

标题

$objPHPExcel->getProperties()->setTitle("Office 2007 XLSX Test Document");

题目

$objPHPExcel->getProperties()->setSubject("Office 2007 XLSX Test Document");

描述

$objPHPExcel->getProperties()->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.");
关键字

$objPHPExcel->getProperties()->setKeywords("office 2007 openxml php");

种类

$objPHPExcel->getProperties()->setCategory("Test result file");

——————————————————————————————————————–
设置当前的sheet

$objPHPExcel->setActiveSheetIndex(0);

设置sheet的name

$objPHPExcel->getActiveSheet()->setTitle('Simple');

设置单元格的值

$objPHPExcel->getActiveSheet()->setCellValue('A1', 'String');
$objPHPExcel->getActiveSheet()->setCellValue('A2', 12);
$objPHPExcel->getActiveSheet()->setCellValue('A3', true);
$objPHPExcel->getActiveSheet()->setCellValue('C5', '=SUM(C2:C4)');
$objPHPExcel->getActiveSheet()->setCellValue('B8', '=MIN(B2:C5)');

合并单元格

$objPHPExcel->getActiveSheet()->mergeCells('A18:E22');//注意区间就行比如合并A1 B1 C1 D1写法A1:D1

分离单元格

$objPHPExcel->getActiveSheet()->unmergeCells('A28:B28');

保护cell

$objPHPExcel->getActiveSheet()->getProtection()->setSheet(true); // Needs to be set to true in order to enable any worksheet protection!
$objPHPExcel->getActiveSheet()->protectCells('A3:E13', 'PHPExcel');

设置格式

// Set cell number formats
echo date('H:i:s') . " Set cell number formats\n";
$objPHPExcel->getActiveSheet()->getStyle('E4')->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_EUR_SIMPLE);
$objPHPExcel->getActiveSheet()->duplicateStyle( $objPHPExcel->getActiveSheet()->getStyle('E4'), 'E5:E13' );

设置宽width

// Set column widths
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);
$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(12);

设置font

$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setName('Candara');
$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setSize(20);
$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setBold(true);
$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE);
$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_WHITE);
$objPHPExcel->getActiveSheet()->getStyle('E1')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_WHITE);
$objPHPExcel->getActiveSheet()->getStyle('D13')->getFont()->setBold(true);
$objPHPExcel->getActiveSheet()->getStyle('E13')->getFont()->setBold(true);

设置align

$objPHPExcel->getActiveSheet()->getStyle('D11')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
$objPHPExcel->getActiveSheet()->getStyle('D12')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
$objPHPExcel->getActiveSheet()->getStyle('D13')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
$objPHPExcel->getActiveSheet()->getStyle('A18')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY);

垂直居中

$objPHPExcel->getActiveSheet()->getStyle('A18')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);

设置column的border

$objPHPExcel->getActiveSheet()->getStyle('A4')->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle('B4')->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle('C4')->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle('D4')->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle('E4')->getBorders()->getTop()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);

设置border的color

$objPHPExcel->getActiveSheet()->getStyle('D13')->getBorders()->getLeft()->getColor()->setARGB('FF993300');
$objPHPExcel->getActiveSheet()->getStyle('D13')->getBorders()->getTop()->getColor()->setARGB('FF993300');
$objPHPExcel->getActiveSheet()->getStyle('D13')->getBorders()->getBottom()->getColor()->setARGB('FF993300');
$objPHPExcel->getActiveSheet()->getStyle('E13')->getBorders()->getTop()->getColor()->setARGB('FF993300');
$objPHPExcel->getActiveSheet()->getStyle('E13')->getBorders()->getBottom()->getColor()->setARGB('FF993300');
$objPHPExcel->getActiveSheet()->getStyle('E13')->getBorders()->getRight()->getColor()->setARGB('FF993300');

设置填充颜色

$objPHPExcel->getActiveSheet()->getStyle('A1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
$objPHPExcel->getActiveSheet()->getStyle('A1')->getFill()->getStartColor()->setARGB('FF808080');
$objPHPExcel->getActiveSheet()->getStyle('B1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
$objPHPExcel->getActiveSheet()->getStyle('B1')->getFill()->getStartColor()->setARGB('FF808080');

加图片

$objDrawing = new PHPExcel_Worksheet_Drawing();
$objDrawing->setName('Logo');
$objDrawing->setDescription('Logo');
$objDrawing->setPath('./images/officelogo.jpg');
$objDrawing->setHeight(36);
$objDrawing->setWorksheet($objPHPExcel->getActiveSheet());
$objDrawing = new PHPExcel_Worksheet_Drawing();
$objDrawing->setName('Paid');
$objDrawing->setDescription('Paid');
$objDrawing->setPath('./images/paid.png');
$objDrawing->setCoordinates('B15');
$objDrawing->setOffsetX(110);
$objDrawing->setRotation(25);
$objDrawing->getShadow()->setVisible(true);
$objDrawing->getShadow()->setDirection(45);
$objDrawing->setWorksheet($objPHPExcel->getActiveSheet());

处理中文输出问题
需要将字符串转化为UTF-8编码,才能正常输出,否则中文字符将输出为空白,如下处理:

$str = iconv('gb2312', 'utf-8', $str);

或者你可以写一个函数专门处理中文字符串:

function convertUTF8($str)
{
if(empty($str)) return '';
return iconv('gb2312', 'utf-8', $str);
}

从数据库读取数据如:

$db = new Mysql($dbconfig);
$sql = "SELECT * FROM 表名";
$row = $db->GetAll($sql); // $row 为二维数组
$count = count($row);
for ($i = 2; $i <= $count+1; $i++) { $objPHPExcel->getActiveSheet()->setCellValue('A' . $i, convertUTF8($row[$i-2][1]));
$objPHPExcel->getActiveSheet()->setCellValue('B' . $i, convertUTF8($row[$i-2][2]));
$objPHPExcel->getActiveSheet()->setCellValue('C' . $i, convertUTF8($row[$i-2][3]));
$objPHPExcel->getActiveSheet()->setCellValue('D' . $i, convertUTF8($row[$i-2][4]));
$objPHPExcel->getActiveSheet()->setCellValue('E' . $i, convertUTF8(date("Y-m-d", $row[$i-2][5])));
$objPHPExcel->getActiveSheet()->setCellValue('F' . $i, convertUTF8($row[$i-2][6]));
$objPHPExcel->getActiveSheet()->setCellValue('G' . $i, convertUTF8($row[$i-2][7]));
$objPHPExcel->getActiveSheet()->setCellValue('H' . $i, convertUTF8($row[$i-2][8]));
}

在默认sheet后,创建一个worksheet

echo date('H:i:s') . " Create new Worksheet object\n";
$objPHPExcel->createSheet();
$objWriter = PHPExcel_IOFactory::createWriter($objExcel, 'Excel5');
$objWriter-save('php://output');