javascript中浅拷贝和深拷贝的区别

今天在看阮一峰大神的ECMAScript 6入门的电子版,其中在第9节对象的扩展讲到了对象的扩展运算符Object.getOwnPropertyDescriptors方法,里面有关于Object对象的属性拷贝一栏,非常感兴趣,百度google后发现,在前端工程师的面试题中也经常会问到这个知识点,于是在网上搜集整理了些摘要,数据来源为知乎SegmentFault,对应的作者都是JerryZou,传送门:http://jerryzou.com/posts/dive-into-deep-clone-in-javascript/


深拷贝和浅拷贝区别

浅拷贝只复制一层对象的属性,而深拷贝则递归复制了所有层级
深拷贝必须用到递归

首先深复制和浅复制只针对像 Object, Array 这样的复杂对象的。简单来说,浅复制只复制一层对象的属性,而深复制则递归复制了所有层级
抛开jQuery,上代码例子。下面是一个简单的浅复制实现:

1
2
3
4
5
6
7
8
9
10
11
12
var obj = { a:1, arr: [2,3] };
var shadowObj = shadowCopy(obj);

function shadowCopy(src) {
var dst = {};
for (var prop in src) {
if (src.hasOwnProperty(prop)) {
dst[prop] = src[prop];
}
}
return dst;
}

因为浅复制只会将对象的各个属性进行依次复制,并不会进行递归复制,而 JavaScript 存储对象都是存地址的,所以浅复制会导致 obj.arrshadowObj.arr指向同一块内存地址,大概的示意图如下。

导致的结果就是:

1
2
shadowObj.arr[1] = 5;
obj.arr[1] // = 5

而深复制则不同,它不仅将原对象的各个属性逐个复制出去,而且将原对象各个属性所包含的对象也依次采用深复制的方法递归复制到新对象上。这就不会存在上面 obj 和 shadowObj 的 arr 属性指向同一个对象的问题。

1
2
var obj = { a:1, arr: [1,2] };
var obj2 = deepCopy(obj);

结果如下面的示意图所示:

需要注意的是,如果对象比较大,层级也比较多,深复制会带来性能上的问题。在遇到需要采用深复制的场景时,可以考虑有没有其他替代的方案。在实际的应用场景中,也是浅复制更为常用。

如何实现深拷贝

要实现深复制有很多办法,比如最简单的办法有:

1
var cloneObj = JSON.parse(JSON.stringify(obj));

上面这种方法好处是非常简单易用,但是坏处也显而易见,这会抛弃对象的constructor,也就是深复制之后,无论这个对象原本的构造函数是什么,在深复制之后都会变成Object。另外诸如RegExp对象是无法通过这种方式深复制的。

所以这里我将介绍一种,我自认为很优美的深复制方法,当然可能也存在问题。如果你发现了我的实现方法有什么问题,请及时让我知道~

先决条件:

  1. 对于任何对象,它可能的类型有Boolean, Number, Date, String, RegExp, Array 以及 Object(所有自定义的对象全都继承于Object)
  2. 我们必须保留对象的构造函数信息(从而使新对象可以使用定义在prototype上的函数)

最重要的一个函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Object.prototype.clone = function () {
var Constructor = this.constructor;
var obj = new Constructor();
for (var attr in this) {
if (this.hasOwnProperty(attr)) {
if (typeof(this[attr]) !== "function") {
if (this[attr] === null) {
obj[attr] = null;
}
else {
obj[attr] = this[attr].clone();
}
}
}
}
return obj;
};

定义在Object.prototype上的clone()函数是整个方法的核心,对于任意一个非js预定义的对象,都会调用这个函数。而对于所有js预定义的对象,如Number,Array等,我们就要实现一个辅助clone()函数来实现完整的克隆过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/* Method of Array*/
Array.prototype.clone = function () {
var thisArr = this.valueOf();
var newArr = [];
for (var i=0; i<thisArr.length; i++) {
newArr.push(thisArr[i].clone());
}
return newArr;
};
/* Method of Boolean, Number, String*/
Boolean.prototype.clone = function() { return this.valueOf(); };
Number.prototype.clone = function() { return this.valueOf(); };
String.prototype.clone = function() { return this.valueOf(); };
/* Method of Date*/
Date.prototype.clone = function() { return new Date(this.valueOf()); };
/* Method of RegExp*/
RegExp.prototype.clone = function() {
var pattern = this.valueOf();
var flags = '';
flags += pattern.global ? 'g' : '';
flags += pattern.ignoreCase ? 'i' : '';
flags += pattern.multiline ? 'm' : '';
return new RegExp(pattern.source, flags);
};

可能直接定义在预定义对象的方法上,让人感觉会有些问题。但在我看来这是一种优美的实现方式。

以上内容有删改

转载请注明: http://cometlj.github.io/blog/the-difference-between-shallow-copy-and-deep-in-javascript.html

dedecms5-7二次开发之如何从dedecms5-7静态页中获取模型参数信息

博主在二次开发的时候,发现在dedecms生成静态页后,就无法通过$_GET[‘id’]形式获取参数的值了,比如在文章内容页模版里面通过

1
2
3
{dede:php}
echo $_GET['id'];
{/dede:php}

这样动态访问页面里面是能获取的,例如/plus/view.php?id=123这样能获取到,但是静态页生成的话,是不认的。后来在dede官方论坛找到了解决方法,只要在模板中使用这样语句

1
2
3
4
5
{dede:php}
$thisid = $refObj->Fields['id'];//同理可以设置不同的key,对应的附加表自定义字段等
$sql ="select * from dede_archives where id=$thisid";
$row = $dsql-&gt;GetOne($sql);
{/dede:php}

有兴趣的同学可以把$refObj打印出来看看,里面包含很多有用的信息,如此,通过$refObj对象的Fields方法,就能实现获取参数的值了,同理,自定义模型的附加表字段也可以通过这种形式获取,其他的就发挥想象,通过万能的sql解决剩下问题把。

转载请注明: http://cometlj.github.io/blog/dedecms57-secondary-development-how-to-get-model-parameter-information-from-static-page.html

对jquery-ajax的返回值进行过滤筛选的方法

博主在开发的时候,前端通过ajax返回的一个html字符串,但是需要对其进行筛选,找到可操作的dom,结果弄了半天返回的都是undefined,无法筛选出来,苦找了半天,看到一篇网上的文章。原理是使用filter(expr)进行

1
var stext = $(data).filter(‘#content').html();

data是通过ajax取回的内容,我想进行筛选,只要取回内容里的ID为content的部分。
这样的写法在IE里一切正常,不知道为什么在Firefox里就不行,用Firebug来进行查找错误,提示返回值是undefined

这个问题已经自己解决!
不知道有没有人遇到同样的问题,但我想还是分享一下自己的经验!
用filter 进行筛选的时候,固定的数据如 march.hu 所说的那个(var data = “

第一段

第二段

“;),这种没有关系,但用AJAX取回动态数据进行筛选的时候,必须同时指定标签类型和 ID,才能正常进行筛选,要不然在Firefox和Chrome下会出错
错误的:
1
var stext = $(data).filter('#content').html();

正确的:

1
var stext = $(data).filter('div#content').html();

看来JS基础知识还是重要啊

转载请注明: http://cometlj.github.io/blog/the-jqueryajax-return-value-filtering-filter-method.html

Github-Pages-Hexo-搭建博客遇到的问题及解决

本文基本是以Mac OS作为环境搭建,有部分摘自
这篇文章

这里对作者表示感谢!

Github Pages环境搭建

这几天恶补了下Git基础知识,推荐看 廖雪峰的Git基础教程,说的比较通俗,比较浅显易懂,看完后最好自己动手实践下是最好的。下面主要说说在链接Github中遇到的问题和解决方式

如何添加Git代理

Git 目前支持的三种协议 git://ssh://http://,其代理配置各不相同:core.gitproxy 用于 git:// 协议,http.proxy 用于 http:// 协议,ssh:// 协议的代理需要配置 ssh 的 ProxyCommand 参数。

git协议代理

建立 /path/to/socks5proxywrapper 文件,使用 https://bitbucket.org/gotoh/connect 工具进行代理的转换,各发行版一般打包为 proxy-connect 或者 connect-proxy。

/path/to 可以为你的本机路径,比如/usr/local/bin

1
2
#!/bin/sh
connect -S 127.0.0.1:7070 "$@"

配置git

1
git config --global core.gitproxy /path/to/socks5proxywrapper

或者设置成环境变量

1
export GIT_PROXY_COMMAND="/path/to/socks5proxywrapper"

HTTP协议代理配置

http协议的配置比较简单,使用场景一般有2种:

  • 内网 到 外网的代理
  • Github无法访问被墙了
    内网到外网的代理比较简单,只要一个内外网通吃的服务器做个跳板即可,下面主要说下Github扶墙的方法。本人使用的是Lantern
  1. Lantern代理
1
2
git config --global http.proxy http://127.0.0.1:8787
git config --global https.proxy https://127.0.0.1:8787

SSH协议代理配置

博主购买的Bandwagon的VPS做的Shawdowsocks做的socks5代理

主要方法:使用polipo做映射,将socks5->http来进行处理,如果使用的是Lantern,道理是一样的,只要将本地端口改成8787即可。然后通过corkscrew进行http->ssh的转换,实现SSH协议代理

  1. 首先安装Homebrew,具体方法见这里,如果已经安装过的请看下一步

  2. 安装corkscrew,corkscrew是一个能让你通过http代理,使用SSH客户端进行SSH隧道连接的软件

1
brew install corkscrew
  1. 安装polipo,我们通过polipo实现socks5->http 代理的转换
1
brew install polipo

这里我们要对polipo做一点配置,将其设置为自启动模式,这样每次开机后就自动开启了这个服务。

进入到polipo的配置list文件,博主的在
/usr/local/Cellar/polipo/1.1.1下,编辑文件

1
vi homebrew.mxcl.polipo.plist

加入一行string的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<plist version="1.0">
<dict>
<key>Label</key>
<string>homebrew.mxcl.polipo</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/usr/local/opt/polipo/bin/polipo</string>
<string>socksParentProxy=localhost:1080</string>
</array>
<!-- Set `ulimit -n 65536`. The default OS X limit is 256, that's
not enough for Polipo (displays 'too many files open' errors).
It seems like you have no reason to lower this limit
(and unlikely will want to raise it). -->
<key>SoftResourceLimits</key>
<dict>
<key>NumberOfFiles</key>
<integer>65536</integer>
</dict>
</dict>
</plist>

设置每次启动登陆polipo

1
ln -sfv /usr/local/Cellar/polipo/1.1.1/*.plist ~/Library/LaunchAgents

这样就配置号了,下面对~/.ssh下新增编辑config文件

1
2
cd ~/.ssh
vi config

填写如下内容

1
2
3
4
5
6
7
8
9
Host github.com
User username #这里填写你的Github注册邮箱或者账户名均可
Hostname ssh.github.com
PreferredAuthentications publickey
#polipo默认监听的是8123端口,也可以在刚才的plist文件指定
#通过corkscrew进行http代理->ssh的代理配置
ProxyCommand corkscrew 127.0.0.1 8123 %h %p
IdentityFile ~/.ssh/id_rsa
Port 443

这样就实现了socks5->http->ssh的转换配置

如果要测试是否连接成功,可以输入

1
ssh -T git@github.com

界面返回

1
Hi XXX! You\'ve successfully authenticated, but GitHub does not provide shell access.

即为连接成功~

hexo环境搭建

主要环境搭建请移步 https://hexo.io/zh-cn/docs/
这里主要描述下如何将Github Pages+Hexo集成的

博客搭建流程

  1. 创建仓库,cometlj.github.io;
  2. 创建两个分支:master 与 hexo;
  3. 设置hexo为默认分支(因为我们只需要手动管理这个分支上的Hexo网站文件);
  4. 使用git clone git@github.com:cometlj/cometlj.github.io.git拷贝仓库;
  5. 在本地cometlj.github.io文件夹下通过Git bash依次执行
1
2
3
hexo init
npm install
npm install hexo-deployer-git --save

注意!!这里有一个大坑,因为git clone 的时候,已经将写.git文件夹写入了,但是通过hexo init先清空所有的文件,这样会导致git仓库损坏,网上找了找了半天也没有解决办法,这里最好在做hexo init操作之前,先把.git文件夹备份出来,执行完hexo init操作后,再挪回来即可。

6.修改_config.yml中的deploy参数,配置hexo的git部署地址,分支应为master;例如:

1
2
3
4
deploy:
type: git
repo: git@github.com:xxx/xxx.github.io.git
branch: master

依次执行

1
2
3
git add .
git commit -m “…”
git push origin hexo

提交网站相关的文件,这里可以使用.gitignore文件将没必要上传的文件过滤,例如:

1
vi .gitignore

写入

1
2
3
/.deploy_git
/public
/_config.yml

这样每次hexo分支上就不会有多余的其他文件了

  1. 执行hexo generate -d生成网站并部署到GitHub上。

这样一来,在GitHub上的CrazyMilk.github.io仓库就有两个分支,一个hexo分支用来存放网站的原始文件,一个master分支用来存放生成的静态网页。

博客管理流程

日常修改
在本地对博客进行修改(添加新博文、修改样式等等)后,通过下面的流程进行管理:
依次执行

1
2
3
git add .
git commit -m “…”
git push origin hexo

hexo指令将改动推送到GitHub(此时当前分支应为hexo);
然后才执行hexo generate -d发布网站到master分支上。
虽然两个过程顺序调转一般不会有问题,不过逻辑上这样的顺序是绝对没问题的(例如突然死机要重装了,悲催….的情况,调转顺序就有问题了)。

本地资料丢失
当重装电脑之后,或者想在其他电脑上修改博客,可以使用下列步骤:
使用

1
git clone git@github.com:cometlj/cometlj.github.io.git

拷贝仓库(默认分支为hexo)
在本地新拷贝的cometlj.github.io文件夹下通过Git bash依次执行下列指令:

1
2
npm install
npm install hexo-deployer-git --save

记得,不需要hexo init这条指令

OK,现在可以使用Hexo编写你的博客了

转载请注明: http://cometlj.github.io/blog/githubpageshexo-build-blog-problems-encountered-and-solutions.html

Mysql日期函数大全汇总-不定期汇总

博主在开发过程中,进行用到mysql的日期函数,但是一般也没记住多少,都是现用现查的,每次百度第一页第一条就是这个,索性就转载过来了,原文在

http://www.cnblogs.com/zeroone/archive/2010/05/05/1727659.html

DAYOFWEEK(date)
 返回日期date是星期几(1=星期天,2=星期一,……7=星期六,ODBC标准)
mysql> select DAYOFWEEK(‘1998-02-03’);
  -> 3
WEEKDAY(date)
 返回日期date是星期几(0=星期一,1=星期二,……6= 星期天)。
mysql> select WEEKDAY(‘1997-10-04 22:23:00’);
  -> 5
mysql> select WEEKDAY(‘1997-11-05’);
  -> 2
DAYOFMONTH(date)
 返回date是一月中的第几日(在1到31范围内)
mysql> select DAYOFMONTH(‘1998-02-03’);
  -> 3
DAYOFYEAR(date)
 返回date是一年中的第几日(在1到366范围内)
mysql> select DAYOFYEAR(‘1998-02-03’);
  -> 34
MONTH(date)
 返回date中的月份数值
mysql> select MONTH(‘1998-02-03’);
  -> 2
DAYNAME(date)
 返回date是星期几(按英文名返回)
mysql> select DAYNAME(“1998-02-05”);
  -> ‘Thursday’
MONTHNAME(date)
 返回date是几月(按英文名返回)
mysql> select MONTHNAME(“1998-02-05”);
  -> ‘February’
QUARTER(date)
 返回date是一年的第几个季度
mysql> select QUARTER(’98-04-01′);
  -> 2
WEEK(date,first)
 返回date是一年的第几周(first默认值0,first取值1表示周一是周的开始,0从周日开始)
mysql> select WEEK(‘1998-02-20’);
  -> 7
mysql> select WEEK(‘1998-02-20’,0);
  -> 7
mysql> select WEEK(‘1998-02-20’,1);
  -> 8
YEAR(date)
 返回date的年份(范围在1000到9999)
mysql> select YEAR(’98-02-03′);
  -> 1998
HOUR(time)
 返回time的小时数(范围是0到23)
mysql> select HOUR(’10:05:03′);
  -> 10
MINUTE(time)
 返回time的分钟数(范围是0到59)
mysql> select MINUTE(’98-02-03 10:05:03′);
  -> 5
SECOND(time)
 返回time的秒数(范围是0到59)
mysql> select SECOND(’10:05:03′);
  -> 3
PERIOD_ADD(P,N)
 增加N个月到时期P并返回(P的格式YYMM或YYYYMM)
mysql> select PERIOD_ADD(9801,2);
  -> 199803
PERIOD_DIFF(P1,P2)
 返回在时期P1和P2之间月数(P1和P2的格式YYMM或YYYYMM)
mysql> select PERIOD_DIFF(9802,199703);
  -> 11
DATE_ADD(date,INTERVAL expr type)
DATE_SUB(date,INTERVAL expr type)
ADDDATE(date,INTERVAL expr type)
SUBDATE(date,INTERVAL expr type)
 对日期时间进行加减法运算
 (ADDDATE()和SUBDATE()是DATE_ADD()和DATE_SUB()的同义词,也可以用运算符 和-而不是函数
 date是一个DATETIME或DATE值,expr对date进行加减法的一个表达式字符串type指明表达式expr应该如何被解释
 [type值 含义 期望的expr格式]:
 SECOND 秒 SECONDS
 MINUTE 分钟 MINUTES
 HOUR 时间 HOURS
 DAY 天 DAYS
 MONTH 月 MONTHS
 YEAR 年 YEARS
 MINUTE_SECOND 分钟和秒 “MINUTES:SECONDS”
 HOUR_MINUTE 小时和分钟 “HOURS:MINUTES”
 DAY_HOUR 天和小时 “DAYS HOURS”
 YEAR_MONTH 年和月 “YEARS-MONTHS”
 HOUR_SECOND 小时, 分钟, “HOURS:MINUTES:SECONDS”
 DAY_MINUTE 天, 小时, 分钟 “DAYS HOURS:MINUTES”
 DAY_SECOND 天, 小时, 分钟, 秒 “DAYS HOURS:MINUTES:SECONDS”
 expr中允许任何标点做分隔符,如果所有是DATE值时结果是一个DATE值,否则结果是一个DATETIME值)
 如果type关键词不完整,则MySQL从右端取值,DAY_SECOND因为缺少小时分钟等于MINUTE_SECOND)
 如果增加MONTH、YEAR_MONTH或YEAR,天数大于结果月份的最大天数则使用最大天数)
mysql> SELECT “1997-12-31 23:59:59” INTERVAL 1 SECOND;
  -> 1998-01-01 00:00:00
mysql> SELECT INTERVAL 1 DAY “1997-12-31”;
  -> 1998-01-01
mysql> SELECT “1998-01-01” – INTERVAL 1 SECOND;
  -> 1997-12-31 23:59:59
mysql> SELECT DATE_ADD(“1997-12-31 23:59:59”,INTERVAL 1 SECOND);
  -> 1998-01-01 00:00:00
mysql> SELECT DATE_ADD(“1997-12-31 23:59:59”,INTERVAL 1 DAY);
  -> 1998-01-01 23:59:59
mysql> SELECT DATE_ADD(“1997-12-31 23:59:59”,INTERVAL “1:1” MINUTE_SECOND);
  -> 1998-01-01 00:01:00
mysql> SELECT DATE_SUB(“1998-01-01 00:00:00”,INTERVAL “1 1:1:1” DAY_SECOND);
  -> 1997-12-30 22:58:59
mysql> SELECT DATE_ADD(“1998-01-01 00:00:00”, INTERVAL “-1 10” DAY_HOUR);
  -> 1997-12-30 14:00:00
mysql> SELECT DATE_SUB(“1998-01-02”, INTERVAL 31 DAY);
  -> 1997-12-02
mysql> SELECT EXTRACT(YEAR FROM “1999-07-02”);
  -> 1999
mysql> SELECT EXTRACT(YEAR_MONTH FROM “1999-07-02 01:02:03”);
  -> 199907
mysql> SELECT EXTRACT(DAY_MINUTE FROM “1999-07-02 01:02:03”);
  -> 20102
TO_DAYS(date)
 返回日期date是西元0年至今多少天(不计算1582年以前)
mysql> select TO_DAYS(950501);
  -> 728779
mysql> select TO_DAYS(‘1997-10-07’);
  -> 729669
FROM_DAYS(N)
 给出西元0年至今多少天返回DATE值(不计算1582年以前)
mysql> select FROM_DAYS(729669);
  -> ‘1997-10-07’
DATE_FORMAT(date,format)
 根据format字符串格式化date值
 (在format字符串中可用标志符:
 %M 月名字(January……December)
 %W 星期名字(Sunday……Saturday)
 %D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)
 %Y 年, 数字, 4 位
 %y 年, 数字, 2 位
 %a 缩写的星期名字(Sun……Sat)
 %d 月份中的天数, 数字(00……31)
 %e 月份中的天数, 数字(0……31)
 %m 月, 数字(01……12)
 %c 月, 数字(1……12)
 %b 缩写的月份名字(Jan……Dec)
 %j 一年中的天数(001……366)
 %H 小时(00……23)
 %k 小时(0……23)
 %h 小时(01……12)
 %I 小时(01……12)
 %l 小时(1……12)
 %i 分钟, 数字(00……59)
 %r 时间,12 小时(hh:mm:ss [AP]M)
 %T 时间,24 小时(hh:mm:ss)
 %S 秒(00……59)
 %s 秒(00……59)
 %p AM或PM
 %w 一个星期中的天数(0=Sunday ……6=Saturday )
 %U 星期(0……52), 这里星期天是星期的第一天
 %u 星期(0……52), 这里星期一是星期的第一天
 %% 字符% )
mysql> select DATE_FORMAT(‘1997-10-04 22:23:00′,’%W %M %Y’);
  -> ‘Saturday October 1997’
mysql> select DATE_FORMAT(‘1997-10-04 22:23:00′,’%H:%i:%s’);
  -> ’22:23:00′
mysql> select DATE_FORMAT(‘1997-10-04 22:23:00′,’%D %y %a %d %m %b %j’);
  -> ‘4th 97 Sat 04 10 Oct 277’
mysql> select DATE_FORMAT(‘1997-10-04 22:23:00′,’%H %k %I %r %T %S %w’);
  -> ’22 22 10 10:23:00 PM 22:23:00 00 6′
TIME_FORMAT(time,format)
 和DATE_FORMAT()类似,但TIME_FORMAT只处理小时、分钟和秒(其余符号产生一个NULL值或0)
CURDATE()
CURRENT_DATE()
 以’YYYY-MM-DD’或YYYYMMDD格式返回当前日期值(根据返回值所处上下文是字符串或数字)
mysql> select CURDATE();
  -> ‘1997-12-15’
mysql> select CURDATE() 0;
  -> 19971215
CURTIME()
CURRENT_TIME()
 以’HH:MM:SS’或HHMMSS格式返回当前时间值(根据返回值所处上下文是字符串或数字)
mysql> select CURTIME();
  -> ’23:50:26′
mysql> select CURTIME() 0;
  -> 235026
NOW()
SYSDATE()
CURRENT_TIMESTAMP()
 以’YYYY-MM-DD HH:MM:SS’或YYYYMMDDHHMMSS格式返回当前日期时间(根据返回值所处上下文是字符串或数字)
mysql> select NOW();
  -> ‘1997-12-15 23:50:26’
mysql> select NOW() 0;
  -> 19971215235026
UNIX_TIMESTAMP()
UNIX_TIMESTAMP(date)
 返回一个Unix时间戳(从’1970-01-01 00:00:00’GMT开始的秒数,date默认值为当前时间)
mysql> select UNIX_TIMESTAMP();
  -> 882226357
mysql> select UNIX_TIMESTAMP(‘1997-10-04 22:23:00’);
  -> 875996580
FROM_UNIXTIME(unix_timestamp)
 以’YYYY-MM-DD HH:MM:SS’或YYYYMMDDHHMMSS格式返回时间戳的值(根据返回值所处上下文是字符串或数字)
mysql> select FROM_UNIXTIME(875996580);
  -> ‘1997-10-04 22:23:00’
mysql> select FROM_UNIXTIME(875996580) 0;
  -> 19971004222300
FROM_UNIXTIME(unix_timestamp,format)
 以format字符串格式返回时间戳的值
mysql> select FROM_UNIXTIME(UNIX_TIMESTAMP(),’%Y %D %M %h:%i:%s %x’);
  -> ‘1997 23rd December 03:43:30 x’
SEC_TO_TIME(seconds)
 以’HH:MM:SS’或HHMMSS格式返回秒数转成的TIME值(根据返回值所处上下文是字符串或数字)
mysql> select SEC_TO_TIME(2378);
  -> ’00:39:38′
mysql> select SEC_TO_TIME(2378) 0;
  -> 3938
TIME_TO_SEC(time)
 返回time值有多少秒
mysql> select TIME_TO_SEC(’22:23:00′);
  -> 80580
mysql> select TIME_TO_SEC(’00:39:38′);
  -> 2378

转载请注明: http://cometlj.github.io/blog/mysql-date-function-daquan-summary-from-time-to.html

php格式化数字-位数不足前面加0补足

第一种方法:

1
2
$var=sprintf("%04d", 2);//生成4位数,不足前面补0
echo $var;//结果为0002

语法

1
sprintf(format,arg1,arg2,arg++)
参数 描述
format 必需。转换格式。
arg1 必需。规定插到 format 字符串中第一个 % 符号处的参数。
arg2 可选。规定插到 format 字符串中第二个 % 符号处的参数。
arg++ 可选。规定插到 format 字符串中第三、四等等 % 符号处的参数。

说明

参数 format 是转换的格式,以百分比符号 (“%”) 开始到转换字符结束。下面的可能的 format 值:
|参数|描述|
| ——– |——– |
|%% |返回百分比符号|
|%b |二进制数|
|%c |依照 ASCII 值的字符|
|%d |带符号十进制数|
|%e |可续计数法(比如 1.5e+3)|
|%u |无符号十进制数|
|%f |浮点数(local settings aware)|
|%F |浮点数(not local settings aware)|
|%o |八进制数|
|%s |字符串|
|%x |十六进制数(小写字母)|
|%X |十六进制数(大写字母)|
arg1, arg2, ++ 等参数将插入到主字符串中的百分号 (%) 符号处。该函数是逐步执行的。在第一个 % 符号中,插入 arg1,在第二个 % 符号处,插入 arg2,依此类推。

第二种方法:

1
2
3
4
5
6
7
8
9
10
11
$number = 1234.56;
// english notation (default)
$english_format_number = number_format($number);
// 1,235
// French notation
$nombre_format_francais = number_format($number, 2, ',', ' ');
// 1 234,56
$number = 1234.5678;
// english notation without thousands seperator
$english_format_number = number_format($number, 2, '.', '');
// 1234.57

两种方法都不错,适合于使用在生成序列号或者流水号的时候使用

转载请注明: http://cometlj.github.io/blog/php-formatting-numbers-plus-0-in-front-of-insufficient-digits.html

PHPExcel开发中遇到的问题和注意事项

标签(空格分隔): PHPExcel
这段时间博主也在用PHPExcel进行项目开发,里面遇到了很多的问题,也总结了很多的经验,这里就记录下来作为自己以后的注意事项

一、phpExcel大数据量情况下内存溢出解决

版本:1.7.6+
在不进行特殊设置的情况下,phpExcel将读取的单元格信息保存在内存中,我们可以通过

1
PHPExcel_Settings::setCacheStorageMethod()

来设置不同的缓存方式,已达到降低内存消耗的目的!

1、将单元格数据序列化后保存在内存中

1
PHPExcel_CachedObjectStorageFactory::cache_in_memory_serialized;

2、将单元格序列化后再进行Gzip压缩,然后保存在内存中

1
PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;

3、缓存在临时的磁盘文件中,速度可能会慢一些

1
PHPExcel_CachedObjectStorageFactory::cache_to_discISAM;

4、保存在php://temp

1
PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;

5、保存在memcache中

1
2
3
4
5
6
7
PHPExcel_CachedObjectStorageFactory::cache_to_memcache
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_memcache;
$cacheSettings = array( 'memcacheServer' => 'localhost',
'memcachePort' => 11211,
'cacheTime' => 600
);
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);

注意是加在new PHPExcel() 前面:如下

1
2
3
4
5
require_once APPPATH .'third_party/PHPExcel/PHPExcel.php';
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
$cacheSettings = array('memoryCacheSize'=>'16MB');
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
$objPHPExcel = new PHPExcel();

以上转自:这位兄台

二、phpexcel单元格内换行

我说的这个换行不是字多了,自动换行的那种,是在特定位置添加换行符然后注意两点

1
2
$objPHPExcel ->setActiveSheetIndex(0)->setCellValue( 'A4' , “Hello\nWorld”);
$objPHPExcel ->setActiveSheetIndex(0)->setCellValue( 'A4' , “Hello\nWorld”);

一、要有下面的代码配合

1
2
$objPHPExcel->getActiveSheet()->getStyle('A4')->getAlignment()->setWrapText(true);
$objPHPExcel->getActiveSheet()->getStyle('A4')->getAlignment()->setWrapText(true);

二、是要换行的字符串Hello\nWorld外面必须是双引号,另外,网上有朋友说,通过以下代码:

1
2
$objPHPExcel->getActiveSheet()->getStyle('A4')->getAlignment()->setWrapText(true);
$objPHPExcel->getActiveSheet()->getStyle('A4')->getAlignment()->setWrapText(true);

也可以实现单元格内换行,但是博主在使用后,貌似没有起到作用,只能通过\n的进行换行操作。

三、关于合并单元格的填充

先设置左上角的第一个单元格的值,然后通过mergeCells将单元格合并(左上角:右下角)

1
2
3
4
$objPHPExcel->getActiveSheet()->setCellValue("A2",$intro_title);
$objPHPExcel->getActiveSheet()->mergeCells("A2:Y3");
$objPHPExcel->getActiveSheet()->setCellValue("A2",$intro_title);
$objPHPExcel->getActiveSheet()->mergeCells("A2:Y3");

四、对于load加载中文文件名模板显示找不到模板的Error解决方法:

博主在开发中,发现存在有汉字的模板文件,在LINUX环境下提示无法加载的问题,实际操作中发现是因为乱码造成PHPExcel无法识别,网上有朋友介绍可以使用iconv函数进行GBK转UTF8格式转换,博主测试后发现仍然无法识别,最后解决方案为:

1
2
3
4
5
6
$filepath = base64_encode($_SERVER['DOCUMENT_ROOT'].__ROOT__."/Uploads/excel/汇总数据输出/花名汇总表.xlsx");
$real_filepath = base64_decode($filepath);
$objPHPExcel = PHPExcel_IOFactory::load($real_filepath);
$filepath = base64_encode($_SERVER['DOCUMENT_ROOT'].__ROOT__."/Uploads/excel/汇总数据输出/花名汇总表.xlsx");
$real_filepath = base64_decode($filepath);
$objPHPExcel = PHPExcel_IOFactory::load($real_filepath);

以后如果有更新,就接着这里记录了~~
常用的API记录,摘自朽木博客,大神的转载~~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
include 'PHPExcel.php';
include 'PHPExcel/RichText.php'; //用于输出.xls/.pdf的

//创建一个excel
$objPHPExcel = new PHPExcel();

//保存excel
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save("xxx.xlsx");

//输出XLS到浏览器
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
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');

//输出PDF到浏览器
$rendererName = PHPExcel_Settings::PDF_RENDERER_TCPDF;
$rendererLibrary = 'TCPDF';
$rendererLibraryPath = './Lib/tcpdf/';

PHPExcel_Settings::setPdfRenderer(
$rendererName,
$rendererLibraryPath
);

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'PDF');
$objWriter->setSheetIndex(0);

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/pdf");
header("Content-Type:application/octet-stream");
header("Content-Type:application/download");
header('Content-Disposition:attachment;filename="resume.pdf"');
header("Content-Transfer-Encoding:binary");
$objWriter->save('php://output');
include 'PHPExcel.php';
include 'PHPExcel/RichText.php'; //用于输出.xls/.pdf的

//创建一个excel
$objPHPExcel = new PHPExcel();

//保存excel
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save("xxx.xlsx");

//输出XLS到浏览器
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
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');

//输出PDF到浏览器
$rendererName = PHPExcel_Settings::PDF_RENDERER_TCPDF;
$rendererLibrary = 'TCPDF';
$rendererLibraryPath = './Lib/tcpdf/';

PHPExcel_Settings::setPdfRenderer(
$rendererName,
$rendererLibraryPath
);

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'PDF');
$objWriter->setSheetIndex(0);

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/pdf");
header("Content-Type:application/octet-stream");
header("Content-Type:application/download");
header('Content-Disposition:attachment;filename="resume.pdf"');
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");

//创建人
$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");
其他常用设置

//设置默认字体和大小
$objPHPExcel->getDefaultStyle()->getFont()->setName('宋体');
$objPHPExcel->getDefaultStyle()->getFont()->setSize(10);

//设置当前的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');
//分离单元格
$objPHPExcel->getActiveSheet()->unmergeCells('A28:B28');
//保护cell
$objPHPExcel->getActiveSheet()->getProtection()->setSheet(true);
$objPHPExcel->getActiveSheet()->protectCells('A3:E13', 'PHPExcel');
//设置格式
// Set cell number formats
echo date('H:i:s') . " Set cell number formatsn";
$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);
//设置高度
$objPHPExcel->getActiveSheet()->getRowDimension('6')->setRowHeight(30);
//设置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_LEFT);
$objPHPExcel->getActiveSheet()->getStyle('D13')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$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());
//超链接
$objPHPExcel->getActiveSheet()->getCell('J9')->getHyperlink()->setUrl('http://www.g.cn/');
//在默认sheet后,创建一个worksheet
echo date('H:i:s') . " Create new Worksheet objectn";
$objPHPExcel->createSheet();
$objWriter = PHPExcel_IOFactory::createWriter($objExcel, 'Excel5');
$objWriter-save('php://output');

//设置默认字体和大小
$objPHPExcel->getDefaultStyle()->getFont()->setName('宋体');
$objPHPExcel->getDefaultStyle()->getFont()->setSize(10);

//设置当前的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');
//分离单元格
$objPHPExcel->getActiveSheet()->unmergeCells('A28:B28');
//保护cell
$objPHPExcel->getActiveSheet()->getProtection()->setSheet(true);
$objPHPExcel->getActiveSheet()->protectCells('A3:E13', 'PHPExcel');
//设置格式
// Set cell number formats
echo date('H:i:s') . " Set cell number formatsn";
$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);
//设置高度
$objPHPExcel->getActiveSheet()->getRowDimension('6')->setRowHeight(30);
//设置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_LEFT);
$objPHPExcel->getActiveSheet()->getStyle('D13')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$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());
//超链接
$objPHPExcel->getActiveSheet()->getCell('J9')->getHyperlink()->setUrl('http://www.g.cn/');
//在默认sheet后,创建一个worksheet
echo date('H:i:s') . " Create new Worksheet objectn";
$objPHPExcel->createSheet();
$objWriter = PHPExcel_IOFactory::createWriter($objExcel, 'Excel5');
$objWriter-save('php://output');

tcpdf中文乱码的问题
下载字体包,解压至fonts目录
修改字体为

1
$pdf->SetFont('droidsansfallback', '', 12);

以上的代码基本在博主的开发中,被当成API文档来看了,实用性很强,这里转载过来,也是基于分享精神给需要的朋友来看吧。原文地址:http://www.xiumu.org/technology/phpexcel-use.shtml

转载请注明: http://cometlj.github.io/blog/phpexcel-problems-encountered-in-the-development-and-precautions.html