<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_每天学习一点点，每天进步一点点</title><subtitle type="text">宽容，淡定，超脱。</subtitle><id>http://feed.cnblogs.com/blog/u/30075/rss</id><updated>2012-02-24T05:23:49Z</updated><author><name>风雨者2</name><uri>http://www.cnblogs.com/blsong/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/blsong/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/30075/rss"/><entry><id>http://www.cnblogs.com/blsong/archive/2012/02/22/2363042.html</id><title type="text">编程：是一门艺术(转)</title><summary type="text">摘要：Knuth在他的多卷书《计算机编程艺术》中向我们展示了计算机编程的技巧和艺术性，并在其图灵奖演说中论述了计算机编程和艺术的关系。这篇文章受Knuth著作的启发，进一步阐述为什么计算机编程应该是一门艺术并通过代码展示艺术的主要表现形式。图片来源：accidentally in code 1. 引言"(program(computers) == *art) ? so : what"“只有大约5%的程序员能够在编写代码时创造出艺术。其他95%一定是为了取得成功的科学家，不是艺术家。” 谈及“艺术”，人们自然会联想到“美”、“技艺”、“灵感”等词，但很少会把它和“计算机编程”</summary><published>2012-02-22T06:00:00Z</published><updated>2012-02-22T06:00:00Z</updated><author><name>风雨者2</name><uri>http://www.cnblogs.com/blsong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/blsong/archive/2012/02/22/2363042.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/blsong/archive/2012/02/22/2363042.html"/><content type="html">&lt;div class="toptitle"&gt;&lt;span class="topinfo"&gt;摘要：&lt;/span&gt;Knuth在他的多卷书《计算机编程艺术》中向我们展示了计算机编程的技巧和艺术性，并在其图灵奖演说中论述了计算机编程和艺术的关系。这篇文章受Knuth著作的启发，进一步阐述为什么计算机编程应该是一门艺术并通过代码展示艺术的主要表现形式。&lt;/div&gt;&lt;div class="contents_main"&gt;&lt;div id="ArticleCnt" class="content_words"&gt;&lt;p&gt;&lt;strong&gt;&lt;img src="http://pic001.cnblogs.com/images/2012/1/2012022115271843.jpg" alt="" /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;图片来源：&lt;a href="http://www.catehuston.com/blog/2009/12/27/art-life-and-programming-introduction/" target="_blank"&gt;accidentally in code&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. 引言&lt;/strong&gt;&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;"(program(computers) == *art) ? so : what"&lt;br /&gt;&amp;ldquo;只有大约5%的程序员能够在编写代码时创造出艺术。其他95%一定是为了取得成功的科学家，不是艺术家。&amp;rdquo;&lt;/blockquote&gt;&lt;p&gt;谈及&amp;ldquo;艺术&amp;rdquo;，人们自然会联想到&amp;ldquo;美&amp;rdquo;、&amp;ldquo;技艺&amp;rdquo;、&amp;ldquo;灵感&amp;rdquo;等词，但很少会把它和&amp;ldquo;计算机编程&amp;rdquo;这听起来似乎无趣的词联系在一起。而Donald Knuth，《计算机编程的艺术》多卷书的作者，通过他的著作，成功地展现了计算机编程的艺术。随后他又在图灵奖演说[&lt;a href="http://kb.cnblogs.com/page/132089/#r1"&gt;1&lt;/a&gt;]中对计算机编程的艺术做了科学地论述和诠释。他不是第一个这么做的人，但无疑他是最成功的一个。Guido van Rossum，Python的设计者，如是说：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&amp;ldquo;我同意Knuth对&amp;lsquo;艺术&amp;rsquo;一词的定义（或使用）。对于我来说，它和创造性联系十分紧密，而这对于我的工作非常重要。如果（计算机编程）其中没有艺术，它将没有任何乐趣，而我也不会在30年之后仍然从事它。&amp;rdquo;&lt;/blockquote&gt;&lt;p&gt;编写优美的程序需要灵感和高超的技巧，就像诗人写诗，画家作画，建筑师构筑，充满了乐趣、挑战和美。优雅的程序会像诗歌一样耐人寻味，像名画那样大开眼界，像教堂一样堂皇华丽。所以，计算机编程也同样是一门艺术，程序员就是创造这种艺术的艺术家。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;strong&gt;2. 编程之美&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;什么样的程序才是美的程序？这个问题似乎没有完整的答案。一个很酷的Demo或一个很炫的视频游戏都能让我们赞叹不已。Doom和Half Life可以说把3D技术推向了极至，这种程序总能给人一种视觉上的美，就像画家手中的美丽油画，只是程序员们的画布在电脑屏幕上，画笔是键盘。Linux也是一种美，一种开放的美，从Unix那里继承来的优雅的设计，强大的可移植性，丰富的工具，这让它看起来像优秀建筑师们设计的一座富丽堂皇的教堂。这些美是显而易见的。还有一种美，隐藏在程序背后，流动于源代码之中。什么又是美的代码呢？可能它们一看上去就很美。这里有一个惊人的宏定义的C代码集合[&lt;a href="http://kb.cnblogs.com/page/132089/#r2"&gt;2&lt;/a&gt;]：允许程序建立常量，使它们看上去像是屏幕上的图形！程序的自描述能力大大加强！&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span&gt;#define&lt;/span&gt; X )*2+1&lt;br /&gt;&lt;span&gt;#define&lt;/span&gt; _ )*2&lt;br /&gt;&lt;span&gt;#define&lt;/span&gt; s ((((((((((((((((0 &lt;br /&gt;&lt;span&gt;static&lt;/span&gt; unsigned &lt;span&gt;short&lt;/span&gt; stopwatch[] =&lt;br /&gt;{&lt;br /&gt;s _ _ _ _ _ X X X X X _ _ _ X X _ ,&lt;br /&gt;s _ _ _ X X X X X X X X X _ X X X ,&lt;br /&gt;s _ _ X X X _ _ _ _ _ X X X _ X X ,&lt;br /&gt;s _ X X _ _ _ _ _ _ _ _ _ X X _ _ ,&lt;br /&gt;s _ X X _ _ _ _ _ _ _ _ _ X X _ _ ,&lt;br /&gt;s X X _ _ _ _ _ _ _ _ _ _ _ X X _ ,&lt;br /&gt;s X X _ _ _ _ _ _ _ _ _ _ _ X X _ ,&lt;br /&gt;s X X _ X X X X X _ _ _ _ _ X X _ ,&lt;br /&gt;s X X _ _ _ _ _ X _ _ _ _ _ X X _ ,&lt;br /&gt;s X X _ _ _ _ _ X _ _ _ _ _ X X _ ,&lt;br /&gt;s _ X X _ _ _ _ X _ _ _ _ X X _ _ ,&lt;br /&gt;s _ X X _ _ _ _ X _ _ _ _ X X _ _ ,&lt;br /&gt;s _ _ X X X _ _ _ _ _ X X X _ _ _ ,&lt;br /&gt;s _ _ _ X X X X X X X X X _ _ _ _ ,&lt;br /&gt;s _ _ _ _ _ X X X X X _ _ _ _ _ _ ,&lt;br /&gt;s _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _&lt;br /&gt;};&lt;/div&gt;&lt;p&gt;这种只能在Usenet或混乱C代码竞赛中才能见到的代码虽然没有多少实际用处，但它的确能让我们感受到代码 &amp;mdash;&amp;mdash; 一堆有规则的符号 &amp;mdash;&amp;mdash; 也能创造出视觉上的美。也可能是程序使用的技巧 &amp;mdash;&amp;mdash; 算法很美，就像汉诺塔程序，快速排序程序，自然而然地使用递归让它们看起来很紧凑，易读，这当然也是一种美，是只有程序员才能体会到的美。还有一种美，深藏在代码之后，是程序的设计思想之美，一种需要领悟的美。Unix带给我们的不仅是它的强大功能，还有它那深邃的设计哲学[&lt;a href="http://kb.cnblogs.com/page/132089/#r3"&gt;3&lt;/a&gt;]：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&amp;ldquo;小巧就是美的。&amp;rdquo;（Small is beautiful.）&lt;br /&gt;&amp;ldquo;让每个程序都擅长做一件事。&amp;rdquo;（Make each program do one thing well. ）&lt;br /&gt;&amp;ldquo;一切都是文件。&amp;rdquo;（Everything is a file.）&lt;br /&gt;&amp;ldquo;沉默是金。&amp;rdquo;（Silence is golden.）&lt;br /&gt;&amp;ldquo;让操作系统内核小而轻巧。&amp;rdquo;（Make operating system kernels small and lightweight.）&lt;/blockquote&gt;&lt;p&gt;这些思想在Unix设计中不失为黄金法则。这种美将穿越时空，千古流传，让Unix不仅仅是一个优秀的操作系统，而成为一门计算机领域的哲学。&lt;/p&gt;&lt;p&gt;人们都喜欢美的东西，程序员们更是珍视美的程序，我们把那些创造美好程序的人尊称为&amp;ldquo;黑客&amp;rdquo;。 Paul Graham认为黑客和画家很相似[&lt;a href="http://kb.cnblogs.com/page/132089/#r4"&gt;4&lt;/a&gt;]：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;黑客和画家的共同之处是，他们都是创造者。和作曲家，建筑师，作家一样，黑客和画家尝试去做的也是创造好的东西。他们本身并不做研究，但是如果在创造好东西的过程中发现了一些新的技术，那就更好了。&lt;/blockquote&gt;&lt;p&gt;好的画家是艺术家，那么好的程序员&amp;mdash;&amp;mdash;黑客&amp;mdash;&amp;mdash;也是艺术家。这也就不难理解为什么很多Unix内核黑客都留着艺术家式的络腮胡了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;strong&gt;3. 编程之巧&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;灵巧的程序像含蓄的诗歌，需要仔细领悟，用心去体会，茅塞顿开后方能回味无穷。真乃&amp;ldquo;会当临绝顶，一览众山小&amp;rdquo;！同样是求pi，但是只有简单的四行C代码却能打印出pi的前800位的程序定会让我们大开眼界[&lt;a href="http://kb.cnblogs.com/page/132089/#r5"&gt;5&lt;/a&gt;]：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span&gt;int&lt;/span&gt; a=&lt;span&gt;10000&lt;/span&gt;,b,c=&lt;span&gt;2800&lt;/span&gt;,d,e,f[&lt;span&gt;2801&lt;/span&gt;],g;&lt;br /&gt;main(){&lt;br /&gt;&lt;span&gt;for&lt;/span&gt;(;b-c;)f[b++]=a/&lt;span&gt;5&lt;/span&gt;;&lt;br /&gt;&lt;span&gt;for&lt;/span&gt;(;d=&lt;span&gt;0&lt;/span&gt;,g=c*&lt;span&gt;2&lt;/span&gt;;c-=&lt;span&gt;14&lt;/span&gt;,printf(&lt;span&gt;"&lt;/span&gt;&lt;span&gt;%.4d&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;,e+d/a),e=d%a)&lt;br /&gt;&lt;span&gt;for&lt;/span&gt;(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;黑客们不会墨守陈规，他们不断地创新，寻找更巧的方法来解决同样的问题。曾经流行编写这样一种程序，它能够打印它自己的全部代码。程序员们努力寻找最短的这种程序。这虽然没多大实际用处，但是充满了挑战性，黑客们把这当作乐趣。看看下面的程序[&lt;a href="http://kb.cnblogs.com/page/132089/#r6"&gt;6&lt;/a&gt;]是多么怪异。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span&gt;char&lt;/span&gt; *f=&lt;span&gt;"&lt;/span&gt;&lt;span&gt;char *f= %c%s%c;main(){printf(f,34,f,34,10);} %c&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;;&lt;br /&gt;main(){printf(f,&lt;span&gt;34&lt;/span&gt;,f,&lt;span&gt;34&lt;/span&gt;,&lt;span&gt;10&lt;/span&gt;);}&lt;/div&gt;&lt;p&gt;计算机编程吸引人的很大一部分在于它需要高超的技巧，也正是这些技巧才使我们看到了美，从中得到了乐趣。而且，我发现，当限制增加时，技巧将会更高，乐趣也会随之增加。来写这样一段程序，让它在屏幕上打印1~1000之间的数字。这对于一个新手来说也是小菜一碟，一个for 循环就搞定。好，我们加一个限制，不许使用任何循环。这时你得动一番脑筋了，不过你还是会想到用递归可以完成。不错，我们再加一个限制，也不许用递归。这可能把你难住了，你可能会认为不可能有这样的程序，那看看下面的程序吧：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;span&gt;#define&lt;/span&gt; A(x) x;x;x;x;x;x;x;x;x;x;&lt;br /&gt;&lt;span&gt;int&lt;/span&gt; main (&lt;span&gt;void&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;&lt;span&gt;int&lt;/span&gt; n = &lt;span&gt;1&lt;/span&gt;;&lt;br /&gt;A(A(A(printf (&lt;span&gt;"&lt;/span&gt;&lt;span&gt;%d &lt;/span&gt;&lt;span&gt;"&lt;/span&gt;, n++))));&lt;br /&gt;&lt;span&gt;return&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;既没有用循环，也没有用递归，而是使用了宏！我们常常惊讶于世界各地著名的Warez组织推出的64k的3D动画，那么小的程序，往往有难以想象的效果。它们把64k的限制和汇编的威力运用到了极限，这种技术让人叹为观止。64k似乎并没有限制住其艺术性，反而起了促进作用。并且，当你对系统有足够的了解时，乐趣将会更多。因为你可以使用技巧和系统开玩笑了，欺骗它，作弄它，甚至攻击它。看下面的程序：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span&gt;void&lt;/span&gt; main() {&lt;br /&gt;&lt;span&gt;int&lt;/span&gt; x;&lt;br /&gt;x = &lt;span&gt;0&lt;/span&gt;;&lt;br /&gt;x = &lt;span&gt;1&lt;/span&gt;;&lt;br /&gt;printf(&lt;span&gt;"&lt;/span&gt;&lt;span&gt;%dn&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;,x);&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;想一想，如何才能让程序跳过&amp;ldquo;x=1;&amp;rdquo;这一句而在屏幕上打印0？如果你对系统堆栈了解的话，你可能会给出类似下面的程序[&lt;a href="http://kb.cnblogs.com/page/132089/#r7"&gt;7&lt;/a&gt;]：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span&gt;void&lt;/span&gt; function(&lt;span&gt;int&lt;/span&gt; a, &lt;span&gt;int&lt;/span&gt; b, &lt;span&gt;int&lt;/span&gt; c) {&lt;br /&gt;&lt;span&gt;char&lt;/span&gt; buffer1[&lt;span&gt;5&lt;/span&gt;];&lt;br /&gt;&lt;span&gt;char&lt;/span&gt; buffer2[&lt;span&gt;10&lt;/span&gt;];&lt;br /&gt;&lt;span&gt;int&lt;/span&gt; *ret;&lt;br /&gt; &lt;br /&gt;ret = buffer1 + &lt;span&gt;12&lt;/span&gt;;&lt;br /&gt;(*ret) += &lt;span&gt;8&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;&lt;span&gt;void&lt;/span&gt; main() {&lt;br /&gt;&lt;span&gt;int&lt;/span&gt; x;&lt;br /&gt; &lt;br /&gt;x = &lt;span&gt;0&lt;/span&gt;;&lt;br /&gt;function(&lt;span&gt;1&lt;/span&gt;,&lt;span&gt;2&lt;/span&gt;,&lt;span&gt;3&lt;/span&gt;);&lt;br /&gt;x = &lt;span&gt;1&lt;/span&gt;;&lt;br /&gt;printf(&lt;span&gt;"&lt;/span&gt;&lt;span&gt;%dn&lt;/span&gt;&lt;span&gt;"&lt;/span&gt;,x);&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;它利用了调用函数时堆栈的变化，改变函数的返回地址，跳过了&amp;ldquo;x=1;&amp;rdquo;这一句而直接执行下面的printf！它成功的欺骗了系统！如果把返回地址改成你预先放置的一段代码的首地址，那么你将会劫持系统，让它运行你的那段代码。如果那段代码足够巧，你将能获得系统的完全控制权！这也是缓冲区溢出的基本原理。我想，这种技巧将会让你兴奋不已，丝毫不亚于陶醉在自己诗里的诗人。我们已经看到：巧妙产生美，并与之形成艺术的雏形。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;strong&gt;4. 编程之乐&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;计算机给人的乐趣在于，如果你有什么好的想法，你可以马上实验去得到结果。当然，你可能不会立刻得到正确答案，而必须坐下来，盯着电脑屏幕，苦思冥想求解问题的有效方法，通过不断的尝试去验证你的结果。可以通过找到正确的方法，使问题突然消失，也可以换一个角度，突然灵光闪现：原来是这样！&lt;/p&gt;&lt;p&gt;编程是对创造力的训练，好的程序员不会循规蹈矩，不会使用平庸的方法去解决问题，而是根据自己的见解去寻找更简单的方法，因为他们能看到隐藏在问题背后的实质。然后他们会写出全新而漂亮的程序去验证他们的方法。&amp;ldquo;不过还是很难说清楚，闭门苦思冥想地要找到解决某个问题的漂亮答案，为什么竟会有如此巨大的魅力。但是，你要是曾经有过找到更好方法的经历，你就会明白，这简直是无以伦比的感觉。&amp;rdquo;[&lt;a href="http://kb.cnblogs.com/page/132089/#r8"&gt;8&lt;/a&gt;]这种感觉能让我们快乐得像一个孩子，乐不知疲。&lt;/p&gt;&lt;p&gt;这种&amp;ldquo;无以伦比&amp;rdquo;的感觉，流动在程序员体内，让程序员们为之痴迷，疯狂。而痴迷的程序员从他艺术性的创造中得到了难以言传的乐趣，并让为之上瘾。 Linux之父在他的传记[&lt;a href="http://kb.cnblogs.com/page/132089/#r8"&gt;8&lt;/a&gt;]中这样谈及他所体会的编程的乐趣：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;编程给人带来最初的兴奋很好解释：那就是通过编程你可以支配一台计算机，你叫计算机做什么，它就做什么，永远准确无误，而且毫无怨言。这本身就很有意思。&lt;p&gt;它比下棋之类的游戏更有乐趣得多，因为它可以由你自己来制定游戏规则。而你制定什么样的规则，也就会导出与此规则相符合的结果。&lt;/p&gt;&lt;p&gt;在电脑世界中，你就是创世者，你对所发生的一切拥有最终的控制。如果你功力深厚，你可以是上帝&amp;mdash;&amp;mdash;在一个较小的层面上。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;无疑，乐在其中，外行人永远体会不到，毕竟&amp;ldquo;子非鱼安知鱼之乐&amp;rdquo;。无穷无尽的乐趣让程序员们模糊地体会到了作为艺术家的快乐，并且开始享受他们的工作。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;strong&gt;5. 结论&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Rob Pike曾悲观地叹息：&amp;ldquo;那种艺术消失了。&amp;rdquo;[&lt;a href="http://kb.cnblogs.com/page/132089/#r9"&gt;9&lt;/a&gt;]但是，我想当他看到诸如《汇编语言的艺术》和《Unix编程艺术》之类的书时，他也会高兴。这种艺术并没有消失，而且还会流传下去。我们不应该因&amp;ldquo;为艺术而艺术&amp;rdquo;而感到不好意思。正如Knuth所言[&lt;a href="http://kb.cnblogs.com/page/132089/#r1"&gt;1&lt;/a&gt;]：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&amp;ldquo;我们已经看到，计算机编程是一门艺术，因为它把积累的知识应用于世界，因为它需要技巧和灵巧，尤其是因为它创造出了美的目标。模糊地意识到自己是一个艺术家的程序员将会享受他所做的工作，而且将会把它做得更好。&amp;rdquo;&lt;/blockquote&gt;&lt;p&gt;或许，我们应该为了&amp;ldquo;艺术&amp;rdquo;的圣杯，举起我们的双刃剑打斗一番。但是，比起剑来，我更喜欢犁头，我本人。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6. 致谢&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;特别感谢王亚刚老师，他能不厌其烦地阅读此文并给我提出宝贵的意见，没有他的指点我不可能完成这篇论文。&lt;/p&gt;&lt;p class="cjk"&gt;&lt;strong&gt;参考文献&lt;/strong&gt;&lt;/p&gt;&lt;p class="cjk"&gt;&lt;span lang="en-US"&gt;&lt;span lang="en-US"&gt;&lt;a name="r1"&gt;&lt;/a&gt;[1]DonaldE. Knuth,&amp;nbsp;&lt;em&gt;Programming As An Art&lt;/em&gt;, ACM Turing Award lecture,1974.&lt;br /&gt;&lt;a name="r2"&gt;&lt;/a&gt;[2]Peter van der Liden,&amp;nbsp;&lt;em&gt;Expert C Programming&lt;/em&gt;,Prentice Hall, 1994.&lt;br /&gt;&lt;a name="r3"&gt;&lt;/a&gt;[3]Mike Gancarz,&amp;nbsp;&lt;em&gt;Linux and the UnixPhilosophy&lt;/em&gt;, Digital Press, 2003.&lt;br /&gt;&lt;a name="r4"&gt;&lt;/a&gt;[4]Paul Graham,&amp;nbsp;&lt;em&gt;Hackersand Painters&lt;/em&gt;, O'Reilly, 2004.&lt;br /&gt;&lt;a name="r5"&gt;&lt;/a&gt;[5]International Obfuscated CCode Contest, http://www.ioccc.org.&lt;br /&gt;&lt;a name="r6"&gt;&lt;/a&gt;[6]Eric S. Raymond,&amp;nbsp;&lt;em&gt;JargonFile&lt;/em&gt;, http://catb.org/jargon/html/index.html.&lt;br /&gt;&lt;a name="r7"&gt;&lt;/a&gt;[7]Aleph One,&lt;em&gt;Smashing The Stack For Fun And Profit&lt;/em&gt;,http://insecure.org/stf/smashstack.html.&lt;br /&gt;&lt;a name="r8"&gt;&lt;/a&gt;[8]Linus Torvalds andDavid Diamond,&amp;nbsp;&lt;em&gt;Just for fun&lt;/em&gt;, Harper Business, 2001.&lt;br /&gt;&lt;a name="r9"&gt;&lt;/a&gt;[9]RobPike,&lt;/span&gt;&lt;/span&gt;&lt;span lang="zh-CN"&gt;　&lt;/span&gt;&lt;span lang="en-US"&gt;&lt;span lang="en-US"&gt;&lt;em&gt;SystemsSoftware Research Is Irrelevant&lt;/em&gt;,http://herpolhode.com/rob/utah2000.pdf, 2000.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="cjk"&gt;&lt;span lang="en-US"&gt;&lt;span lang="en-US"&gt;&lt;a href="http://kb.cnblogs.com/page/132089/"&gt;http://kb.cnblogs.com/page/132089/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/blsong/aggbug/2363042.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/blsong/archive/2012/02/22/2363042.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/blsong/archive/2012/01/19/2326260.html</id><title type="text">正则表达式30分钟入门教程 (转)</title><summary type="text">http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html来园子之前写的一篇正则表达式教程，部分翻译自codeproject的The 30 Minute Regex Tutorial。由于评论里有过长的URL,所以本页排版比较混乱,推荐你到原处查看,看完了如果有问题,再到这里来提出.一些要说的话：如果你没有正则表达式的基础，请跟着教程“一步步来”。请不要大概地扫两眼就说看不懂——以这种态度我写成什么样你也看不懂。当我告诉你这是“30分钟入门教程”时，请不要试图在30秒内入门。事实是，我</summary><published>2012-01-19T03:46:00Z</published><updated>2012-01-19T03:46:00Z</updated><author><name>风雨者2</name><uri>http://www.cnblogs.com/blsong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/blsong/archive/2012/01/19/2326260.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/blsong/archive/2012/01/19/2326260.html"/><content type="html">&lt;p&gt;&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html"&gt;http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;来园子之前写的一篇&lt;a href="http://deerchao.net/tutorials/regex/regex.htm"&gt;正则表达式教程&lt;/a&gt;，部分翻译自codeproject的&lt;a href="http://www.codeproject.com/dotnet/regextutorial.asp"&gt;The 30 Minute Regex Tutorial&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff9a18;"&gt;由于评论里有过长的URL,所以本页排版比较混乱,推荐你&lt;a href="http://deerchao.net/tutorials/regex/regex.htm"&gt;到原处查看&lt;/a&gt;,看完了如果有问题,再到这里来提出.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;一些要说的话：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;如果你没有正则表达式的基础，请跟着教程&amp;ldquo;一步步来&amp;rdquo;。请不要大概地扫两眼就说看不懂&amp;mdash;&amp;mdash;以这种态度我写成什么样你也看不懂。当我告诉你这是&amp;ldquo;30分钟入门教程&amp;rdquo;时，请不要试图在30秒内入门。&lt;br /&gt;&lt;br /&gt;事实是，我身边有个才接触电脑，对操作都不是很熟练的人通过自己学习这篇教程，最后都能在文章采集系统中使用正则表达式完成任务。而且，他写的表达式中，还使用了&amp;ldquo;零宽断言&amp;rdquo;等&amp;ldquo;高级&amp;rdquo;技术。&lt;br /&gt;&lt;br /&gt;所以，如果你能具体地说明你的问题，我很愿意帮助你。但是如果你概括地说看不懂，那不是我的问题。&lt;/li&gt;&lt;li&gt;欢迎转载，但请声明作者以及来源。&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;正则表达式30分钟入门教程&lt;/strong&gt;&lt;/p&gt;&lt;p id="meta"&gt;版本：v2.31 (2009-4-11) 作者：&lt;a href="http://deerchao.net/"&gt;deerchao&lt;/a&gt; 转载请注明&lt;a href="http://deerchao.net/tutorials/regex/regex.htm"&gt;来源&lt;/a&gt;&lt;/p&gt;&lt;h2 id="contents"&gt;目录&lt;/strong&gt;&lt;/p&gt;&lt;p id="skipContents" class="note"&gt;&lt;a title="转到正文内容" href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#mission"&gt;跳过目录&lt;/a&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#mission"&gt;本文目标&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#howtouse"&gt;如何使用本教程&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#introduction"&gt;正则表达式到底是什么东西？&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#getstarted"&gt;入门&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#testing"&gt;测试正则表达式&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#metacode"&gt;元字符&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#escape"&gt;字符转义&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#repeat"&gt;重复&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#charclass"&gt;字符类&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#alternative"&gt;分枝条件&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#negation"&gt;反义&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#grouping"&gt;分组&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#backreference"&gt;后向引用&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#lookaround"&gt;零宽断言&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#negativelookaround"&gt;负向零宽断言&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#commenting"&gt;注释&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#greedyandlazy"&gt;贪婪与懒惰&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#regexoptions"&gt;处理选项&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#balancedgroup"&gt;平衡组/递归匹配&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#more"&gt;还有些什么东西没提到&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#contact"&gt;联系作者&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#resources"&gt;网上的资源及本文参考文献&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#updatelog"&gt;更新纪录&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2 id="mission"&gt;本文目标&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;30分钟内让你明白正则表达式是什么，并对它有一些基本的了解，让你可以在自己的程序或网页里使用它。&lt;/p&gt;&lt;h2 id="howtouse"&gt;如何使用本教程&lt;/strong&gt;&lt;/p&gt;&lt;p id="giveMe30Minutes" class="important note"&gt;最重要的是&amp;mdash;&amp;mdash;请给我&lt;em&gt;30分钟&lt;/em&gt;，如果你没有使用正则表达式的经验，请不要试图在30&lt;em&gt;秒&lt;/em&gt;内入门&amp;mdash;&amp;mdash;除非你是超人 :)&lt;/p&gt;&lt;p&gt;别被下面那些复杂的表达式吓倒，只要跟着我一步一步来，你会发现正则表达式其实并&lt;span lang="zh-cn"&gt;没有&lt;/span&gt;你想像中的那么困难。当然，如果你看完了这篇教程之后，发现自己明白了很多，却又几乎什么都记不得，那也是很正常的&amp;mdash;&amp;mdash;我认为，没接触过正则表达式的人在看完这篇教程后，能把提到过的语法记住80%以上的可能性为零。这里只是让你明白基本的原理，以后你还需要多练习，多使用，才能熟练掌握正则表达式。&lt;/p&gt;&lt;p&gt;除了作为入门教程之外，本文还试图成为可以在日常工作中使用的正则表达式语法参考手册。就作者本人的经历来说，这个目标还是完成得不错的&amp;mdash;&amp;mdash;你看，我自己也没能把所有的东西记下来，不是吗？&lt;/p&gt;&lt;p&gt;&lt;a id="clearButton" onclick="return clearFormats();" href="http://deerchao.net/tutorials/regex/regex.htm"&gt;清除格式&lt;/a&gt;&amp;nbsp;文本格式约定：&lt;span class="name"&gt;专业术语&lt;/span&gt;&amp;nbsp;&lt;span class="code"&gt;元字符/语法格式&lt;/span&gt;&amp;nbsp;&lt;span class="regex"&gt;正则表达式&lt;/span&gt;&amp;nbsp;&lt;span class="part"&gt;正则表达式中的一部分(用于分析)&lt;/span&gt;&amp;nbsp;&lt;span class="string"&gt;对其进行匹配的源字符串&lt;/span&gt;&amp;nbsp;&lt;span class="desc"&gt;对正则表达式或其中一部分的说明&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a id="hideButton" onclick="return hideNotes();" href="http://deerchao.net/tutorials/regex/regex.htm"&gt;隐藏边注&lt;/a&gt;&amp;nbsp;本文右边有一些注释，主要是用来提供一些相关信息，或者给没有程序员背景的读者解释一些基本概念，通常可以忽略。&lt;/p&gt;&lt;h2 id="introduction"&gt;正则表达式到底是什么东西？&lt;/strong&gt;&lt;/p&gt;&lt;p class="note"&gt;&lt;span class="name"&gt;字符&lt;/span&gt;是计算机软件处理文字时最基本的单位，可能是字母，数字，标点符号，空格，换行符，汉字等等。&lt;span class="name"&gt;字符串&lt;/span&gt;是0个或更多个字符的序列。&lt;span class="name"&gt;文本&lt;/span&gt;也就是文字，字符串。说某个字符串&lt;span class="name"&gt;匹配&lt;/span&gt;某个正则表达式，通常是指这个字符串里有一部分（或几部分分别）能满足表达式给出的条件。&lt;/p&gt;&lt;p&gt;在编写处理字符串的程序或网页时，经常会有查找符合某些复杂规则的字符串的需要。&lt;span class="name"&gt;正则表达式&lt;/span&gt;就是用于描述这些规则的工具。换句话说，正则表达式就是记录文本规则的代码。&lt;/p&gt;&lt;p&gt;很可能你使用过Windows/Dos下用于文件查找的&lt;span class="name"&gt;通配符(wildcard)&lt;/span&gt;，也就是&lt;span class="code"&gt;*&lt;/span&gt;和&lt;span class="code"&gt;?&lt;/span&gt;。如果你想查找某个目录下的所有的Word文档的话，你会搜索&lt;span style="color: red;"&gt;*.doc&lt;/span&gt;。在这里，&lt;span class="code"&gt;*&lt;/span&gt;会被解释成任意的字符串。和通配符类似，正则表达式也是用来进行文本匹配的工具，只不过比起通配符，它能更精确地描述你的需求&amp;mdash;&amp;mdash;当然，代价就是更复杂&amp;mdash;&amp;mdash;比如你可以编写一个正则表达式，用来查找&lt;span class="desc"&gt;所有以0开头，后面跟着2-3个数字，然后是一个连字号&amp;ldquo;-&amp;rdquo;，最后是7或8位数字的字符串&lt;/span&gt;(像&lt;span class="string"&gt;010-12345678&lt;/span&gt;或&lt;span class="string"&gt;0376-7654321&lt;/span&gt;)。&lt;/p&gt;&lt;h2 id="getstarted"&gt;入门&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;学习正则表达式的最好方法是从例子开始，理解例子之后再自己对例子进行修改，实验。下面给出了不少简单的例子，并对它们作了详细的说明。&lt;/p&gt;&lt;p&gt;假设你在一篇英文小说里查找&lt;span class="desc"&gt;hi&lt;/span&gt;，你可以使用正则表达式&lt;span class="regex"&gt;hi&lt;/span&gt;。&lt;/p&gt;&lt;p&gt;这几乎是最简单的正则表达式了，它可以精确匹配这样的字符串：&lt;span class="desc"&gt;由两个字符组成，前一个字符是h,后一个是i&lt;/span&gt;。通常，处理正则表达式的工具会提供一个忽略大小写的选项，如果选中了这个选项，它可以匹配&lt;span class="string"&gt;hi&lt;/span&gt;,&lt;span class="string"&gt;HI&lt;/span&gt;,&lt;span class="string"&gt;Hi&lt;/span&gt;,&lt;span class="string"&gt;hI&lt;/span&gt;这四种情况中的任意一种。&lt;/p&gt;&lt;p&gt;不幸的是，很多单词里包含&lt;span class="string"&gt;hi&lt;/span&gt;这两个连续的字符，比如&lt;span class="string"&gt;him&lt;/span&gt;,&lt;span class="string"&gt;history&lt;/span&gt;,&lt;span class="string"&gt;high&lt;/span&gt;等等。用&lt;span class="regex"&gt;hi&lt;/span&gt;来查找的话，这里边的&lt;span class="string"&gt;hi&lt;/span&gt;也会被找出来。如果要&lt;span class="desc"&gt;精确地查找hi这个单词&lt;/span&gt;的话，我们应该使用&lt;span class="regex"&gt;\bhi\b&lt;/span&gt;。&lt;/p&gt;&lt;p&gt;&lt;span class="part"&gt;\b&lt;/span&gt;是正则表达式规定的一个特殊代码（好吧，某些人叫它&lt;span class="name"&gt;元字符，metacharacter&lt;/span&gt;），代表着&lt;span class="desc"&gt;单词的开头或结尾，也就是单词的分界处&lt;/span&gt;。虽然通常英文的单词是由空格，标点符号或者换行来分隔的，但是&lt;span class="code"&gt;\b&lt;/span&gt;并不匹配这些单词分隔字符中的任何一个，它&lt;strong&gt;只匹配一个位置&lt;/strong&gt;。&lt;/p&gt;&lt;p class="note"&gt;如果需要更精确的说法，&lt;span class="code"&gt;\b&lt;/span&gt;匹配这样的位置：它的前一个字符和后一个字符不全是(一个是,一个不是或不存在)&lt;span class="code"&gt;\w&lt;/span&gt;。&lt;/p&gt;&lt;p&gt;假如你要找的是&lt;span class="desc"&gt;hi后面不远处跟着一个Lucy&lt;/span&gt;，你应该用&lt;span class="regex"&gt;\bhi\b.*\bLucy\b&lt;/span&gt;。&lt;/p&gt;&lt;p&gt;这里，&lt;span class="part"&gt;.&lt;/span&gt;是另一个元字符，匹配&lt;span class="desc"&gt;除了换行符以外的任意字符&lt;/span&gt;。&lt;span class="part"&gt;*&lt;/span&gt;同样是元字符，不过它代表的不是字符，也不是位置，而是数量&amp;mdash;&amp;mdash;它指定*&lt;span class="desc"&gt;前边的内容可以连续重复使用任意次以使整个表达式得到匹配&lt;/span&gt;。因此，&lt;span class="part"&gt;.*&lt;/span&gt;连在一起就意味着&lt;span class="desc"&gt;任意数量的不包含换行的字符&lt;/span&gt;。现在&lt;span class="regex"&gt;\bhi\b.*\bLucy\b&lt;/span&gt;的意思就很明显了：&lt;span class="desc"&gt;先是一个单词hi,然后是任意个任意字符(但不能是换行)，最后是Lucy这个单词&lt;/span&gt;。&lt;/p&gt;&lt;p class="note"&gt;换行符就是'\n',ASCII编码为10(十六进制0x0A)的字符。&lt;/p&gt;&lt;p&gt;如果同时使用其它元字符，我们就能构造出功能更强大的正则表达式。比如下面这个例子：&lt;/p&gt;&lt;p&gt;&lt;span class="regex"&gt;0\d\d-\d\d\d\d\d\d\d\d&lt;/span&gt;匹配这样的字符串：&lt;span class="desc"&gt;以0开头，然后是两个数字，然后是一个连字号&amp;ldquo;-&amp;rdquo;，最后是8个数字&lt;/span&gt;(也就是中国的电话号码。当然，这个例子只能匹配区号为3位的情形)。&lt;/p&gt;&lt;p&gt;这里的&lt;span class="part"&gt;\d&lt;/span&gt;是个新的元字符，匹配&lt;span class="desc"&gt;一位数字(0，或1，或2，或&amp;hellip;&amp;hellip;)&lt;/span&gt;。&lt;span class="part"&gt;-&lt;/span&gt;不是元字符，只匹配它本身&amp;mdash;&amp;mdash;连字符(或者减号，或者中横线，或者随你怎么称呼它)。&lt;/p&gt;&lt;p&gt;为了避免那么多烦人的重复，我们也可以这样写这个表达式：&lt;span class="regex"&gt;0\d{2}-\d{8}&lt;/span&gt;。 这里&lt;span class="part"&gt;\d&lt;/span&gt;后面的&lt;span class="part"&gt;{2}&lt;/span&gt;(&lt;span class="part"&gt;{8}&lt;/span&gt;)的意思是前面&lt;span class="part"&gt;\d&lt;/span&gt;&lt;span class="desc"&gt;必须连续重复匹配2次(8次)&lt;/span&gt;。&lt;/p&gt;&lt;h2 id="testing"&gt;测试正则表达式&lt;/strong&gt;&lt;/p&gt;&lt;div class="note"&gt;&lt;p&gt;其它可用的测试工具:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.regexbuddy.com/"&gt;RegexBuddy&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://regexpal.com/"&gt;Javascript正则表达式在线测试工具&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;如果你不觉得正则表达式很难读写的话，要么你是一个天才，要么，你不是地球人。正则表达式的语法很令人头疼，即使对经常使用它的人来说也是如此。由于难于读写，容易出错，所以找一种工具对正则表达式进行测试是很有必要的。&lt;/p&gt;&lt;p&gt;不同的环境下正则表达式的一些细节是不相同的，本教程介绍的是微软 .Net Framework 4.0 下正则表达式的行为，所以，我向你推荐我编写的.Net下的工具 &lt;a title="转到RegexTester页面" href="http://deerchao.net/tools/regex_tester/index.htm"&gt;正则表达式测试器&lt;/a&gt;。请参考该页面的说明来安装和运行该软件。&lt;/p&gt;&lt;p&gt;下面是Regex Tester运行时的截图：&lt;/p&gt;&lt;p&gt;&lt;a href="http://deerchao.net/tools/regex_tester/index.htm"&gt;&lt;img src="http://deerchao.net/images/regex_tester.png" alt="正则表达式测试器运行截图" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2 id="metacode"&gt;元字符&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;现在你已经知道几个很有用的元字符了，如&lt;span class="code"&gt;\b&lt;/span&gt;,&lt;span class="code"&gt;.&lt;/span&gt;,&lt;span class="code"&gt;*&lt;/span&gt;，还有&lt;span class="code"&gt;\d&lt;/span&gt;.正则表达式里还有更多的元字符，比如&lt;span class="code"&gt;\s&lt;/span&gt;匹配&lt;span class="desc"&gt;任意的空白符，包括空格，制表符(Tab)，换行符，中文全角空格等&lt;/span&gt;。&lt;span class="code"&gt;\w&lt;/span&gt;匹配&lt;span class="desc"&gt;字母或数字或下划线或汉字等&lt;/span&gt;。&lt;/p&gt;&lt;p class="note important"&gt;对中文/汉字的特殊处理是由.Net提供的正则表达式引擎支持的，其它环境下的具体情况请查看相关文档。&lt;/p&gt;&lt;p&gt;下面来看看更多的例子：&lt;/p&gt;&lt;p&gt;&lt;span class="regex"&gt;\ba\w*\b&lt;/span&gt;匹配&lt;span class="desc"&gt;以字母&lt;span class="part"&gt;a&lt;/span&gt;开头的单词&amp;mdash;&amp;mdash;先是某个单词开始处(&lt;span class="part"&gt;\b&lt;/span&gt;)，然后是字母&lt;span class="part"&gt;a&lt;/span&gt;,然后是任意数量的字母或数字(&lt;span class="part"&gt;\w*&lt;/span&gt;)，最后是单词结束处(&lt;span class="part"&gt;\b&lt;/span&gt;)&lt;/span&gt;。&lt;/p&gt;&lt;p class="note"&gt;好吧，现在我们说说正则表达式里的单词是什么意思吧：就是不少于一个的连续的&lt;span class="code"&gt;\w&lt;/span&gt;。不错，这与学习英文时要背的成千上万个同名的东西的确关系不大 :)&lt;/p&gt;&lt;p&gt;&lt;span class="regex"&gt;\d+&lt;/span&gt;匹配&lt;span class="desc"&gt;1个或更多连续的数字&lt;/span&gt;。这里的&lt;span class="part"&gt;+&lt;/span&gt;是和&lt;span class="code"&gt;*&lt;/span&gt;类似的元字符，不同的是&lt;span class="code"&gt;*&lt;/span&gt;匹配&lt;span class="desc"&gt;重复任意次(可能是0次)&lt;/span&gt;，而&lt;span class="code"&gt;+&lt;/span&gt;则匹配&lt;span class="desc"&gt;重复1次或更多次&lt;/span&gt;。&lt;/p&gt;&lt;p&gt;&lt;span class="regex"&gt;\b\w{6}\b&lt;/span&gt; 匹配&lt;span class="desc"&gt;刚好6个字符的单词&lt;/span&gt;。&lt;/p&gt;&lt;table cellspacing="0"&gt;&lt;caption&gt;表1.常用的元字符&lt;/caption&gt;&lt;thead&gt;&lt;tr&gt;&lt;th scope="col"&gt;代码&lt;/th&gt;&lt;th scope="col"&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;.&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;匹配除换行符以外的任意字符&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;\w&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;匹配字母或数字或下划线或汉字&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;\s&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;匹配任意的空白符&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;\d&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;匹配数字&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;\b&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;匹配单词的开始或结束&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;^&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;匹配字符串的开始&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;$&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;匹配字符串的结束&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p class="note"&gt;正则表达式引擎通常会提供一个&amp;ldquo;测试指定的字符串是否匹配一个正则表达式&amp;rdquo;的方法，如JavaScript里的RegExp.test()方法或.NET里的Regex.IsMatch()方法。这里的匹配是指是字符串里有没有符合表达式规则的部分。如果不使用&lt;span class="code"&gt;^&lt;/span&gt;和&lt;span class="code"&gt;$&lt;/span&gt;的话，对于&lt;span class="regex"&gt;\d{5,12}&lt;/span&gt;而言，使用这样的方法就只能保证字符串里&lt;span class="desc"&gt;包含5到12连续位数字&lt;/span&gt;，而不是整个字符串就是5到12位数字。&lt;/p&gt;&lt;p&gt;元字符&lt;span class="code"&gt;^&lt;/span&gt;（和数字6在同一个键位上的符号）和&lt;span class="code"&gt;$&lt;/span&gt;都匹配一个位置，这和&lt;span class="code"&gt;\b&lt;/span&gt;有点类似。&lt;span class="code"&gt;^&lt;/span&gt;匹配你要用来查找的字符串的开头，&lt;span class="code"&gt;$&lt;/span&gt;匹配结尾。这两个代码在验证输入的内容时非常有用，比如一个网站如果要求你填写的QQ号必须为5位到12位数字时，可以使用：&lt;span class="regex"&gt;^\d{5,12}$&lt;/span&gt;。&lt;/p&gt;&lt;p&gt;这里的&lt;span class="part"&gt;{5,12}&lt;/span&gt;和前面介绍过的&lt;span class="part"&gt;{2}&lt;/span&gt;是类似的，只不过&lt;span class="part"&gt;{2}&lt;/span&gt;匹配&lt;span class="desc"&gt;只能不多不少重复2次&lt;/span&gt;，&lt;span class="part"&gt;{5,12}&lt;/span&gt;则是&lt;span class="desc"&gt;重复的次数不能少于5次，不能多于12次&lt;/span&gt;，否则都不匹配。&lt;/p&gt;&lt;p&gt;因为使用了&lt;span class="part"&gt;^&lt;/span&gt;和&lt;span class="part"&gt;$&lt;/span&gt;，所以输入的整个字符串都要用来和&lt;span class="part"&gt;\d{5,12}&lt;/span&gt;来匹配，也就是说整个输入&lt;span class="desc"&gt;必须是5到12个数字&lt;/span&gt;，因此如果输入的QQ号能匹配这个正则表达式的话，那就符合要求了。&lt;/p&gt;&lt;p&gt;和忽略大小写的选项类似，有些正则表达式处理工具还有一个处理多行的选项。如果选中了这个选项，&lt;span class="code"&gt;^&lt;/span&gt;和&lt;span class="code"&gt;$&lt;/span&gt;的意义就变成了&lt;span class="desc"&gt;匹配行的开始处和结束处&lt;/span&gt;。&lt;/p&gt;&lt;h2 id="escape"&gt;字符转义&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你想查找元字符本身的话，比如你查找&lt;span class="desc"&gt;.&lt;/span&gt;,或者&lt;span class="desc"&gt;*&lt;/span&gt;,就出现了问题：你没办法指定它们，因为它们会被解释成别的意思。这时你就得使用&lt;span class="code"&gt;\&lt;/span&gt;来取消这些字符的特殊意义。因此，你应该使用&lt;span class="regex"&gt;\.&lt;/span&gt;和&lt;span class="regex"&gt;\*&lt;/span&gt;。当然，要查找&lt;span class="desc"&gt;\&lt;/span&gt;本身，你也得用&lt;span class="regex"&gt;\\&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;例如：&lt;span class="regex"&gt;unibetter\.com&lt;/span&gt;匹配&lt;span class="desc"&gt;unibetter.com&lt;/span&gt;，&lt;span class="regex"&gt;C:\\Windows&lt;/span&gt;匹配&lt;span class="desc"&gt;C:\Windows&lt;/span&gt;。&lt;/p&gt;&lt;h2 id="repeat"&gt;重复&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;你已经看过了前面的&lt;span class="code"&gt;*&lt;/span&gt;,&lt;span class="code"&gt;+&lt;/span&gt;,&lt;span class="code"&gt;{2}&lt;/span&gt;,&lt;span class="code"&gt;{5,12}&lt;/span&gt;这几个匹配重复的方式了。下面是正则表达式中所有的限定符(指定数量的代码，例如*,{5,12}等)：&lt;/p&gt;&lt;table cellspacing="0"&gt;&lt;caption&gt;表2.常用的限定符&lt;/caption&gt;&lt;thead&gt;&lt;tr&gt;&lt;th scope="col"&gt;代码/语法&lt;/th&gt;&lt;th scope="col"&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;*&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;重复零次或更多次&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;+&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;重复一次或更多次&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;?&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;重复零次或一次&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;{n}&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;重复n次&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;{n,}&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;重复n次或更多次&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;{n,m}&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;重复n到m次&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;下面是一些使用重复的例子：&lt;/p&gt;&lt;p&gt;&lt;span class="regex"&gt;Windows\d+&lt;/span&gt;匹配&lt;span class="desc"&gt;Windows后面跟1个或更多数字&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="regex"&gt;^\w+&lt;/span&gt;匹配&lt;span class="desc"&gt;一行的第一个单词(或整个字符串的第一个单词，具体匹配哪个意思得看选项设置)&lt;/span&gt;&lt;/p&gt;&lt;h2 id="charclass"&gt;字符类&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;要想查找数字，字母或数字，空白是很简单的，因为已经有了对应这些字符集合的元字符，但是如果你想匹配没有预定义元字符的字符集合(比如元音字母a,e,i,o,u),应该怎么办？&lt;/p&gt;&lt;p&gt;很简单，你只需要在方括号里列出它们就行了，像&lt;span class="regex"&gt;[aeiou]&lt;/span&gt;就匹配&lt;span class="desc"&gt;任何一个英文元音字母&lt;/span&gt;，&lt;span class="regex"&gt;[.?!]&lt;/span&gt;匹配&lt;span class="desc"&gt;标点符号(.或?或!)&lt;/span&gt;。&lt;/p&gt;&lt;p&gt;我们也可以轻松地指定一个字符&lt;span class="name"&gt;范围&lt;/span&gt;，像&lt;span class="regex"&gt;[0-9]&lt;/span&gt;代表的含意与&lt;span class="regex"&gt;\d&lt;/span&gt;就是完全一致的：&lt;span class="desc"&gt;一位数字&lt;/span&gt;；同理&lt;span class="regex"&gt;[a-z0-9A-Z_]&lt;/span&gt;也完全等同于&lt;span class="code"&gt;\w&lt;/span&gt;（如果只考虑英文的话）。&lt;/p&gt;&lt;p&gt;下面是一个更复杂的表达式：&lt;span class="regex"&gt;\(?0\d{2}[) -]?\d{8}&lt;/span&gt;。&lt;/p&gt;&lt;p class="note"&gt;&amp;ldquo;(&amp;rdquo;和&amp;ldquo;)&amp;rdquo;也是元字符，后面的&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#grouping"&gt;分组节&lt;/a&gt;里会提到，所以在这里需要使用&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#escape"&gt;转义&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;这个表达式可以匹配&lt;span class="desc"&gt;几种格式的电话号码&lt;/span&gt;，像&lt;span class="string"&gt;(010)88886666&lt;/span&gt;，或&lt;span class="string"&gt;022-22334455&lt;/span&gt;，或&lt;span class="string"&gt;02912345678&lt;/span&gt;等。我们对它进行一些分析吧：首先是一个转义字符&lt;span class="part"&gt;\(&lt;/span&gt;,它能出现0次或1次(&lt;span class="part"&gt;?&lt;/span&gt;),然后是一个&lt;span class="part"&gt;0&lt;/span&gt;，后面跟着2个数字(&lt;span class="part"&gt;\d{2}&lt;/span&gt;)，然后是&lt;span class="part"&gt;)&lt;/span&gt;或&lt;span class="part"&gt;-&lt;/span&gt;或&lt;span class="part"&gt;空格&lt;/span&gt;中的一个，它出现1次或不出现(&lt;span class="part"&gt;?&lt;/span&gt;)，最后是8个数字(&lt;span class="part"&gt;\d{8}&lt;/span&gt;)。&lt;/p&gt;&lt;h2 id="alternative"&gt;分枝条件&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;不幸的是，刚才那个表达式也能匹配&lt;span class="string"&gt;010)12345678&lt;/span&gt;或&lt;span class="string"&gt;(022-87654321&lt;/span&gt;这样的&amp;ldquo;不正确&amp;rdquo;的格式。要解决这个问题，我们需要用到&lt;span class="name"&gt;分枝条件&lt;/span&gt;。正则表达式里的&lt;span class="name"&gt;分枝条件&lt;/span&gt;指的是有几种规则，如果满足其中任意一种规则都应该当成匹配，具体方法是用&lt;span class="code"&gt;|&lt;/span&gt;把不同的规则分隔开。听不明白？没关系，看例子：&lt;/p&gt;&lt;p&gt;&lt;span class="regex"&gt;0\d{2}-\d{8}|0\d{3}-\d{7}&lt;/span&gt;这个表达式能&lt;span class="desc"&gt;匹配两种以连字号分隔的电话号码：一种是三位区号，8位本地号(如010-12345678)，一种是4位区号，7位本地号(0376-2233445)&lt;/span&gt;。&lt;/p&gt;&lt;p&gt;&lt;span class="regex"&gt;\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}&lt;/span&gt;这个表达式&lt;span class="desc"&gt;匹配3位区号的电话号码，其中区号可以用小括号括起来，也可以不用，区号与本地号间可以用连字号或空格间隔，也可以没有间隔&lt;/span&gt;。你可以试试用分枝条件把这个表达式扩展成也支持4位区号的。&lt;/p&gt;&lt;p&gt;&lt;span class="regex"&gt;\d{5}-\d{4}|\d{5}&lt;/span&gt;这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字，或者用连字号间隔的9位数字。之所以要给出这个例子是因为它能说明一个问题：&lt;strong&gt;使用分枝条件时，要注意各个条件的顺序&lt;/strong&gt;。如果你把它改成&lt;span class="regex"&gt;\d{5}|\d{5}-\d{4}&lt;/span&gt;的话，那么就只会匹配5位的邮编(以及9位邮编的前5位)。原因是匹配分枝条件时，将会从左到右地测试每个条件，如果满足了某个分枝的话，就不会去再管其它的条件了。&lt;/p&gt;&lt;h2 id="grouping"&gt;分组&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们已经提到了怎么重复单个字符（直接在字符后面加上限定符就行了）；但如果想要重复多个字符又该怎么办？你可以用小括号来指定&lt;span class="name"&gt;子表达式&lt;/span&gt;(也叫做&lt;span class="name"&gt;分组&lt;/span&gt;)，然后你就可以指定这个子表达式的重复次数了，你也可以对子表达式进行其它一些操作(后面会有介绍)。&lt;/p&gt;&lt;p&gt;&lt;span class="regex"&gt;(\d{1,3}\.){3}\d{1,3}&lt;/span&gt;是一个&lt;span class="desc"&gt;简单的IP地址匹配&lt;/span&gt;表达式。要理解这个表达式，请按下列顺序分析它：&lt;span class="part"&gt;\d{1,3}&lt;/span&gt;匹配&lt;span class="desc"&gt;1到3位的数字&lt;/span&gt;，&lt;span class="part"&gt;(\d{1,3}\.){3}&lt;/span&gt;匹配&lt;span class="desc"&gt;三位数字加上一个英文句号(这个整体也就是这个&lt;span class="name"&gt;分组&lt;/span&gt;)重复3次&lt;/span&gt;，最后再加上&lt;span class="desc"&gt;一个一到三位的数字&lt;/span&gt;(&lt;span class="part"&gt;\d{1,3}&lt;/span&gt;)。&lt;/p&gt;&lt;p class="note"&gt;IP地址中每个数字都不能大于255，大家千万不要被《24》第三季的编剧给忽悠了&amp;hellip;&amp;hellip;&lt;/p&gt;&lt;p&gt;不幸的是，它也将匹配&lt;span class="string"&gt;256.300.888.999&lt;/span&gt;这种不可能存在的IP地址。如果能使用算术比较的话，或许能简单地解决这个问题，但是正则表达式中并不提供关于数学的任何功能，所以只能使用冗长的分组，选择，字符类来描述一个正确的IP地址：&lt;span class="regex"&gt;((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)&lt;/span&gt;。&lt;/p&gt;&lt;p&gt;理解这个表达式的关键是理解&lt;span class="part"&gt;2[0-4]\d|25[0-5]|[01]?\d\d?&lt;/span&gt;，这里我就不细说了，你自己应该能分析得出来它的意义。&lt;/p&gt;&lt;h2 id="negation"&gt;反义&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外，其它任意字符都行的情况，这时需要用到&lt;span class="name"&gt;反义&lt;/span&gt;：&lt;/p&gt;&lt;table cellspacing="0"&gt;&lt;caption&gt;表3.常用的反义代码&lt;/caption&gt;&lt;thead&gt;&lt;tr&gt;&lt;th scope="col"&gt;代码/语法&lt;/th&gt;&lt;th scope="col"&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;\W&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;匹配任意不是字母，数字，下划线，汉字的字符&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;\S&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;匹配任意不是空白符的字符&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;\D&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;匹配任意非数字的字符&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;\B&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;匹配不是单词开头或结束的位置&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;[^x]&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;匹配除了x以外的任意字符&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;[^aeiou]&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;匹配除了aeiou这几个字母以外的任意字符&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;例子：&lt;span class="regex"&gt;\S+&lt;/span&gt;匹配&lt;span class="desc"&gt;不包含空白符的字符串&lt;/span&gt;。&lt;/p&gt;&lt;p&gt;&lt;span class="regex"&gt;&amp;lt;a[^&amp;gt;]+&amp;gt;&lt;/span&gt;匹配&lt;span class="desc"&gt;用尖括号括起来的以a开头的字符串&lt;/span&gt;。&lt;/p&gt;&lt;h2 id="backreference"&gt;后向引用&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;使用小括号指定一个子表达式后，&lt;strong&gt;匹配这个子表达式的文本&lt;/strong&gt;(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下，每个分组会自动拥有一个&lt;span class="name"&gt;组号&lt;/span&gt;，规则是：从左向右，以分组的左括号为标志，第一个出现的分组的组号为1，第二个为2，以此类推。&lt;/p&gt;&lt;div class="note"&gt;&lt;p&gt;呃&amp;hellip;&amp;hellip;其实,组号分配还不像我刚说得那么简单：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;分组0对应整个正则表达式&lt;/li&gt;&lt;li&gt;实际上组号分配过程是要从左向右扫描两遍的：第一遍只给未命名组分配，第二遍只给命名组分配－－因此所有命名组的组号都大于未命名的组号&lt;/li&gt;&lt;li&gt;你可以使用&lt;span class="code"&gt;(?:exp)&lt;/span&gt;这样的语法来剥夺一个分组对组号分配的参与权．&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;span class="name"&gt;后向引用&lt;/span&gt;用于重复搜索前面某个分组匹配的文本。例如，&lt;span class="part"&gt;\1&lt;/span&gt;代表&lt;span class="desc"&gt;分组1匹配的文本&lt;/span&gt;。难以理解？请看示例：&lt;/p&gt;&lt;p&gt;&lt;span class="regex"&gt;\b(\w+)\b\s+\1\b&lt;/span&gt;可以用来匹配&lt;span class="desc"&gt;重复的单词&lt;/span&gt;，像&lt;span class="string"&gt;go go&lt;/span&gt;, 或者&lt;span class="string"&gt;kitty kitty&lt;/span&gt;。这个表达式首先是&lt;span class="desc"&gt;一个单词&lt;/span&gt;，也就是&lt;span class="desc"&gt;单词开始处和结束处之间的多于一个的字母或数字&lt;/span&gt;(&lt;span class="part"&gt;\b(\w+)\b&lt;/span&gt;)，这个单词会被捕获到编号为1的分组中，然后是&lt;span class="desc"&gt;1个或几个空白符&lt;/span&gt;(&lt;span class="part"&gt;\s+&lt;/span&gt;)，最后是&lt;span class="desc"&gt;分组1中捕获的内容（也就是前面匹配的那个单词）&lt;/span&gt;(&lt;span class="part"&gt;\1&lt;/span&gt;)。&lt;/p&gt;&lt;p&gt;你也可以自己指定子表达式的&lt;span class="name"&gt;组名&lt;/span&gt;。要指定一个子表达式的组名，请使用这样的语法：&lt;span class="code"&gt;(?&amp;lt;Word&amp;gt;\w+)&lt;/span&gt;(或者把尖括号换成&lt;span class="code"&gt;'&lt;/span&gt;也行：&lt;span class="code"&gt;(?'Word'\w+)&lt;/span&gt;),这样就把&lt;span class="part"&gt;\w+&lt;/span&gt;的组名指定为&lt;span class="part"&gt;Word&lt;/span&gt;了。要反向引用这个分组&lt;span class="name"&gt;捕获&lt;/span&gt;的内容，你可以使用&lt;span class="code"&gt;\k&amp;lt;Word&amp;gt;&lt;/span&gt;,所以上一个例子也可以写成这样：&lt;span class="regex"&gt;\b(?&amp;lt;Word&amp;gt;\w+)\b\s+\k&amp;lt;Word&amp;gt;\b&lt;/span&gt;。&lt;/p&gt;&lt;p&gt;使用小括号的时候，还有很多特定用途的语法。下面列出了最常用的一些：&lt;/p&gt;&lt;table cellspacing="0"&gt;&lt;caption&gt;表4.常用分组语法&lt;/caption&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th scope="col"&gt;分类&lt;/th&gt;&lt;th scope="col"&gt;代码/语法&lt;/th&gt;&lt;th scope="col"&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th rowspan="3"&gt;捕获&lt;/th&gt;&lt;td&gt;&lt;span class="code"&gt;(exp)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;匹配exp,并捕获文本到自动命名的组里&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;(?&amp;lt;name&amp;gt;exp)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;匹配exp,并捕获文本到名称为name的组里，也可以写成(?'name'exp)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;(?:exp)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;匹配exp,不捕获匹配的文本，也不给此分组分配组号&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th rowspan="4"&gt;零宽断言&lt;/th&gt;&lt;td&gt;&lt;span class="code"&gt;(?=exp)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;匹配exp前面的位置&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;(?&amp;lt;=exp)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;匹配exp后面的位置&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;(?!exp)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;匹配后面跟的不是exp的位置&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;(?&amp;lt;!exp)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;匹配前面不是exp的位置&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;注释&lt;/th&gt;&lt;td&gt;&lt;span class="code"&gt;(?#comment)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;这种类型的分组不对正则表达式的处理产生任何影响，用于提供注释让人阅读&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;我们已经讨论了前两种语法。第三个&lt;span class="code"&gt;(?:exp)&lt;/span&gt;不会改变正则表达式的处理方式，只是这样的组匹配的内容&lt;span class="desc"&gt;不会像前两种那样被捕获到某个组里面，也不会拥有组号&lt;/span&gt;。&amp;ldquo;我为什么会想要这样做？&amp;rdquo;&amp;mdash;&amp;mdash;好问题，你觉得为什么呢？&lt;/p&gt;&lt;h2 id="lookaround"&gt;零宽断言&lt;/strong&gt;&lt;/p&gt;&lt;p class="note"&gt;地球人，是不是觉得这些术语名称太复杂，太难记了？我也有同感。知道有这么一种东西就行了，它叫什么，随它去吧！人若无名，便可专心练剑；物若无名，便可随意取舍&amp;hellip;&amp;hellip;&lt;/p&gt;&lt;p&gt;接下来的四个用于查找在某些内容(但并不包括这些内容)之前或之后的东西，也就是说它们像&lt;span class="code"&gt;\b&lt;/span&gt;,&lt;span class="code"&gt;^&lt;/span&gt;,&lt;span class="code"&gt;$&lt;/span&gt;那样用于指定一个位置，这个位置应该满足一定的条件(即断言)，因此它们也被称为&lt;span class="name"&gt;零宽断言&lt;/span&gt;。最好还是拿例子来说明吧：&lt;/p&gt;&lt;p class="note"&gt;断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配。&lt;/p&gt;&lt;p&gt;&lt;span class="code"&gt;(?=exp)&lt;/span&gt;也叫&lt;span class="name"&gt;零宽度正预测先行断言&lt;/span&gt;，它&lt;span class="desc"&gt;断言自身出现的位置的后面能匹配表达式exp&lt;/span&gt;。比如&lt;span class="regex"&gt;\b\w+(?=ing\b)&lt;/span&gt;，匹配&lt;span class="desc"&gt;以ing结尾的单词的前面部分(除了ing以外的部分)&lt;/span&gt;，如查找&lt;span class="string"&gt;I'm singing while you're dancing.&lt;/span&gt;时，它会匹配&lt;span class="desc"&gt;sing&lt;/span&gt;和&lt;span class="desc"&gt;danc&lt;/span&gt;。&lt;/p&gt;&lt;p&gt;&lt;span class="code"&gt;(?&amp;lt;=exp)&lt;/span&gt;也叫&lt;span class="name"&gt;零宽度正回顾后发断言&lt;/span&gt;，它&lt;span class="desc"&gt;断言自身出现的位置的前面能匹配表达式exp&lt;/span&gt;。比如&lt;span class="regex"&gt;(?&amp;lt;=\bre)\w+\b&lt;/span&gt;会匹配&lt;span class="desc"&gt;以re开头的单词的后半部分(除了re以外的部分)&lt;/span&gt;，例如在查找&lt;span class="string"&gt;reading a book&lt;/span&gt;时，它匹配&lt;span class="desc"&gt;ading&lt;/span&gt;。&lt;/p&gt;&lt;p&gt;假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了)，你可以这样查找需要在前面和里面添加逗号的部分：&lt;span class="regex"&gt;((?&amp;lt;=\d)\d{3})+\b&lt;/span&gt;，用它对&lt;span class="string"&gt;1234567890&lt;/span&gt;进行查找时结果是&lt;span class="desc"&gt;234567890&lt;/span&gt;。&lt;/p&gt;&lt;p&gt;下面这个例子同时使用了这两种断言：&lt;span class="regex"&gt;(?&amp;lt;=\s)\d+(?=\s)&lt;/span&gt;匹配&lt;span class="desc"&gt;以空白符间隔的数字(再次强调，不包括这些空白符)&lt;/span&gt;。&lt;/p&gt;&lt;h2 id="negativelookaround"&gt;负向零宽断言&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;前面我们提到过怎么查找&lt;strong&gt;不是某个字符或不在某个字符类里&lt;/strong&gt;的字符的方法(反义)。但是如果我们只是想要&lt;strong&gt;确保某个字符没有出现，但并不想去匹配它&lt;/strong&gt;时怎么办？例如，如果我们想查找这样的单词--它里面出现了字母q,但是q后面跟的不是字母u,我们可以尝试这样：&lt;/p&gt;&lt;p&gt;&lt;span class="regex"&gt;\b\w*q[^u]\w*\b&lt;/span&gt;匹配&lt;span class="desc"&gt;包含&lt;strong&gt;后面不是字母u的字母q&lt;/strong&gt;的单词&lt;/span&gt;。但是如果多做测试(或者你思维足够敏锐，直接就观察出来了)，你会发现，如果q出现在单词的结尾的话，像&lt;strong&gt;Iraq&lt;/strong&gt;,&lt;strong&gt;Benq&lt;/strong&gt;，这个表达式就会出错。这是因为&lt;span class="part"&gt;[^u]&lt;/span&gt;总要匹配一个字符，所以如果q是单词的最后一个字符的话，后面的&lt;span class="part"&gt;[^u]&lt;/span&gt;将会匹配q后面的单词分隔符(可能是空格，或者是句号或其它的什么)，后面的&lt;span class="part"&gt;\w*\b&lt;/span&gt;将会匹配下一个单词，于是&lt;span class="regex"&gt;\b\w*q[^u]\w*\b&lt;/span&gt;就能匹配整个&lt;span class="string"&gt;Iraq fighting&lt;/span&gt;。&lt;span class="name"&gt;负向零宽断言&lt;/span&gt;能解决这样的问题，因为它只匹配一个位置，并不&lt;strong&gt;消费&lt;/strong&gt;任何字符。现在，我们可以这样来解决这个问题：&lt;span class="regex"&gt;\b\w*q(?!u)\w*\b&lt;/span&gt;。&lt;/p&gt;&lt;p&gt;&lt;span class="name"&gt;零宽度负预测先行断言&lt;/span&gt;&lt;span class="code"&gt;(?!exp)&lt;/span&gt;，&lt;span class="desc"&gt;断言此位置的后面不能匹配表达式exp&lt;/span&gt;。例如：&lt;span class="regex"&gt;\d{3}(?!\d)&lt;/span&gt;匹配&lt;span class="desc"&gt;三位数字，而且这三位数字的后面不能是数字&lt;/span&gt;；&lt;span class="regex"&gt;\b((?!abc)\w)+\b&lt;/span&gt;匹配&lt;span class="desc"&gt;不包含连续字符串abc的单词&lt;/span&gt;。&lt;/p&gt;&lt;p&gt;同理，我们可以用&lt;span class="code"&gt;(?&amp;lt;!exp)&lt;/span&gt;,&lt;span class="name"&gt;零宽度负回顾后发断言&lt;/span&gt;来&lt;span class="desc"&gt;断言此位置的前面不能匹配表达式exp&lt;/span&gt;：&lt;span class="regex"&gt;(?&amp;lt;![a-z])\d{7}&lt;/span&gt;匹配&lt;span class="desc"&gt;前面不是小写字母的七位数字&lt;/span&gt;。&lt;/p&gt;&lt;p class="note"&gt;请详细分析表达式&lt;span class="regex"&gt;(?&amp;lt;=&amp;lt;(\w+)&amp;gt;).*(?=&amp;lt;\/\1&amp;gt;)&lt;/span&gt;，这个表达式最能表现零宽断言的真正用途。&lt;/p&gt;&lt;p&gt;一个更复杂的例子：&lt;span class="regex"&gt;(?&amp;lt;=&amp;lt;(\w+)&amp;gt;).*(?=&amp;lt;\/\1&amp;gt;)&lt;/span&gt;匹配&lt;span class="desc"&gt;不包含属性的简单HTML标签内里的内容&lt;/span&gt;。&lt;span class="code"&gt;(?&amp;lt;=&amp;lt;(\w+)&amp;gt;)&lt;/span&gt;指定了这样的&lt;span class="name"&gt;前缀&lt;/span&gt;：&lt;span class="desc"&gt;被尖括号括起来的单词&lt;/span&gt;(比如可能是&amp;lt;b&amp;gt;)，然后是&lt;span class="part"&gt;.*&lt;/span&gt;(任意的字符串),最后是一个&lt;span class="name"&gt;后缀&lt;/span&gt;&lt;span class="part"&gt;(?=&amp;lt;\/\1&amp;gt;)&lt;/span&gt;。注意后缀里的&lt;span class="part"&gt;\/&lt;/span&gt;，它用到了前面提过的字符转义；&lt;span class="part"&gt;\1&lt;/span&gt;则是一个反向引用，引用的正是&lt;span class="desc"&gt;捕获的第一组&lt;/span&gt;，前面的&lt;span class="part"&gt;(\w+)&lt;/span&gt;匹配的内容，这样如果前缀实际上是&amp;lt;b&amp;gt;的话，后缀就是&amp;lt;/b&amp;gt;了。整个表达式匹配的是&amp;lt;b&amp;gt;和&amp;lt;/b&amp;gt;之间的内容(再次提醒，不包括前缀和后缀本身)。&lt;/p&gt;&lt;h2 id="commenting"&gt;注释&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;小括号的另一种用途是通过语法&lt;span class="code"&gt;(?#comment)&lt;/span&gt;来包含注释。例如：&lt;span class="regex"&gt;2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)&lt;/span&gt;。&lt;/p&gt;&lt;p&gt;要包含注释的话，最好是启用&amp;ldquo;忽略模式里的空白符&amp;rdquo;选项，这样在编写表达式时能任意的添加空格，Tab，换行，而实际使用时这些都将被忽略。启用这个选项后，在#后面到这一行结束的所有文本都将被当成注释忽略掉。例如，我们可以前面的一个表达式写成这样：&lt;/p&gt;      (?&amp;lt;=    # 断言要匹配的文本的前缀&lt;br/&gt;      &amp;lt;(\w+)&amp;gt; # 查找尖括号括起来的字母或数字(即HTML/XML标签)&lt;br/&gt;      )       # 前缀结束&lt;br/&gt;      .*      # 匹配任意文本&lt;br/&gt;      (?=     # 断言要匹配的文本的后缀&lt;br/&gt;      &amp;lt;\/\1&amp;gt;  # 查找尖括号括起来的内容：前面是一个"/"，后面是先前捕获的标签&lt;br/&gt;      )       # 后缀结束&lt;h2 id="greedyandlazy"&gt;贪婪与懒惰&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当正则表达式中包含能接受重复的限定符时，通常的行为是（在使整个表达式能得到匹配的前提下）匹配&lt;strong&gt;尽可能多&lt;/strong&gt;的字符。以这个表达式为例：&lt;span class="regex"&gt;a.*b&lt;/span&gt;，它将会匹配&lt;span class="desc"&gt;最长的以a开始，以b结束的字符串&lt;/span&gt;。如果用它来搜索&lt;span class="string"&gt;aabab&lt;/span&gt;的话，它会匹配整个字符串&lt;span class="desc"&gt;aabab&lt;/span&gt;。这被称为&lt;span class="name"&gt;贪婪&lt;/span&gt;匹配。&lt;/p&gt;&lt;p&gt;有时，我们更需要&lt;span class="name"&gt;懒惰&lt;/span&gt;匹配，也就是匹配&lt;strong&gt;尽可能少&lt;/strong&gt;的字符。前面给出的限定符都可以被转化为懒惰匹配模式，只要在它后面加上一个问号&lt;span class="code"&gt;?&lt;/span&gt;。这样&lt;span class="regex"&gt;.*?&lt;/span&gt;就意味着&lt;span class="desc"&gt;匹配任意数量的重复，但是在能使整个匹配成功的前提下使用最少的重复&lt;/span&gt;。现在看看懒惰版的例子吧：&lt;/p&gt;&lt;p&gt;&lt;span class="regex"&gt;a.*?b&lt;/span&gt;匹配&lt;span class="desc"&gt;最短的，以a开始，以b结束的字符串&lt;/span&gt;。如果把它应用于&lt;span class="string"&gt;aabab&lt;/span&gt;的话，它会匹配&lt;span class="desc"&gt;aab（第一到第三个字符）&lt;/span&gt;和&lt;span class="desc"&gt;ab（第四到第五个字符）&lt;/span&gt;。&lt;/p&gt;&lt;p class="note"&gt;为什么第一个匹配是aab（第一到第三个字符）而不是ab（第二到第三个字符）？简单地说，因为正则表达式有另一条规则，比懒惰／贪婪规则的优先级更高：最先开始的匹配拥有最高的优先权&amp;mdash;&amp;mdash;The match that begins earliest wins。&lt;/p&gt;&lt;table cellspacing="0"&gt;&lt;caption&gt;表5.懒惰限定符&lt;/caption&gt;&lt;thead&gt;&lt;tr&gt;&lt;th scope="col"&gt;代码/语法&lt;/th&gt;&lt;th scope="col"&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;*?&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;重复任意次，但尽可能少重复&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;+?&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;重复1次或更多次，但尽可能少重复&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;??&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;重复0次或1次，但尽可能少重复&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;{n,m}?&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;重复n到m次，但尽可能少重复&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;{n,}?&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;重复n次以上，但尽可能少重复&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id="regexoptions"&gt;处理选项&lt;/strong&gt;&lt;/p&gt;&lt;p class="note"&gt;在C#中，你可以使用&lt;a title="MSDN 相关文档" href="http://msdn2.microsoft.com/zh-cn/library/h5845fdz.aspx"&gt;Regex(String, RegexOptions)构造函数&lt;/a&gt;来设置正则表达式的处理选项。如：Regex regex = new Regex(@"\ba\w{6}\b", RegexOptions.IgnoreCase);&lt;/p&gt;&lt;p&gt;上面介绍了几个选项如忽略大小写，处理多行等，这些选项能用来改变处理正则表达式的方式。下面是.Net中常用的正则表达式选项：&lt;/p&gt;&lt;table cellspacing="0"&gt;&lt;caption&gt;表6.常用的处理选项&lt;/caption&gt;&lt;thead&gt;&lt;tr&gt;&lt;th scope="col"&gt;名称&lt;/th&gt;&lt;th scope="col"&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;IgnoreCase(忽略大小写)&lt;/td&gt;&lt;td&gt;匹配时不区分大小写。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Multiline(多行模式)&lt;/td&gt;&lt;td&gt;更改&lt;span class="code"&gt;^&lt;/span&gt;和&lt;span class="code"&gt;$&lt;/span&gt;的含义，使它们分别在任意一行的行首和行尾匹配，而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,&lt;span class="code"&gt;$&lt;/span&gt;的精确含意是:匹配\n之前的位置以及字符串结束前的位置.)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Singleline(单行模式)&lt;/td&gt;&lt;td&gt;更改&lt;span class="code"&gt;.&lt;/span&gt;的含义，使它与每一个字符匹配（包括换行符\n）。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;IgnorePatternWhitespace(忽略空白)&lt;/td&gt;&lt;td&gt;忽略表达式中的非转义空白并启用由&lt;span class="code"&gt;#&lt;/span&gt;标记的注释。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ExplicitCapture(显式捕获)&lt;/td&gt;&lt;td&gt;仅捕获已被显式命名的组。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;一个经常被问到的问题是：是不是只能同时使用多行模式和单行模式中的一种？答案是：不是。这两个选项之间没有任何关系，除了它们的名字比较相似（以至于让人感到疑惑）以外。&lt;/p&gt;&lt;h2 id="balancedgroup"&gt;平衡组/递归匹配&lt;/strong&gt;&lt;/p&gt;&lt;p class="important note"&gt;这里介绍的平衡组语法是由.Net Framework支持的；其它语言／库不一定支持这种功能，或者支持此功能但需要使用不同的语法。&lt;/p&gt;&lt;p&gt;有时我们需要匹配像&lt;span class="desc"&gt;( 100 * ( 50 + 15 ) )这样的可嵌套的层次性结构&lt;/span&gt;，这时简单地使用&lt;span class="code"&gt;\(.+\)&lt;/span&gt;则只会匹配到最左边的左括号和最右边的右括号之间的内容(这里我们讨论的是贪婪模式，懒惰模式也有下面的问题)。假如原来的字符串里的左括号和右括号出现的次数不相等，比如&lt;span class="string"&gt;( 5 / ( 3 + 2 ) ) )&lt;/span&gt;，那我们的匹配结果里两者的个数也不会相等。有没有办法在这样的字符串里匹配到最长的，配对的括号之间的内容呢？&lt;/p&gt;&lt;p&gt;为了避免&lt;span class="code"&gt;(&lt;/span&gt;和&lt;span class="code"&gt;\(&lt;/span&gt;把你的大脑彻底搞糊涂，我们还是用尖括号代替圆括号吧。现在我们的问题变成了如何把&lt;span class="string"&gt;xx &amp;lt;aa &amp;lt;bbb&amp;gt; &amp;lt;bbb&amp;gt; aa&amp;gt; yy&lt;/span&gt;这样的字符串里，最长的配对的尖括号内的内容捕获出来？&lt;/p&gt;&lt;p&gt;这里需要用到以下的语法构造：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="code"&gt;(?'group')&lt;/span&gt; 把捕获的内容命名为group,并压入&lt;span class="name"&gt;堆栈(Stack)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="code"&gt;(?'-group')&lt;/span&gt;从堆栈上弹出最后压入堆栈的名为group的捕获内容，如果堆栈本来为空，则本分组的匹配失败&lt;/li&gt;&lt;li&gt;&lt;span class="code"&gt;(?(group)yes|no)&lt;/span&gt;如果堆栈上存在以名为group的捕获内容的话，继续匹配yes部分的表达式，否则继续匹配no部分&lt;/li&gt;&lt;li&gt;&lt;span class="code"&gt;(?!)&lt;/span&gt; 零宽负向先行断言，由于没有后缀表达式，试图匹配总是失败&lt;/li&gt;&lt;/ul&gt;&lt;p class="note"&gt;如果你不是一个程序员（或者你自称程序员但是不知道堆栈是什么东西），你就这样理解上面的三种语法吧：第一个就是在黑板上写一个"group"，第二个就是从黑板上擦掉一个"group"，第三个就是看黑板上写的还有没有"group"，如果有就继续匹配yes部分，否则就匹配no部分。&lt;/p&gt;&lt;p&gt;我们需要做的是每碰到了左括号，就在压入一个"Open",每碰到一个右括号，就弹出一个，到了最后就看看堆栈是否为空－－如果不为空那就证明左括号比右括号多，那匹配就应该失败。正则表达式引擎会进行回溯(放弃最前面或最后面的一些字符)，尽量使整个表达式得到匹配。&lt;/p&gt;&amp;lt;                         #最外层的左括号&lt;br/&gt;    [^&amp;lt;&amp;gt;]*                #最外层的左括号后面的不是括号的内容&lt;br/&gt;    (&lt;br/&gt;        (&lt;br/&gt;            (?'Open'&amp;lt;)    #碰到了左括号，在黑板上写一个"Open"&lt;br/&gt;            [^&amp;lt;&amp;gt;]*       #匹配左括号后面的不是括号的内容&lt;br/&gt;        )+&lt;br/&gt;        (&lt;br/&gt;            (?'-Open'&amp;gt;)   #碰到了右括号，擦掉一个"Open"&lt;br/&gt;            [^&amp;lt;&amp;gt;]*        #匹配右括号后面不是括号的内容&lt;br/&gt;        )+&lt;br/&gt;    )*&lt;br/&gt;    (?(Open)(?!))         #在遇到最外层的右括号前面，判断黑板上还有没有没擦掉的"Open"；如果还有，则匹配失败&lt;br/&gt;&lt;br/&gt;&amp;gt;                         #最外层的右括号&lt;p&gt;平衡组的一个最常见的应用就是匹配HTML,下面这个例子可以匹配&lt;span class="desc"&gt;嵌套的&amp;lt;div&amp;gt;标签&lt;/span&gt;：&lt;span class="regex"&gt;&amp;lt;div[^&amp;gt;]*&amp;gt;[^&amp;lt;&amp;gt;]*(((?'Open'&amp;lt;div[^&amp;gt;]*&amp;gt;)[^&amp;lt;&amp;gt;]*)+((?'-Open'&amp;lt;/div&amp;gt;)[^&amp;lt;&amp;gt;]*)+)*(?(Open)(?!))&amp;lt;/div&amp;gt;&lt;/span&gt;.&lt;/p&gt;&lt;h2 id="more"&gt;还有些什么东西没提到&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;上边已经描述了构造正则表达式的大量元素，但是还有很多没有提到的东西。下面是一些未提到的元素的列表，包含语法和简单的说明。你可以在网上找到更详细的参考资料来学习它们--当你需要用到它们的时候。如果你安装了MSDN Library,你也可以在里面找到.net下正则表达式详细的文档。&lt;/p&gt;&lt;p class="note"&gt;这里的介绍很简略，如果你需要更详细的信息，而又没有在电脑上安装MSDN Library,可以查看&lt;a href="http://msdn.microsoft.com/zh-cn/library/az24scfc.aspx"&gt;关于正则表达式语言元素的MSDN在线文档&lt;/a&gt;。&lt;/p&gt;&lt;table cellspacing="0"&gt;&lt;caption&gt;表7.尚未详细讨论的语法&lt;/caption&gt;&lt;thead&gt;&lt;tr&gt;&lt;th scope="col"&gt;代码/语法&lt;/th&gt;&lt;th scope="col"&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;\a&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;报警字符(打印它的效果是电脑嘀一声)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;\b&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;通常是单词分界位置，但如果在字符类里使用代表退格&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;\t&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;制表符，Tab&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;\r&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;回车&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;\v&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;竖向制表符&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;\f&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;换页符&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;\n&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;换行符&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;\e&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;Escape&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;\0nn&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;ASCII代码中八进制代码为nn的字符&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;\xnn&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;ASCII代码中十六进制代码为nn的字符&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;\unnnn&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;Unicode代码中十六进制代码为nnnn的字符&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;\cN&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;ASCII控制字符。比如\cC代表Ctrl+C&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;\A&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;字符串开头(类似^，但不受处理多行选项的影响)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;\Z&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;字符串结尾或行尾(不受处理多行选项的影响)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;\z&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;字符串结尾(类似$，但不受处理多行选项的影响)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;\G&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;当前搜索的开头&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;\p{name}&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;Unicode中命名为name的字符类，例如\p{IsGreek}&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;(?&amp;gt;exp)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;贪婪子表达式&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;(?&amp;lt;x&amp;gt;-&amp;lt;y&amp;gt;exp)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;平衡组&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;(?im-nsx:exp)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;在子表达式exp中改变处理选项&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;(?im-nsx)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;为表达式后面的部分改变处理选项&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;(?(exp)yes|no)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;把exp当作零宽正向先行断言，如果在这个位置能匹配，使用yes作为此组的表达式；否则使用no&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;(?(exp)yes)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;同上，只是使用空表达式作为no&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;(?(name)yes|no)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;如果命名为name的组捕获到了内容，使用yes作为表达式；否则使用no&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="code"&gt;(?(name)yes)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="desc"&gt;同上，只是使用空表达式作为no&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id="contact"&gt;联系作者&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;好吧,我承认,我骗了你,读到这里你肯定花了不止30分钟.相信我,这是我的错,而不是因为你太笨.我之所以说"30分钟",是为了让你有信心,有耐心继续下去.既然你看到了这里,那证明我的阴谋成功了.被忽悠的感觉很爽吧？&lt;/p&gt;&lt;p&gt;要投诉我,或者觉得我其实可以忽悠得更高明,或者有任何其它问题,欢迎来&lt;a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html"&gt;我的博客&lt;/a&gt;让我知道.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h2 id="resources"&gt;网上的资源及本文参考文献&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/jscript7/html/jsreconintroductiontoregularexpressions.asp"&gt;微软的正则表达式教程&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/zh-cn/library/system.text.regularexpressions.regex.aspx"&gt;System.Text.RegularExpressions.Regex类(MSDN)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.regular-expressions.info/"&gt;专业的正则表达式教学网站(英文)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://weblogs.asp.net/whaggard/archive/2005/02/20/377025.aspx"&gt;关于.Net下的平衡组的详细讨论（英文）&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.oreilly.com/catalog/regex2/"&gt;Mastering Regular Expressions (Second Edition)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="updatelog"&gt;更新纪录&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;2006-3-27 第一版&lt;/li&gt;&lt;li&gt;2006-10-12 第二版&lt;ul&gt;&lt;li&gt;修正了几个细节上的错误和不准确的地方&lt;/li&gt;&lt;li&gt;增加了对处理中文时的一些说明&lt;/li&gt;&lt;li&gt;更改了几个术语的翻译（采用了MSDN的翻译方式）&lt;/li&gt;&lt;li&gt;增加了平衡组的介绍&lt;/li&gt;&lt;li&gt;放弃了对The Regulator的介绍，改用Regex Tester&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;2007-3-12 V2.1&lt;ul&gt;&lt;li&gt;修正了几个小的错误&lt;/li&gt;&lt;li&gt;增加了对处理选项(RegexOptions)的介绍&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;2007-5-28 V2.2&lt;ul&gt;&lt;li&gt;重新组织了对零宽断言的介绍&lt;/li&gt;&lt;li&gt;删除了几个不太合适的示例，添加了几个实用的示例&lt;/li&gt;&lt;li&gt;其它一些微小的更改&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;2007-8-3 V2.21&lt;ul&gt;&lt;li&gt;修改了几处文字错误&lt;/li&gt;&lt;li&gt;修改/添加了对$,\b的精确说明&lt;/li&gt;&lt;li&gt;承认了作者是个骗子&lt;/li&gt;&lt;li&gt;给RegexTester添加了Singleline选项的相关功能&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;2008-4-13 v2.3&lt;ul&gt;&lt;li&gt;调整了部分章节的次序&lt;/li&gt;&lt;li&gt;修改了页面布局，删除了专门的参考节&lt;/li&gt;&lt;li&gt;针对读者的反馈，调整了部分内容&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;2009-4-11 v2.31&lt;ul&gt;&lt;li&gt;修改了几处文字错误&lt;/li&gt;&lt;li&gt;添加了一些注释说明&lt;/li&gt;&lt;li&gt;调整了一些措词&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;2011-8-17 v2.32&lt;ul&gt;&lt;li&gt;更改了工具介绍，换用自行开发的正则表达式测试器&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;img src="http://www.cnblogs.com/blsong/aggbug/2326260.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/blsong/archive/2012/01/19/2326260.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/blsong/archive/2011/12/31/2308804.html</id><title type="text">2011年终总结</title><summary type="text">2011年快要过去了，这一年对我来说是平凡又不平凡的一年，说平凡是因为2011如我生命的前26个年头一样，势不可挡地将要过去了，说不平凡是因为在2011年经历了工作，住所，身体与心灵的各种变动和变化的我，仍然自信快乐地活着，实在是需要太多的恩典才能发生的事，而此刻，心里有太多的感恩，感恩自己所拥有的一切。 在这一年，工作的变动让我有了一次内心的反思，身体上和内心的痛苦则让我对自己的处事方式有了一次深刻的窥探，我看清楚了内心的“小我”，我是如何处心积虑的在喂养它，即使已经身心疲惫。恐惧、贪婪和权力欲望是导致我们生活痛苦的常见情绪。对情绪的直接体验让我看到自己负面情绪的产生原因，对自己的不满...</summary><published>2011-12-31T07:19:00Z</published><updated>2011-12-31T07:19:00Z</updated><author><name>风雨者2</name><uri>http://www.cnblogs.com/blsong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/blsong/archive/2011/12/31/2308804.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/blsong/archive/2011/12/31/2308804.html"/><content type="html">&lt;p&gt;2011年快要过去了，这一年对我来说是平凡又不平凡的一年，说平凡是因为2011如我生命的前26个年头一样，势不可挡地将要过去了，说不平凡是因为在2011年经历了工作，住所，身体与心灵的各种变动和变化的我，仍然自信快乐地活着，实在是需要太多的恩典才能发生的事，而此刻，心里有太多的感恩，感恩自己所拥有的一切。&lt;/p&gt;&lt;p&gt;在这一年，工作的变动让我有了一次内心的反思，身体上和内心的痛苦则让我对自己的处事方式有了一次深刻的窥探，我看清楚了内心的&amp;ldquo;小我&amp;rdquo;，我是如何处心积虑的在喂养它，即使已经身心疲惫。恐惧、贪婪和权力欲望是导致我们生活痛苦的常见情绪。对情绪的直接体验让我看到自己负面情绪的产生原因，对自己的不满意和对外界的身份认同更让我陷得更深。觉察是需要练习的，觉醒更是需要恩典才能发生，感谢神，感谢我生活中遇到的一切，我很满足地处在当下的这一刻，永恒的美将由我来展现，创造经由我来显化。祝福所有人，祝福一切！愿我们都能心想事成！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在爱和光中&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;小王子&lt;/p&gt;&lt;img src="http://www.cnblogs.com/blsong/aggbug/2308804.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/blsong/archive/2011/12/31/2308804.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/blsong/archive/2011/12/28/2304845.html</id><title type="text">(转)javascritp对fckeditor编辑器操作</title><summary type="text">http://www.cnblogs.com/xiaopeng84/archive/2010/08/03/1790911.htmljavascript调用方式：－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;script type="text/javascript" src="FCKeditor/fckeditor.js"&gt;&lt;/script&gt; &lt;textarea name="content" cols="80" rows="4"&gt;&amp;l</summary><published>2011-12-28T07:14:00Z</published><updated>2011-12-28T07:14:00Z</updated><author><name>风雨者2</name><uri>http://www.cnblogs.com/blsong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/blsong/archive/2011/12/28/2304845.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/blsong/archive/2011/12/28/2304845.html"/><content type="html">&lt;p&gt;&lt;a href="http://www.cnblogs.com/xiaopeng84/archive/2010/08/03/1790911.html"&gt;http://www.cnblogs.com/xiaopeng84/archive/2010/08/03/1790911.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;javascript调用方式：&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;&amp;lt;script type="text/javascript" src="FCKeditor/fckeditor.js"&amp;gt;&amp;lt;/script&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;textarea name="content" cols="80" rows="4"&amp;gt;&lt;br /&gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;var FCKeditor = new FCKeditor("content");&lt;br /&gt;FCKeditor.BasePath = "FCKeditor/"; &lt;br /&gt;oFCKeditor.Height = 400;&lt;br /&gt;oFCKeditor.ToolbarSet = "Default"; &lt;br /&gt;oFCKeditor.ReplaceTextarea();&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;&lt;br /&gt;如果想要使用从数据库读来的文本数据或者是后台来自文件的txt/html文本数据。&lt;br /&gt;只要在&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;&amp;lt;textarea name="content" cols="80" rows="4"&amp;gt;&lt;br /&gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;&lt;br /&gt;中加入自己的显示内容的formbean对应字段即可&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;&amp;lt;textarea name="content" cols="80" rows="4"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;c:out value="${contentData}" /&amp;gt;&lt;br /&gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;&lt;br /&gt;这样内容就会被显示在FCKeditor编辑框中了，点击提交按钮以后就可以在后台的相应java action中得到content参数中的内容就是页面上FCKeditor中的内容数据了。可以在struts/jsf中使用。&lt;br /&gt;&lt;br /&gt;＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝&lt;br /&gt;&lt;br /&gt;由于给FCKeditor瘦身，所以常会报缺少对象支持等错误，只要在FCKeditor/editor/lang中加上相应的js语言文件即可。如果加载页面失败（FCKeditor未定义）还有一个可能就是引用FCKeditor/fckeditor.js文件路径不对！&lt;br /&gt;&lt;br /&gt;关于FCKeditor瘦身要点如下：&lt;br /&gt;1.将FCKeditor目录下及子目录下所有以"_"下划线开头的文件夹删除&lt;br /&gt;2.FCKeditor根目录下只保留fckconfig.js, fckeditor.js, fckstyles.xml, fcktemplates.xml，其余全部删除&lt;br /&gt;3.将editor/filemanager/upload目录下文件及文件夹清空&lt;br /&gt;4.将/editor/filemanager/browser/default/connectors/下的所有文件删除&lt;br /&gt;5.还可以将editor/skins目录下的皮肤文件删除，只留下default一套皮肤（如果你不需要换皮肤的话&lt;br /&gt;6.还可以将editor/lang目录下文件删除，只保留en.js, fcklanguagemanager.js, zh-cn.js, zh.js文件&lt;br /&gt;7.如果你是使用javascript来调用加载FCKeditor，那么就不需要在web.xml中配置fckeditor的tag文件。&lt;br /&gt;8.还有一个问题刚开始使用FCKeditor的人常会遇到就怎么控制它的toolbar的大小和元素排列，其实很简单。 &lt;br /&gt;在fckconfig.js中用这样的标签[]来划分每行的元素的多少，这样就可以控制toolbar的长短和大小了，具体示例参看：fckconfig.js中的toolbarset["Default"]&lt;br /&gt;&lt;br /&gt;＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝&lt;br /&gt;&lt;br /&gt;用fckconfig.js中的一些选项来控制toolbarset中控件的功能，实现功能裁剪：&lt;br /&gt;1)：取消超链接中的浏览服务器和上传功能，方法如下：&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;FCKConfig.LinkBrowser = true;&lt;br /&gt;FCKConfig.LinkUpload = true;&lt;br /&gt;改为：&lt;br /&gt;FCKConfig.LinkBrowser = false;&lt;br /&gt;FCKConfig.LinkUpload = false;&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;&lt;br /&gt;2)：取消图片链接中的浏览服务器和上传功能，方法如下：&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;FCKConfig.ImageUpload = true;&lt;br /&gt;FCKConfig.ImageBrowser = true;&lt;br /&gt;改为：&lt;br /&gt;FCKConfig.ImageUpload = false;&lt;br /&gt;FCKConfig.ImageBrowser = false;&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;&lt;br /&gt;3)：Dlg Button中取消高级功能，方法如下：&lt;br /&gt;FCKConfig.LinkDlgHideAdvanced = false ;&lt;br /&gt;FCKConfig.ImageDlgHideAdvanced = false ;&lt;br /&gt;改为：&lt;br /&gt;FCKConfig.ImageDlgHideAdvanced = true ;&lt;br /&gt;FCKConfig.LinkDlgHideTarget = true ;&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;&lt;br /&gt;下一篇介绍FCKeditor的上传和浏览服务器功能，以及如何在里面实现动态&lt;br /&gt;&lt;br /&gt;超连接，转发到servlet经过filter以后去调用服务器的action&lt;br /&gt;&lt;br /&gt;如何实现对应用户浏览自己的图片的列表实现！&lt;br /&gt;&lt;br /&gt;＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝&lt;br /&gt;&lt;br /&gt;FCKeditor集成java servlet可以实现文件的上传和服务器端列表读取功能FCKeditor自己提供了两个servlet来分别实现上传文件功能，和读取服务器端文件列表功能，这两个servlet分别为：&lt;br /&gt;com.fredck.FCKeditor.connector.ConnectorServlet（读取文件列表）&lt;br /&gt;com.fredck.FCKeditor.uploader.SimpleUploaderServlet（实现文件上传）&lt;br /&gt;&lt;br /&gt;1.浏览服务器端文件列表&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;web.xml文件中，比如：ConnectorServlet中的配置选项：&lt;br /&gt;&amp;lt;init-param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;param-name&amp;gt;baseDir&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;param-value&amp;gt;/UserFiles/&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;lt;/init-param&amp;gt;&lt;br /&gt;&lt;br /&gt;意思是在浏览服务器上的baseDir配置指定里面的所有文件及其目录结构列表。&lt;br /&gt;如果你的baseDir没有配置，Connector将会自动创建一个默认的文件夹&lt;br /&gt;UserFiles，对应的ConnectorServlet中init()方法中代码如下：&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;baseDir = getInitParameter("baseDir");&lt;br /&gt;if (baseDir == null)&lt;br /&gt;baseDir = "/UserFiles/";&lt;br /&gt;&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;还想说一下的是，FCKeditor的client调用server的servlet方法采用的是Ajax思想来实现。当你点击浏览服务器(browser server)的时候就会触发一个异步的javascript + xmlhttp的调用响应，后台的servlet会去完成你要请求的事件，然后数据以xml方式返回给client来解析。很明显，你要实现去数据库或者其他的文件系统请求列表，你只要修改&lt;br /&gt;ConnectorServlet中两个私有方法：getFolders 和 getFiles&lt;br /&gt;让它去你指定的地方得到文件列表即可，这样你的文件可以放在任何你指定目录下。多说一句，很多人都想知道个人blog系统中怎么实现上传文件以后对应用户浏览自己的列表的，我的做法很简单，建立你用户名的文件夹，你上传只能上传到你的目录夹，浏览可以通过程序指定浏览对应用户下的文件夹即可，这个时候你要修改Connectorservlet中的路径即可！&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;&lt;br /&gt;2.超连接重定位问题&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;FCKeditor可以插入超连接，实现对文件的预览功能，只要我们稍微改变我们可以使FCKeditor编辑器支持对任意文件系统下的任意文件的客户端浏览和下载保存！FCKeditor本来提供的是相对URL超链接，只要我们修改ConnectorServlet中传递给客户端的地址的时候，把它改写成绝对URL然后再通过我们自己的filter的servlet实现重定向去一个下载/浏览文件的struts的action方法就可以实现在客户端对超连接文件的下载和浏览！说一下具体做法吧：&lt;br /&gt;&lt;br /&gt;1)：修改ConnectorServlet传递给客户端javascript的路径，代码如下：&lt;br /&gt;String currentUrl = "http://" + request.getserver +request.getServerPort + request.getContextPath + resourcePath;&lt;br /&gt;&lt;br /&gt;以上代码请在ConnectorServlet的doGet()里面拼装！在调用CreateCommonXml()私有方法的时候参数传入：&lt;br /&gt;myEl.setAttribute("path",currentPath);&lt;br /&gt;myEl.setAttribute("url",currentUrl);&lt;br /&gt;&lt;br /&gt;提醒一下resourcePath为在web.xml配置文件中ConnectorServlet中的一个初始化参数配置，等一下利用filter实现对超连接的重定位就提取URL中的这个配置参数来判断，配置如下&lt;br /&gt;&amp;lt;init-param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;param-name&amp;gt;resourcePath&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;param-value&amp;gt;/fileSystem/&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;lt;/init-param&amp;gt;&lt;br /&gt;&lt;br /&gt;2)：建立你的filter servlet，实现对URL的截获，对符合要求的URL进行重定位到你的对应action中去即可&lt;br /&gt;3)：实现你的对应action来实现文件的上传和下载功能即可！&lt;br /&gt;4)：扩展功能－实现对URL的加密，对连接的URL中加上一串字符，最后几位作为算法校验，对不符合要求的URL连接,filter将会拒绝重定位到指定action。此外利用自己写的扩展类还可以实现对超连接的文件类型进行限制，比如你只能超连接JPG|GIF|DOC|TXT|HTML等几种后缀名的文件，对其他文件即使你指定超连接也让你浏览和下载，这些都可以在web.xml中通过修改对应servlet的配置文件的初始化参数实现。&lt;br /&gt;&lt;br /&gt;3.页面javascript修改&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;浏览服务器的功能对应的html/javascript相关的文件为：browser.html和frmresourcelist.html对应你想传递的信息你可以append在文件名的字符串后面，在GetFileRowHtml()的javascript函数中实现对文件名的截取，这样client只会显示文件名，而你可以得到文件的数据库唯一标识，任何你想要的信息你都可以通过修改ConnectorServlet中的私有方法getFiles()来实现，只要修改页面frmresurcelist.html中的GetFileRowHtml()中传入变量fileName即可。你还可以在点击选中文件的时候实现一个你自己的Ajax调用，一切取决你的项目需要！&lt;br /&gt;&lt;br /&gt;4.我不是一个javascript高手，其实如果我对javascript了解多一些也许对客户端的代码修改以后做出更眩的功能。可以更好的完成对FCKeditor裁剪。&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;&lt;br /&gt;5.注意点&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;无论怎么修改别人的东西，请一定尊重开源精神！&lt;br /&gt;很多人配置好了FCKeditor的上传功能以后常会遇到xmlhttp request 404 error,后面是一串路径，其实就是你的servlet-mapping中的路径不对，你只要把xmlhttp request errot 404 后面跟的路径，copy到你的web.xml中对应红色文字的位置，如下：&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;servlet-name&amp;gt;Connector&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;url-pattern&amp;gt;/FCKeditor/editor/filemanager/browser/default/connectors/jsp/connector&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;别忘了SimpleUploader的servlet－mapping也要做同样的修改！&lt;br /&gt;&lt;br /&gt;还有一个错误就是http 500错误，这个可能是你的URL请求不对，应该和FCKeditor没关系的!&lt;br /&gt;&lt;br /&gt;＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝&lt;br /&gt;&lt;br /&gt;fckconfig.js总配置文件，可用记录本打开，修改后将文件存为utf-8 编码格式。找到：&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;FCKConfig.TabSpaces = 0;&lt;br /&gt;改为：&lt;br /&gt;FCKConfig.TabSpaces = 1;&lt;br /&gt;&lt;br /&gt;即在编辑器域内可以使用Tab键。&lt;br /&gt;&lt;br /&gt;如果你的编辑器还用在网站前台的话，比如说用于留言本或是日记回复时，那就不得不考虑安全了，&lt;br /&gt;在前台千万不要使用Default的toolbar，要么自定义一下功能，要么就用系统已经定义好的Basic，&lt;br /&gt;也就是基本的toolbar，找到：&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;FCKConfig.ToolbarSets["Basic"] = ['Bold','Italic','-','OrderedList','UnorderedList','-',/*'Link',*/'Unlink','-','Style','FontSize','TextColor','BGColor','-','Smiley','SpecialChar','Replace','Preview'];&lt;br /&gt;&lt;br /&gt;这是改过的Basic，把图像功能去掉，把添加链接功能去掉，因为图像和链接和flash和图像按钮添加功能都能让前台页直接访问和上传文件， fckeditor还支持编辑域内的鼠标右键功能。&lt;br /&gt;&lt;br /&gt;FCKConfig.ContextMenu = ['Generic',/*'Link',*/'Anchor',/*'Image',*/'Flash','Select','Textarea','Checkbox','Radio','TextField','HiddenField', /*'ImageButton',*/'Button','BulletedList','NumberedList','TableCell','Table','Form'];&lt;br /&gt;&lt;br /&gt;这也是改过的把鼠标右键的"链接、图像，FLASH，图像按钮"功能都去掉。&lt;br /&gt;&lt;br /&gt;找到：&lt;br /&gt;FCKConfig.FontNames = 'Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana';&lt;br /&gt;&lt;br /&gt;加上几种我们常用的字体&lt;br /&gt;&lt;br /&gt;FCKConfig.FontNames = '宋体;黑体;隶书;楷体_GB2312;Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana';&lt;br /&gt;&lt;br /&gt;添加文件 /TestFCKeditor/test.jsp:&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;&amp;lt;%@ page language="java" import="com.fredck.FCKeditor.*" %&amp;gt;&lt;br /&gt;&amp;lt;%@ taglib uri="/TestFCKeditor" prefix="FCK" %&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript" src="/TestFCKeditor/FCKeditor/fckeditor.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;三种方法调用FCKeditor&lt;br /&gt;1.FCKeditor自定义标签 (必须加头文件 &amp;lt;%@ taglib uri="/TestFCKeditor" prefix="FCK" %&amp;gt; )&lt;br /&gt;2.script脚本语言调用 (必须引用 脚本文件 &amp;lt;script type="text/javascript" src="/TestFCKeditor/FCKeditor/fckeditor.js"&amp;gt;&amp;lt;/script&amp;gt; )&lt;br /&gt;3.FCKeditor API 调用 (必须加头文件 &amp;lt;%@ page language="java" import="com.fredck.FCKeditor.*" %&amp;gt;&lt;br /&gt;%&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;&amp;lt;form action="show.jsp" method="post" target="_blank"&amp;gt;&lt;br /&gt;&amp;lt;FCK:editor id="content" basePath="/TestFCKeditor/FCKeditor/" width="700" height="500" skinPath="/TestFCKeditor/FCKeditor/editor/skins/silver/" toolbarSet = "Default"&amp;gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;内容&lt;br /&gt;&amp;lt;/FCK:editor&amp;gt;&lt;br /&gt;&amp;lt;input type="submit" value="Submit"&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;form action="show.jsp" method="post" target="_blank"&amp;gt;&lt;br /&gt;&amp;lt;table border="0" width="700"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;textarea id="content" name="content" style="WIDTH: 100%; HEIGHT: 400px"&amp;gt;input&amp;lt;/textarea&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var FCKeditor = new FCKeditor('content')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oFCKeditor.BasePath = "/TestFCKeditor/FCKeditor/" ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oFCKeditor.Height = 400;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oFCKeditor.ToolbarSet = "Default" ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oFCKeditor.ReplaceTextarea();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;input type="submit" value="Submit"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/table&amp;gt;-&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;&amp;lt;form action="show.jsp" method="post" target="_blank"&amp;gt;&lt;br /&gt;FCKeditor oFCKeditor ;&lt;br /&gt;oFCKeditor = new FCKeditor( request, "content" ) ;&lt;br /&gt;oFCKeditor.setBasePath( "/TestFCKeditor/FCKeditor/" ) ;&lt;br /&gt;oFCKeditor.setValue( "input" );&lt;br /&gt;out.println( oFCKeditor.create() ) ;&lt;br /&gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;input type="submit" value="Submit"&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;%&amp;gt;&lt;br /&gt;&lt;br /&gt;添加文件/TestFCKeditor/show.jsp&lt;br /&gt;&amp;lt;%&lt;br /&gt;String content = request.getParameter("content");&lt;br /&gt;out.print(content);&lt;br /&gt;%&amp;gt;&lt;br /&gt;&lt;br /&gt;＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝&lt;br /&gt;&lt;br /&gt;1、适时打开编辑器&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;很多时候，我们在打开页面的时候不需要直接打开编辑器，而在用到的时候才打开，这样一来有很好的用户体验，另一方面可以消除FCK在加载时对页面打开速度的影响，点击"Open Editor"按钮后才打开编辑器界面。&lt;br /&gt;实现原理：&lt;br /&gt;使用JAVASCRIPT版的FCK，在页面加载时（未打开FCK），创建一个隐藏的TextArea域，这个TextArea 的name和ID要和创建的FCK实例名称一致，然后点击"Open Editor"按钮时，通过调用一段函数，使用FCK的ReplaceTextarea()方法来创建FCKeditor，代码如下：&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&amp;lt;!&amp;ndash;&lt;br /&gt;function showFCK(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;var FCKeditor = new FCKeditor( 'fbContent' ) ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;oFCKeditor.BasePath = '/FCKeditor/' ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;oFCKeditor.ToolbarSet = 'Basic' ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;oFCKeditor.Width = '100%' ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;oFCKeditor.Height = '200' ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;oFCKeditor.ReplaceTextarea() ;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;textarea name="fbContent" id="fbContent"&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;&lt;br /&gt;2、使用FCKeditor 的 API&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;FCKeditor编辑器，提供了非常丰富的API，用于给End User实现很多想要定制的功能，比如最基本的数据验证，如何在提交的时候用JS判断当前编辑器区域内是否有内容，FCK的API提供了GetLength()方法；&lt;br /&gt;&lt;br /&gt;再比如如何通过脚本向FCK里插入内容，使用InsertHTML()等；&lt;br /&gt;&lt;br /&gt;还有，在用户定制功能时，中间步骤可能要执行FCK的一些内嵌哦作，那就用ExecuteCommand()方法。&lt;br /&gt;&lt;br /&gt;详细的API列表，请查看FCKeditor的Wiki。而常用的API，请查看FCK压缩包里的_samples/html/sample08.html。此处就不贴代码了。&lt;br /&gt;&lt;br /&gt;3、外联编辑条（多个编辑域共用一个编辑条）&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;这个功能是2.3版本才开始提供的，以前版本的FCKeditor要在同一个页面里用多个编辑器的话，得一个个创建，现在有了这个外联功能，就不用那么麻烦了，只需要把工具条放在一个适当的位置，后面就可以无限制的创建编辑域了。&lt;br /&gt;&lt;br /&gt;要实现这种功能呢，需要先在页面中定义一个工具条的容器：&amp;lt;div id="xToolbar"&amp;gt;&amp;lt;/div&amp;gt;，然后再根据这个容器的id属性进行设置。&lt;br /&gt;&lt;br /&gt;JAVASCRIPT实现代码：&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;&amp;lt;div id="xToolbar"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;FCKeditor 1:&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&amp;lt;!&amp;ndash;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Automatically calculates the editor base path based on the _samples directory.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// This is usefull only for these samples. A real application should use something like this:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// oFCKeditor.BasePath = '/fckeditor/'; // '/fckeditor/' is the default value.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var sBasePath = document.location.pathname.substring(0,document.location.pathname.lastIndexOf('_samples'));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var FCKeditor = new FCKeditor( 'FCKeditor_1' );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oFCKeditor.BasePath = sBasePath;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oFCKeditor.Height = 100;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oFCKeditor.Config[ 'ToolbarLocation' ] = 'Out:parent(xToolbar)';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oFCKeditor.Value = 'This is some &amp;lt;strong&amp;gt;sample text&amp;lt;/strong&amp;gt;. You are using FCKeditor.';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oFCKeditor.Create();&lt;br /&gt;//&amp;ndash;&amp;gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&lt;br /&gt;FCKeditor 2:&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&amp;lt;!&amp;ndash;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FCKeditor = new FCKeditor( 'FCKeditor_2' );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oFCKeditor.BasePath = sBasePath;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oFCKeditor.Height = 100;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oFCKeditor.Config[ 'ToolbarLocation' ] = 'Out:parent(xToolbar)';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oFCKeditor.Value = 'This is some &amp;lt;strong&amp;gt;sample text&amp;lt;/strong&amp;gt;. You are using FCKeditor.';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oFCKeditor.Create();&lt;br /&gt;//&amp;ndash;&amp;gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;此部分的详细DEMO请参照_samples/html/sample11.html，_samples/html/sample11_frame.html&lt;br /&gt;&lt;br /&gt;4、文件管理功能、文件上传的权限问题&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;一直以来FCKeditor的文件管理部分的安全是个值得注意，但很多人没注意到的地方，虽然FCKeditor在各个Release版本中一直存在的一个功能就是对上传文件类型进行过滤，但是她没考虑过另一个问题：到底允许谁能上传？到底谁能浏览服务器文件？&lt;br /&gt;&lt;br /&gt;之前刚开始用FCKeditor时，我就出现过这个问题，还好NetRube（FCKeditor中文化以及FCKeditor ASP版上传程序的作者）及时提醒了我，做法是去修改FCK上传程序，在里面进行权限判断，并且再在fckconfig.js里把相应的一些功能去掉。但随之FCK版本的不断升级，每升一次都要去改一次配置程序fckconfig.js，我发觉厌烦了，就没什么办法能更好的控制这种配置么？事实上，是有的。&lt;br /&gt;&lt;br /&gt;在fckconfig.js里面，有关于是否打开上传和浏览服务器的设置，在创建FCKeditor时，通过程序来判断是否创建有上传浏览功能的编辑器。首先，我先在fckconfig.js里面把所有的上传和浏览设置全设为false，接着我使用的代码如下：&lt;br /&gt;&lt;br /&gt;JAVASCRIPT版本：&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var FCKeditor = new FCKeditor( 'fbContent' );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;% if power = powercode then %&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oFCKeditor.Config['LinkBrowser'] = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oFCKeditor.Config['ImageBrowser'] = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oFCKeditor.Config['FlashBrowser'] = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oFCKeditor.Config['LinkUpload'] = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oFCKeditor.Config['ImageUpload'] = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oFCKeditor.Config['FlashUpload'] = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;% end if %&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oFCKeditor.ToolbarSet = 'Basic';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oFCKeditor.Width = '100%';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oFCKeditor.Height = '200';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oFCKeditor.Value = '';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oFCKeditor.Create();&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;&lt;br /&gt;在按钮旁边加文字&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;打开 editor/js/ 两个js文件&lt;br /&gt;fckeditorcode_gecko.js&lt;br /&gt;fckeditorcode_ie.js&lt;br /&gt;&lt;br /&gt;第一个是支持非ie浏览器的&lt;br /&gt;第二个文件是支持ie浏览器的&lt;br /&gt;&lt;br /&gt;搜索 FCKToolbarButton，可以看到许多类似这样的语句：&lt;br /&gt;case 'Save':B = new FCKToolbarButton('Save', FCKLang.Save, null, null, true, null, 3); break;&lt;br /&gt;&lt;br /&gt;'Save'是按钮英文名字&lt;br /&gt;FCKToolbarButton 的四个参数分别是：&lt;br /&gt;按钮命令名称，按钮标签文字，按钮工具提示，按钮样式，按钮是否在源代码模式可见，按钮下拉菜单其中将第4项参数设置为 FCK_TOOLBARITEM_ICONTEXT 即可使按钮旁边出现文字，注意没有引号。&lt;br /&gt;例如：&lt;br /&gt;case 'Preview':B = new FCKToolbarButton('Preview', FCKLang.Preview, null, FCK_TOOLBARITEM_ICONTEXT, true, null, 5);&lt;br /&gt;这样我们就可以将 我们经常用的3种模式源代码、预览、全屏编辑按钮都加上文字了。&lt;br /&gt;&lt;br /&gt;解释fck样式的工作原理&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;fck的样式设置涉及到了两个文件，一个是你定义好的样式表文件.css，另一个是告诉fck样式表如何使用的xml文件，两个文件确一不可。&lt;br /&gt;css文件的位置是不做要求的，但是需要你在应用的编辑器的页面上插入样式表文件的链接。这样才能显示出来样式。&lt;br /&gt;fckstyles.xml 在与editor目录同级的目录下。该文件定义了那些样式可以使用在那些标签里面。&lt;br /&gt;&lt;br /&gt;这就是fck自带的样式xml定义：&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;&lt;br /&gt;&amp;lt;Styles&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;Style name="Image on Left" element="img"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Attribute name="style" value="padding: 5px; margin-right: 5px" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Attribute name="border" value="2" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Attribute name="align" value="left" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/Style&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;Style name="Image on Right" element="img"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Attribute name="style" value="padding: 5px; margin-left: 5px" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Attribute name="border" value="2" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Attribute name="align" value="right" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/Style&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;Style name="Custom Bold" element="span"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Attribute name="style" value="font-weight: bold;" /&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/Style&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;Style name="Custom Italic" element="em" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;Style name="Title" element="span"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Attribute name="class" value="Title" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/Style&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;Style name="Code" element="span"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Attribute name="class" value="Code" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/Style&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;Style name="Title H3" element="h3" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;Style name="Custom Ruler" element="hr"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Attribute name="size" value="1" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Attribute name="color" value="#ff0000" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/Style&amp;gt;&lt;br /&gt;&amp;lt;/Styles&amp;gt;&lt;br /&gt;&lt;br /&gt;每一个&amp;lt;style&amp;gt;将来会生成一个样式的菜单项。name名称就是显示在菜单里的文字；element定义了该样式可以应用在那种html标签上，&amp;lt;Attribute&amp;gt;的 name 指定了将会修改标签的哪个属性来应用样式，value则是修改成的值。&lt;br /&gt;看这个：&lt;br /&gt;&amp;lt;Style name="Title" element="span"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;Attribute name="class" value="Title" /&amp;gt;&lt;br /&gt;&amp;lt;/Style&amp;gt;&lt;br /&gt;&lt;br /&gt;如果你在fck选定了文字 "经典论坛 &amp;gt; 前台制作与脚本专栏 &amp;gt; FCKeditor 实战技巧 - 1 &amp;gt; 编辑帖子" 应用该样式 则原来文字就会变成&amp;lt;span class="Title"&amp;gt;经典论坛 &amp;gt; 前台制作与脚本专栏 &amp;gt; FCKeditor 实战技巧 - 1 &amp;gt; 编辑帖子&amp;lt;/span&amp;gt;&lt;br /&gt;&lt;br /&gt;注意：如果编辑器呈整页编辑状态，那么整页里面也需要插入样式表链接才能显示出来样式。&lt;br /&gt;&lt;br /&gt;＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝&lt;br /&gt;&lt;br /&gt;FCKeditor Javascript API（翻译整理）&lt;br /&gt;原文地址：http://wiki.fckeditor.net/Developer%27s_Guide/Javascript_API&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ &lt;br /&gt;FCK 编辑器加载后，将会注册一个全局的 FCKeditorAPI 对象。&lt;br /&gt;&lt;br /&gt;FCKeditorAPI 对象在页面加载期间是无效的，直到页面加载完成。如果需要交互式地知道 FCK 编辑器已经加载完成，可使用"FCKeditor_OnComplete"函数。&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;function FCKeditor_OnComplete(editorInstance) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;FCKeditorAPI.GetInstance('FCKeditor1').Commands.GetCommand('FitWindow').Execute();&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;在当前页获得 FCK 编辑器实例：&lt;br /&gt;var Editor = FCKeditorAPI.GetInstance('InstanceName');&lt;br /&gt;&lt;br /&gt;从 FCK 编辑器的弹出窗口中获得 FCK 编辑器实例：&lt;br /&gt;var Editor = window.parent.InnerDialogLoaded().FCK;&lt;br /&gt;&lt;br /&gt;从框架页面的子框架中获得其它子框架的 FCK 编辑器实例：&lt;br /&gt;var Editor = window.FrameName.FCKeditorAPI.GetInstance('InstanceName');&lt;br /&gt;&lt;br /&gt;从页面弹出窗口中获得父窗口的 FCK 编辑器实例： &lt;br /&gt;var Editor = opener.FCKeditorAPI.GetInstance('InstanceName');&lt;br /&gt;&lt;br /&gt;获得 FCK 编辑器的内容：&lt;br /&gt;oEditor.GetXHTML(formatted); // formatted 为：true|false，表示是否按HTML格式取出&lt;br /&gt;也可用： &lt;br /&gt;oEditor.GetXHTML();&lt;br /&gt;&lt;br /&gt;设置 FCK 编辑器的内容：&lt;br /&gt;oEditor.SetHTML("content", false); // 第二个参数为：true|false，是否以所见即所得方式设置其内容。此方法常用于"设置初始值"或"表单重置"哦作。&lt;br /&gt;&lt;br /&gt;插入内容到 FCK 编辑器：&lt;br /&gt;oEditor.InsertHtml("html"); // "html"为HTML文本&lt;br /&gt;&lt;br /&gt;检查 FCK 编辑器内容是否发生变化：&lt;br /&gt;oEditor.IsDirty();&lt;br /&gt;&lt;br /&gt;在 FCK 编辑器之外调用 FCK 编辑器工具条命令：&lt;br /&gt;命令列表如下：&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;DocProps, Templates, Link, Unlink, Anchor, BulletedList, NumberedList, About, Find, Replace, Image, Flash, SpecialChar, Smiley, Table, TableProp, TableCellProp, UniversalKey, Style, FontName, FontSize, FontFormat, Source, Preview, Save, NewPage, PageBreak, TextColor, BGColor, PasteText, PasteWord, TableInsertRow, TableDeleteRows, TableInsertColumn, TableDeleteColumns, TableInsertCell, TableDeleteCells, TableMergeCells, TableSplitCell, TableDelete, Form, Checkbox, Radio, TextField, Textarea, HiddenField, Button, Select, ImageButton, SpellCheck, FitWindow, Undo, Redo&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;使用方法如下：&lt;br /&gt;－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;oEditor.Commands.GetCommand('FitWindow').Execute();&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/blsong/aggbug/2304845.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/blsong/archive/2011/12/28/2304845.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/blsong/archive/2011/12/09/2282326.html</id><title type="text">C#导出Excel的示例</title><summary type="text">概要： excel导出在C#代码中应用己经很广泛了，我这里就做些总结，供自己和读者学习用。Excel知识点。 一、添加引用和命名空间 添加Microsoft.Office.Interop.Excel引用，它的默认路径是C:\Program Files\Microsoft Visual Studio 9.0\Visual Studio Tools for Office\PIA\Office12\Microsoft.Office.Interop.Excel.dll 代码中添加引用using Microsoft.Office.Interop.Excel; 二、Excel类的简单介绍 此命名空间下关于</summary><published>2011-12-09T07:50:00Z</published><updated>2011-12-09T07:50:00Z</updated><author><name>风雨者2</name><uri>http://www.cnblogs.com/blsong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/blsong/archive/2011/12/09/2282326.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/blsong/archive/2011/12/09/2282326.html"/><content type="html">&lt;div class="clear"&gt;&lt;strong&gt;概要：&lt;/strong&gt;&lt;/div&gt;&lt;div class="postBody"&gt;&lt;div id="cnblogs_post_body"&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; excel导出在C#代码中应用己经很广泛了，我这里就做些总结，供自己和读者学习用。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Excel知识点。&lt;/strong&gt;&amp;nbsp; &lt;br /&gt;一、添加引用和命名空间 &lt;br /&gt;添加Microsoft.Office.Interop.Excel引用，它的默认路径是C:\Program Files\Microsoft Visual Studio 9.0\Visual Studio Tools for Office\PIA\Office12\Microsoft.Office.Interop.Excel.dll &lt;br /&gt;代码中添加引用using Microsoft.Office.Interop.Excel; &lt;br /&gt;二、Excel类的简单介绍 &lt;br /&gt;此命名空间下关于Excel类的结构分别为： &lt;br /&gt;ApplicationClass - 就是我们的excel应用程序。 &lt;br /&gt;Workbook - 就是我们平常见的一个个excel文件，经常是使用Workbooks类对其进行操作。 &lt;br /&gt;Worksheet - 就是excel文件中的一个个sheet页。 &lt;br /&gt;Worksheet.Cells[row, column] - 就是某行某列的单元格，注意这里的下标row和column都是从1开始的，跟我平常用的数组或集合的下标有所不同。 &lt;br /&gt;知道了上述基本知识后，利用此类来操作excel就清晰了很多。 &lt;br /&gt;三、Excel的操作 &lt;br /&gt;任何操作Excel的动作首先肯定是用excel应用程序，首先要new一个ApplicationClass 实例，并在最后将此实例释放。&lt;/p&gt;&lt;div&gt;&lt;div id="highlighter_197207" class="syntaxhighlighter  csharp ie"&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/springyangwc/archive/2011/08/12/2136498.html"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="csharp plain"&gt;ApplicationClass xlsApp = &lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp plain"&gt;ApplicationClass(); &lt;/code&gt;&lt;code class="csharp comments"&gt;// 1. 创建Excel应用程序对象的一个实例，相当于我们从开始菜单打开Excel应用程序。 &lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="csharp plain"&gt;&lt;/code&gt;&lt;code class="csharp keyword"&gt;if&lt;/code&gt; &lt;code class="csharp plain"&gt;(xlsApp == &lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="csharp plain"&gt;&lt;/code&gt;&lt;code class="csharp comments"&gt;//对此实例进行验证，如果为null则表示运行此代码的机器可能未安装Excel &lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&lt;code class="csharp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;1. 打开现有的Excel文件&lt;/p&gt;&lt;div&gt;&lt;div id="highlighter_162765" class="syntaxhighlighter  csharp ie"&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/springyangwc/archive/2011/08/12/2136498.html"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="csharp plain"&gt;Workbook workbook = xlsApp.Workbooks.Open(excelFilePath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="csharp plain"&gt;Worksheet mySheet = workbook.Sheets[1] &lt;/code&gt;&lt;code class="csharp keyword"&gt;as&lt;/code&gt; &lt;code class="csharp plain"&gt;Worksheet; &lt;/code&gt;&lt;code class="csharp comments"&gt;//第一个sheet页 &lt;/code&gt;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="csharp plain"&gt;mySheet.Name = &lt;/code&gt;&lt;code class="csharp string"&gt;"testsheet"&lt;/code&gt;&lt;code class="csharp plain"&gt;; &lt;/code&gt;&lt;code class="csharp comments"&gt;//这里修改sheet名称&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;2.复制sheet页&lt;/p&gt;&lt;div&gt;&lt;div id="highlighter_794397" class="syntaxhighlighter  csharp ie"&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/springyangwc/archive/2011/08/12/2136498.html"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="csharp plain"&gt;mySheet.Copy(Type.Missing, workbook.Sheets[1]); &lt;/code&gt;&lt;code class="csharp comments"&gt;//复制mySheet成一个新的sheet页，复制完后的名称是mySheet页名称后加一个(2)，这里就是testsheet(2)，复制完后，Worksheet的数量增加一个&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;注意 这里Copy方法的两个参数，指是的复制出来新的sheet页是在指定sheet页的前面还是后面，上面的例子就是指复制的sheet页在第一个sheet页的后面。 &lt;br /&gt;3.删除sheet页&lt;/p&gt;&lt;div&gt;&lt;div id="highlighter_586701" class="syntaxhighlighter  csharp ie"&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/springyangwc/archive/2011/08/12/2136498.html"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="csharp plain"&gt;xlsApp.DisplayAlerts = &lt;/code&gt;&lt;code class="csharp keyword"&gt;false&lt;/code&gt;&lt;code class="csharp plain"&gt;; &lt;/code&gt;&lt;code class="csharp comments"&gt;//如果想删除某个sheet页，首先要将此项设为fasle。 &lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="csharp plain"&gt;(xlsApp.ActiveWorkbook.Sheets[1] &lt;/code&gt;&lt;code class="csharp keyword"&gt;as&lt;/code&gt; &lt;code class="csharp plain"&gt;Worksheet).Delete();&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;4.选中sheet页&lt;/p&gt;&lt;div&gt;&lt;div id="highlighter_939659" class="syntaxhighlighter  csharp ie"&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/springyangwc/archive/2011/08/12/2136498.html"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="csharp plain"&gt;(xlsApp.ActiveWorkbook.Sheets[1] &lt;/code&gt;&lt;code class="csharp keyword"&gt;as&lt;/code&gt; &lt;code class="csharp plain"&gt;Worksheet).Select(Type.Missing); &lt;/code&gt;&lt;code class="csharp comments"&gt;//选中某个sheet页&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;5.另存excel文件&lt;/p&gt;&lt;div&gt;&lt;div id="highlighter_933847" class="syntaxhighlighter  csharp ie"&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/springyangwc/archive/2011/08/12/2136498.html"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="csharp plain"&gt;workbook.Saved = &lt;/code&gt;&lt;code class="csharp keyword"&gt;true&lt;/code&gt;&lt;code class="csharp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="csharp plain"&gt;workbook.SaveCopyAs(filepath);&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;6.释放excel资源&lt;/p&gt;&lt;div&gt;&lt;div id="highlighter_981839" class="syntaxhighlighter  csharp ie"&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/springyangwc/archive/2011/08/12/2136498.html"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="csharp plain"&gt;workbook.Close(&lt;/code&gt;&lt;code class="csharp keyword"&gt;true&lt;/code&gt;&lt;code class="csharp plain"&gt;, Type.Missing, Type.Missing); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="csharp plain"&gt;workbook = &lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="csharp plain"&gt;xlsApp.Quit(); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="csharp plain"&gt;xlsApp = &lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;一般的我们传入一个DataTable生成Excel代码&lt;/p&gt;&lt;div&gt;&lt;div id="highlighter_534312" class="syntaxhighlighter  csharp ie"&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/springyangwc/archive/2011/08/12/2136498.html"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;9&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;10&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;11&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;12&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;13&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;14&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;15&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;16&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;17&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;18&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;19&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;20&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;21&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;22&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;23&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;24&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;25&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;26&lt;/div&gt;&lt;div class="line number27 index26 alt2"&gt;27&lt;/div&gt;&lt;div class="line number28 index27 alt1"&gt;28&lt;/div&gt;&lt;div class="line number29 index28 alt2"&gt;29&lt;/div&gt;&lt;div class="line number30 index29 alt1"&gt;30&lt;/div&gt;&lt;div class="line number31 index30 alt2"&gt;31&lt;/div&gt;&lt;div class="line number32 index31 alt1"&gt;32&lt;/div&gt;&lt;div class="line number33 index32 alt2"&gt;33&lt;/div&gt;&lt;div class="line number34 index33 alt1"&gt;34&lt;/div&gt;&lt;div class="line number35 index34 alt2"&gt;35&lt;/div&gt;&lt;div class="line number36 index35 alt1"&gt;36&lt;/div&gt;&lt;div class="line number37 index36 alt2"&gt;37&lt;/div&gt;&lt;div class="line number38 index37 alt1"&gt;38&lt;/div&gt;&lt;div class="line number39 index38 alt2"&gt;39&lt;/div&gt;&lt;div class="line number40 index39 alt1"&gt;40&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="csharp color1"&gt;/// &amp;lt;summary&amp;gt; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="csharp color1"&gt;///&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="csharp color1"&gt;/// &amp;lt;/summary&amp;gt; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="csharp color1"&gt;/// &amp;lt;param name="dt"&amp;gt;&amp;lt;/param&amp;gt; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&lt;code class="csharp keyword"&gt;protected&lt;/code&gt; &lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;ExportExcel(DataTable dt) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;if&lt;/code&gt; &lt;code class="csharp plain"&gt;(dt == &lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;||dt.Rows.Count==0) &lt;/code&gt;&lt;code class="csharp keyword"&gt;return&lt;/code&gt;&lt;code class="csharp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;Microsoft.Office.Interop.Excel.Application xlApp = &lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp plain"&gt;Microsoft.Office.Interop.Excel.Application(); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;if&lt;/code&gt; &lt;code class="csharp plain"&gt;(xlApp == &lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;return&lt;/code&gt;&lt;code class="csharp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;System.Globalization.CultureInfo CurrentCI = System.Threading.Thread.CurrentThread.CurrentCulture; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;System.Threading.Thread.CurrentThread.CurrentCulture = &lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp plain"&gt;System.Globalization.CultureInfo(&lt;/code&gt;&lt;code class="csharp string"&gt;"en-US"&lt;/code&gt;&lt;code class="csharp plain"&gt;); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1]; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;Microsoft.Office.Interop.Excel.Range range; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;long&lt;/code&gt; &lt;code class="csharp plain"&gt;totalCount = dt.Rows.Count; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;long&lt;/code&gt; &lt;code class="csharp plain"&gt;rowRead = 0; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;float&lt;/code&gt; &lt;code class="csharp plain"&gt;percent = 0; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;for&lt;/code&gt; &lt;code class="csharp plain"&gt;(&lt;/code&gt;&lt;code class="csharp keyword"&gt;int&lt;/code&gt; &lt;code class="csharp plain"&gt;i = 0; i &amp;lt; dt.Columns.Count; i++) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;worksheet.Cells[1, i + 1] = dt.Columns[i].ColumnName; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1]; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number27 index26 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;range.Interior.ColorIndex = 15; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number28 index27 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;range.Font.Bold = &lt;/code&gt;&lt;code class="csharp keyword"&gt;true&lt;/code&gt;&lt;code class="csharp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number29 index28 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number30 index29 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;for&lt;/code&gt; &lt;code class="csharp plain"&gt;(&lt;/code&gt;&lt;code class="csharp keyword"&gt;int&lt;/code&gt; &lt;code class="csharp plain"&gt;r = 0; r &amp;lt; dt.Rows.Count; r++) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number31 index30 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number32 index31 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;for&lt;/code&gt; &lt;code class="csharp plain"&gt;(&lt;/code&gt;&lt;code class="csharp keyword"&gt;int&lt;/code&gt; &lt;code class="csharp plain"&gt;i = 0; i &amp;lt; dt.Columns.Count; i++) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number33 index32 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number34 index33 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;worksheet.Cells[r + 2, i + 1] = dt.Rows[r][i].ToString(); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number35 index34 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number36 index35 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;rowRead++; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number37 index36 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;percent = ((&lt;/code&gt;&lt;code class="csharp keyword"&gt;float&lt;/code&gt;&lt;code class="csharp plain"&gt;)(100 * rowRead)) / totalCount; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number38 index37 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number39 index38 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;xlApp.Visible = &lt;/code&gt;&lt;code class="csharp keyword"&gt;true&lt;/code&gt;&lt;code class="csharp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number40 index39 alt1"&gt;&lt;code class="csharp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;如果要在excel中插入图片，我们需要把代码加入一行即可，如下所示&lt;/p&gt;&lt;div&gt;&lt;div id="highlighter_656530" class="syntaxhighlighter  csharp ie"&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/springyangwc/archive/2011/08/12/2136498.html"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;9&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;10&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;11&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;12&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;13&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;14&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;15&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;16&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;17&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;18&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;19&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;20&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;21&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;22&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;23&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;24&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;25&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;26&lt;/div&gt;&lt;div class="line number27 index26 alt2"&gt;27&lt;/div&gt;&lt;div class="line number28 index27 alt1"&gt;28&lt;/div&gt;&lt;div class="line number29 index28 alt2"&gt;29&lt;/div&gt;&lt;div class="line number30 index29 alt1"&gt;30&lt;/div&gt;&lt;div class="line number31 index30 alt2"&gt;31&lt;/div&gt;&lt;div class="line number32 index31 alt1"&gt;32&lt;/div&gt;&lt;div class="line number33 index32 alt2"&gt;33&lt;/div&gt;&lt;div class="line number34 index33 alt1"&gt;34&lt;/div&gt;&lt;div class="line number35 index34 alt2"&gt;35&lt;/div&gt;&lt;div class="line number36 index35 alt1"&gt;36&lt;/div&gt;&lt;div class="line number37 index36 alt2"&gt;37&lt;/div&gt;&lt;div class="line number38 index37 alt1"&gt;38&lt;/div&gt;&lt;div class="line number39 index38 alt2"&gt;39&lt;/div&gt;&lt;div class="line number40 index39 alt1"&gt;40&lt;/div&gt;&lt;div class="line number41 index40 alt2"&gt;41&lt;/div&gt;&lt;div class="line number42 index41 alt1"&gt;42&lt;/div&gt;&lt;div class="line number43 index42 alt2"&gt;43&lt;/div&gt;&lt;div class="line number44 index43 alt1"&gt;44&lt;/div&gt;&lt;div class="line number45 index44 alt2"&gt;45&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="csharp keyword"&gt;protected&lt;/code&gt; &lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;ExportExcel(DataTable dt) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;if&lt;/code&gt; &lt;code class="csharp plain"&gt;(dt == &lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt; &lt;code class="csharp plain"&gt;|| dt.Rows.Count == 0) &lt;/code&gt;&lt;code class="csharp keyword"&gt;return&lt;/code&gt;&lt;code class="csharp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;Microsoft.Office.Interop.Excel.Application xlApp = &lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp plain"&gt;Microsoft.Office.Interop.Excel.Application(); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;if&lt;/code&gt; &lt;code class="csharp plain"&gt;(xlApp == &lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;return&lt;/code&gt;&lt;code class="csharp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;System.Globalization.CultureInfo CurrentCI = System.Threading.Thread.CurrentThread.CurrentCulture; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;System.Threading.Thread.CurrentThread.CurrentCulture = &lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp plain"&gt;System.Globalization.CultureInfo(&lt;/code&gt;&lt;code class="csharp string"&gt;"en-US"&lt;/code&gt;&lt;code class="csharp plain"&gt;); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1]; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;Microsoft.Office.Interop.Excel.Range range; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;long&lt;/code&gt; &lt;code class="csharp plain"&gt;totalCount = dt.Rows.Count; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;long&lt;/code&gt; &lt;code class="csharp plain"&gt;rowRead = 0; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;float&lt;/code&gt; &lt;code class="csharp plain"&gt;percent = 0; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;for&lt;/code&gt; &lt;code class="csharp plain"&gt;(&lt;/code&gt;&lt;code class="csharp keyword"&gt;int&lt;/code&gt; &lt;code class="csharp plain"&gt;i = 0; i &amp;lt; dt.Columns.Count; i++) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;worksheet.Cells[1, i + 1] = dt.Columns[i].ColumnName; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1]; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;range.Interior.ColorIndex = 15; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;for&lt;/code&gt; &lt;code class="csharp plain"&gt;(&lt;/code&gt;&lt;code class="csharp keyword"&gt;int&lt;/code&gt; &lt;code class="csharp plain"&gt;r = 0; r &amp;lt; dt.Rows.Count; r++) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number27 index26 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;for&lt;/code&gt; &lt;code class="csharp plain"&gt;(&lt;/code&gt;&lt;code class="csharp keyword"&gt;int&lt;/code&gt; &lt;code class="csharp plain"&gt;i = 0; i &amp;lt; dt.Columns.Count; i++) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number28 index27 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number29 index28 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;try&lt;/code&gt;&lt;/div&gt;&lt;div class="line number30 index29 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number31 index30 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;worksheet.Cells[r + 2, i + 1] = dt.Rows[r][i].ToString(); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number32 index31 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number33 index32 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;catch&lt;/code&gt;&lt;/div&gt;&lt;div class="line number34 index33 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number35 index34 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;worksheet.Cells[r + 2, i + 1] = dt.Rows[r][i].ToString().Replace(&lt;/code&gt;&lt;code class="csharp string"&gt;"="&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;""&lt;/code&gt;&lt;code class="csharp plain"&gt;); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number36 index35 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number37 index36 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number38 index37 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;rowRead++; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number39 index38 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;percent = ((&lt;/code&gt;&lt;code class="csharp keyword"&gt;float&lt;/code&gt;&lt;code class="csharp plain"&gt;)(100 * rowRead)) / totalCount; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number40 index39 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number41 index40 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number42 index41 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;worksheet.Shapes.AddPicture(&lt;/code&gt;&lt;code class="csharp string"&gt;"C:\\Users\\spring\\Desktop\\1.gif"&lt;/code&gt;&lt;code class="csharp plain"&gt;, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoCTrue, 100, 200, 200, 300); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number43 index42 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;worksheet.Shapes.AddTextEffect(Microsoft.Office.Core.MsoPresetTextEffect.msoTextEffect1, &lt;/code&gt;&lt;code class="csharp string"&gt;"123456"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"Red"&lt;/code&gt;&lt;code class="csharp plain"&gt;, 15, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoTrue, 150, 200); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number44 index43 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;xlApp.Visible = &lt;/code&gt;&lt;code class="csharp keyword"&gt;true&lt;/code&gt;&lt;code class="csharp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number45 index44 alt2"&gt;&lt;code class="csharp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;我们调用如下:&lt;/p&gt;&lt;div&gt;&lt;div id="highlighter_670359" class="syntaxhighlighter  csharp ie"&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/springyangwc/archive/2011/08/12/2136498.html"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;9&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;10&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;11&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;12&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="csharp keyword"&gt;public&lt;/code&gt; &lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;GenerateExcel() &lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;DataTable dt = &lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp plain"&gt;DataTable(); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;dt.Columns.Add(&lt;/code&gt;&lt;code class="csharp string"&gt;"Name"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp keyword"&gt;typeof&lt;/code&gt;&lt;code class="csharp plain"&gt;(&lt;/code&gt;&lt;code class="csharp keyword"&gt;string&lt;/code&gt;&lt;code class="csharp plain"&gt;)); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;dt.Columns.Add(&lt;/code&gt;&lt;code class="csharp string"&gt;"Age"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp keyword"&gt;typeof&lt;/code&gt;&lt;code class="csharp plain"&gt;(&lt;/code&gt;&lt;code class="csharp keyword"&gt;string&lt;/code&gt;&lt;code class="csharp plain"&gt;)); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;DataRow dr = dt.NewRow(); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;dr[&lt;/code&gt;&lt;code class="csharp string"&gt;"Name"&lt;/code&gt;&lt;code class="csharp plain"&gt;] = &lt;/code&gt;&lt;code class="csharp string"&gt;"spring"&lt;/code&gt;&lt;code class="csharp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;dr[&lt;/code&gt;&lt;code class="csharp string"&gt;"Age"&lt;/code&gt;&lt;code class="csharp plain"&gt;] = &lt;/code&gt;&lt;code class="csharp string"&gt;"20"&lt;/code&gt;&lt;code class="csharp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;dt.Rows.Add(dr); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;dt.AcceptChanges(); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;ExportExcel(dt); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;&lt;code class="csharp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;运行结果如下所示:&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/springyangwc/201108/201108121714233750.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/springyangwc/201108/201108121714506068.png" alt="image" width="339" height="530" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;其中如下代码的作用是&lt;/p&gt;&lt;div&gt;&lt;div id="highlighter_483714" class="syntaxhighlighter  csharp ie"&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/springyangwc/archive/2011/08/12/2136498.html"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="csharp plain"&gt;worksheet.Shapes.AddPicture(&lt;/code&gt;&lt;code class="csharp string"&gt;"C:\\Users\\spring\\Desktop\\1.gif"&lt;/code&gt;&lt;code class="csharp plain"&gt;, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoCTrue, 100, 200, 200, 300);&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;在Excel的指定位置加入图片&lt;/p&gt;&lt;div&gt;&lt;div id="highlighter_348712" class="syntaxhighlighter  csharp ie "&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/springyangwc/archive/2011/08/12/2136498.html"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="csharp plain"&gt;worksheet.Shapes.AddTextEffect(Microsoft.Office.Core.MsoPresetTextEffect.msoTextEffect1, &lt;/code&gt;&lt;code class="csharp string"&gt;"123456"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"Red"&lt;/code&gt;&lt;code class="csharp plain"&gt;, 15, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoTrue, 150, 200);&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;在Excel的指定位置加入文本框，和里面的内容.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;我们可以这样来设计一个ExcelBase的基类:&lt;/p&gt;&lt;p&gt;先创建一个ExcelBE.cs：&lt;/p&gt;&lt;div&gt;&lt;div id="highlighter_496339" class="syntaxhighlighter  csharp ie"&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/springyangwc/archive/2011/08/12/2136498.html"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;9&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;10&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;11&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;12&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;13&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;14&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;15&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;16&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;17&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;18&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;19&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;20&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;21&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;22&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;23&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;24&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;25&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;26&lt;/div&gt;&lt;div class="line number27 index26 alt2"&gt;27&lt;/div&gt;&lt;div class="line number28 index27 alt1"&gt;28&lt;/div&gt;&lt;div class="line number29 index28 alt2"&gt;29&lt;/div&gt;&lt;div class="line number30 index29 alt1"&gt;30&lt;/div&gt;&lt;div class="line number31 index30 alt2"&gt;31&lt;/div&gt;&lt;div class="line number32 index31 alt1"&gt;32&lt;/div&gt;&lt;div class="line number33 index32 alt2"&gt;33&lt;/div&gt;&lt;div class="line number34 index33 alt1"&gt;34&lt;/div&gt;&lt;div class="line number35 index34 alt2"&gt;35&lt;/div&gt;&lt;div class="line number36 index35 alt1"&gt;36&lt;/div&gt;&lt;div class="line number37 index36 alt2"&gt;37&lt;/div&gt;&lt;div class="line number38 index37 alt1"&gt;38&lt;/div&gt;&lt;div class="line number39 index38 alt2"&gt;39&lt;/div&gt;&lt;div class="line number40 index39 alt1"&gt;40&lt;/div&gt;&lt;div class="line number41 index40 alt2"&gt;41&lt;/div&gt;&lt;div class="line number42 index41 alt1"&gt;42&lt;/div&gt;&lt;div class="line number43 index42 alt2"&gt;43&lt;/div&gt;&lt;div class="line number44 index43 alt1"&gt;44&lt;/div&gt;&lt;div class="line number45 index44 alt2"&gt;45&lt;/div&gt;&lt;div class="line number46 index45 alt1"&gt;46&lt;/div&gt;&lt;div class="line number47 index46 alt2"&gt;47&lt;/div&gt;&lt;div class="line number48 index47 alt1"&gt;48&lt;/div&gt;&lt;div class="line number49 index48 alt2"&gt;49&lt;/div&gt;&lt;div class="line number50 index49 alt1"&gt;50&lt;/div&gt;&lt;div class="line number51 index50 alt2"&gt;51&lt;/div&gt;&lt;div class="line number52 index51 alt1"&gt;52&lt;/div&gt;&lt;div class="line number53 index52 alt2"&gt;53&lt;/div&gt;&lt;div class="line number54 index53 alt1"&gt;54&lt;/div&gt;&lt;div class="line number55 index54 alt2"&gt;55&lt;/div&gt;&lt;div class="line number56 index55 alt1"&gt;56&lt;/div&gt;&lt;div class="line number57 index56 alt2"&gt;57&lt;/div&gt;&lt;div class="line number58 index57 alt1"&gt;58&lt;/div&gt;&lt;div class="line number59 index58 alt2"&gt;59&lt;/div&gt;&lt;div class="line number60 index59 alt1"&gt;60&lt;/div&gt;&lt;div class="line number61 index60 alt2"&gt;61&lt;/div&gt;&lt;div class="line number62 index61 alt1"&gt;62&lt;/div&gt;&lt;div class="line number63 index62 alt2"&gt;63&lt;/div&gt;&lt;div class="line number64 index63 alt1"&gt;64&lt;/div&gt;&lt;div class="line number65 index64 alt2"&gt;65&lt;/div&gt;&lt;div class="line number66 index65 alt1"&gt;66&lt;/div&gt;&lt;div class="line number67 index66 alt2"&gt;67&lt;/div&gt;&lt;div class="line number68 index67 alt1"&gt;68&lt;/div&gt;&lt;div class="line number69 index68 alt2"&gt;69&lt;/div&gt;&lt;div class="line number70 index69 alt1"&gt;70&lt;/div&gt;&lt;div class="line number71 index70 alt2"&gt;71&lt;/div&gt;&lt;div class="line number72 index71 alt1"&gt;72&lt;/div&gt;&lt;div class="line number73 index72 alt2"&gt;73&lt;/div&gt;&lt;div class="line number74 index73 alt1"&gt;74&lt;/div&gt;&lt;div class="line number75 index74 alt2"&gt;75&lt;/div&gt;&lt;div class="line number76 index75 alt1"&gt;76&lt;/div&gt;&lt;div class="line number77 index76 alt2"&gt;77&lt;/div&gt;&lt;div class="line number78 index77 alt1"&gt;78&lt;/div&gt;&lt;div class="line number79 index78 alt2"&gt;79&lt;/div&gt;&lt;div class="line number80 index79 alt1"&gt;80&lt;/div&gt;&lt;div class="line number81 index80 alt2"&gt;81&lt;/div&gt;&lt;div class="line number82 index81 alt1"&gt;82&lt;/div&gt;&lt;div class="line number83 index82 alt2"&gt;83&lt;/div&gt;&lt;div class="line number84 index83 alt1"&gt;84&lt;/div&gt;&lt;div class="line number85 index84 alt2"&gt;85&lt;/div&gt;&lt;div class="line number86 index85 alt1"&gt;86&lt;/div&gt;&lt;div class="line number87 index86 alt2"&gt;87&lt;/div&gt;&lt;div class="line number88 index87 alt1"&gt;88&lt;/div&gt;&lt;div class="line number89 index88 alt2"&gt;89&lt;/div&gt;&lt;div class="line number90 index89 alt1"&gt;90&lt;/div&gt;&lt;div class="line number91 index90 alt2"&gt;91&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="csharp keyword"&gt;public&lt;/code&gt; &lt;code class="csharp keyword"&gt;class&lt;/code&gt; &lt;code class="csharp plain"&gt;ExcelBE &lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;private&lt;/code&gt; &lt;code class="csharp keyword"&gt;int&lt;/code&gt; &lt;code class="csharp plain"&gt;_row = 0; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;private&lt;/code&gt; &lt;code class="csharp keyword"&gt;int&lt;/code&gt; &lt;code class="csharp plain"&gt;_col = 0; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;private&lt;/code&gt; &lt;code class="csharp keyword"&gt;string&lt;/code&gt; &lt;code class="csharp plain"&gt;_text = &lt;/code&gt;&lt;code class="csharp keyword"&gt;string&lt;/code&gt;&lt;code class="csharp plain"&gt;.Empty; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;private&lt;/code&gt; &lt;code class="csharp keyword"&gt;string&lt;/code&gt; &lt;code class="csharp plain"&gt;_startCell = &lt;/code&gt;&lt;code class="csharp keyword"&gt;string&lt;/code&gt;&lt;code class="csharp plain"&gt;.Empty; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;private&lt;/code&gt; &lt;code class="csharp keyword"&gt;string&lt;/code&gt; &lt;code class="csharp plain"&gt;_endCell = &lt;/code&gt;&lt;code class="csharp keyword"&gt;string&lt;/code&gt;&lt;code class="csharp plain"&gt;.Empty; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;private&lt;/code&gt; &lt;code class="csharp keyword"&gt;string&lt;/code&gt; &lt;code class="csharp plain"&gt;_interiorColor = &lt;/code&gt;&lt;code class="csharp keyword"&gt;string&lt;/code&gt;&lt;code class="csharp plain"&gt;.Empty; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;private&lt;/code&gt; &lt;code class="csharp keyword"&gt;bool&lt;/code&gt; &lt;code class="csharp plain"&gt;_isMerge = &lt;/code&gt;&lt;code class="csharp keyword"&gt;false&lt;/code&gt;&lt;code class="csharp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;private&lt;/code&gt; &lt;code class="csharp keyword"&gt;int&lt;/code&gt; &lt;code class="csharp plain"&gt;_size = 0; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;private&lt;/code&gt; &lt;code class="csharp keyword"&gt;string&lt;/code&gt; &lt;code class="csharp plain"&gt;_fontColor = &lt;/code&gt;&lt;code class="csharp keyword"&gt;string&lt;/code&gt;&lt;code class="csharp plain"&gt;.Empty; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;private&lt;/code&gt; &lt;code class="csharp keyword"&gt;string&lt;/code&gt; &lt;code class="csharp plain"&gt;_format = &lt;/code&gt;&lt;code class="csharp keyword"&gt;string&lt;/code&gt;&lt;code class="csharp plain"&gt;.Empty; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;public&lt;/code&gt; &lt;code class="csharp plain"&gt;ExcelBE(&lt;/code&gt;&lt;code class="csharp keyword"&gt;int&lt;/code&gt; &lt;code class="csharp plain"&gt;row, &lt;/code&gt;&lt;code class="csharp keyword"&gt;int&lt;/code&gt; &lt;code class="csharp plain"&gt;col, &lt;/code&gt;&lt;code class="csharp keyword"&gt;string&lt;/code&gt; &lt;code class="csharp plain"&gt;text, &lt;/code&gt;&lt;code class="csharp keyword"&gt;string&lt;/code&gt; &lt;code class="csharp plain"&gt;startCell, &lt;/code&gt;&lt;code class="csharp keyword"&gt;string&lt;/code&gt; &lt;code class="csharp plain"&gt;endCell, &lt;/code&gt;&lt;code class="csharp keyword"&gt;string&lt;/code&gt; &lt;code class="csharp plain"&gt;interiorColor, &lt;/code&gt;&lt;code class="csharp keyword"&gt;bool&lt;/code&gt; &lt;code class="csharp plain"&gt;isMerge, &lt;/code&gt;&lt;code class="csharp keyword"&gt;int&lt;/code&gt; &lt;code class="csharp plain"&gt;size, &lt;/code&gt;&lt;code class="csharp keyword"&gt;string&lt;/code&gt; &lt;code class="csharp plain"&gt;fontColor, &lt;/code&gt;&lt;code class="csharp keyword"&gt;string&lt;/code&gt; &lt;code class="csharp plain"&gt;format) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;_row = row; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;_col = col; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;_text = text; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;_startCell = startCell; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;_endCell = endCell; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;_interiorColor = interiorColor; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;_isMerge = isMerge; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;_size = size; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;_fontColor = fontColor; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;_format = format; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number27 index26 alt2"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number28 index27 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;public&lt;/code&gt; &lt;code class="csharp plain"&gt;ExcelBE() &lt;/code&gt;&lt;/div&gt;&lt;div class="line number29 index28 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ } &lt;/code&gt;&lt;/div&gt;&lt;div class="line number30 index29 alt1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number31 index30 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;public&lt;/code&gt; &lt;code class="csharp keyword"&gt;int&lt;/code&gt; &lt;code class="csharp plain"&gt;Row &lt;/code&gt;&lt;/div&gt;&lt;div class="line number32 index31 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number33 index32 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;get&lt;/code&gt; &lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;code class="csharp keyword"&gt;return&lt;/code&gt; &lt;code class="csharp plain"&gt;_row; } &lt;/code&gt;&lt;/div&gt;&lt;div class="line number34 index33 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;set&lt;/code&gt; &lt;code class="csharp plain"&gt;{ _row = value; } &lt;/code&gt;&lt;/div&gt;&lt;div class="line number35 index34 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number36 index35 alt1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number37 index36 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;public&lt;/code&gt; &lt;code class="csharp keyword"&gt;int&lt;/code&gt; &lt;code class="csharp plain"&gt;Col &lt;/code&gt;&lt;/div&gt;&lt;div class="line number38 index37 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number39 index38 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;get&lt;/code&gt; &lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;code class="csharp keyword"&gt;return&lt;/code&gt; &lt;code class="csharp plain"&gt;_col; } &lt;/code&gt;&lt;/div&gt;&lt;div class="line number40 index39 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;set&lt;/code&gt; &lt;code class="csharp plain"&gt;{ _col = value; } &lt;/code&gt;&lt;/div&gt;&lt;div class="line number41 index40 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number42 index41 alt1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number43 index42 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;public&lt;/code&gt; &lt;code class="csharp keyword"&gt;string&lt;/code&gt; &lt;code class="csharp plain"&gt;Text &lt;/code&gt;&lt;/div&gt;&lt;div class="line number44 index43 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number45 index44 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;get&lt;/code&gt; &lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;code class="csharp keyword"&gt;return&lt;/code&gt; &lt;code class="csharp plain"&gt;_text; } &lt;/code&gt;&lt;/div&gt;&lt;div class="line number46 index45 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;set&lt;/code&gt; &lt;code class="csharp plain"&gt;{ _text = value; } &lt;/code&gt;&lt;/div&gt;&lt;div class="line number47 index46 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number48 index47 alt1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number49 index48 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;public&lt;/code&gt; &lt;code class="csharp keyword"&gt;string&lt;/code&gt; &lt;code class="csharp plain"&gt;StartCell &lt;/code&gt;&lt;/div&gt;&lt;div class="line number50 index49 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number51 index50 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;get&lt;/code&gt; &lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;code class="csharp keyword"&gt;return&lt;/code&gt; &lt;code class="csharp plain"&gt;_startCell; } &lt;/code&gt;&lt;/div&gt;&lt;div class="line number52 index51 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;set&lt;/code&gt; &lt;code class="csharp plain"&gt;{ _startCell = value; } &lt;/code&gt;&lt;/div&gt;&lt;div class="line number53 index52 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number54 index53 alt1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number55 index54 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;public&lt;/code&gt; &lt;code class="csharp keyword"&gt;string&lt;/code&gt; &lt;code class="csharp plain"&gt;EndCell &lt;/code&gt;&lt;/div&gt;&lt;div class="line number56 index55 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number57 index56 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;get&lt;/code&gt; &lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;code class="csharp keyword"&gt;return&lt;/code&gt; &lt;code class="csharp plain"&gt;_endCell; } &lt;/code&gt;&lt;/div&gt;&lt;div class="line number58 index57 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;set&lt;/code&gt; &lt;code class="csharp plain"&gt;{ _endCell = value; } &lt;/code&gt;&lt;/div&gt;&lt;div class="line number59 index58 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number60 index59 alt1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number61 index60 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;public&lt;/code&gt; &lt;code class="csharp keyword"&gt;string&lt;/code&gt; &lt;code class="csharp plain"&gt;InteriorColor &lt;/code&gt;&lt;/div&gt;&lt;div class="line number62 index61 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number63 index62 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;get&lt;/code&gt; &lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;code class="csharp keyword"&gt;return&lt;/code&gt; &lt;code class="csharp plain"&gt;_interiorColor; } &lt;/code&gt;&lt;/div&gt;&lt;div class="line number64 index63 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;set&lt;/code&gt; &lt;code class="csharp plain"&gt;{ _interiorColor = value; } &lt;/code&gt;&lt;/div&gt;&lt;div class="line number65 index64 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number66 index65 alt1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number67 index66 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;public&lt;/code&gt; &lt;code class="csharp keyword"&gt;bool&lt;/code&gt; &lt;code class="csharp plain"&gt;IsMerge &lt;/code&gt;&lt;/div&gt;&lt;div class="line number68 index67 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number69 index68 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;get&lt;/code&gt; &lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;code class="csharp keyword"&gt;return&lt;/code&gt; &lt;code class="csharp plain"&gt;_isMerge; } &lt;/code&gt;&lt;/div&gt;&lt;div class="line number70 index69 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;set&lt;/code&gt; &lt;code class="csharp plain"&gt;{ _isMerge = value; } &lt;/code&gt;&lt;/div&gt;&lt;div class="line number71 index70 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number72 index71 alt1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number73 index72 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;public&lt;/code&gt; &lt;code class="csharp keyword"&gt;int&lt;/code&gt; &lt;code class="csharp plain"&gt;Size &lt;/code&gt;&lt;/div&gt;&lt;div class="line number74 index73 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number75 index74 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;get&lt;/code&gt; &lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;code class="csharp keyword"&gt;return&lt;/code&gt; &lt;code class="csharp plain"&gt;_size; } &lt;/code&gt;&lt;/div&gt;&lt;div class="line number76 index75 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;set&lt;/code&gt; &lt;code class="csharp plain"&gt;{ _size = value; } &lt;/code&gt;&lt;/div&gt;&lt;div class="line number77 index76 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number78 index77 alt1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number79 index78 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;public&lt;/code&gt; &lt;code class="csharp keyword"&gt;string&lt;/code&gt; &lt;code class="csharp plain"&gt;FontColor &lt;/code&gt;&lt;/div&gt;&lt;div class="line number80 index79 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number81 index80 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;get&lt;/code&gt; &lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;code class="csharp keyword"&gt;return&lt;/code&gt; &lt;code class="csharp plain"&gt;_fontColor; } &lt;/code&gt;&lt;/div&gt;&lt;div class="line number82 index81 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;set&lt;/code&gt; &lt;code class="csharp plain"&gt;{ _fontColor = value; } &lt;/code&gt;&lt;/div&gt;&lt;div class="line number83 index82 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number84 index83 alt1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number85 index84 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;public&lt;/code&gt; &lt;code class="csharp keyword"&gt;string&lt;/code&gt; &lt;code class="csharp plain"&gt;Formart &lt;/code&gt;&lt;/div&gt;&lt;div class="line number86 index85 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number87 index86 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;get&lt;/code&gt; &lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;code class="csharp keyword"&gt;return&lt;/code&gt; &lt;code class="csharp plain"&gt;_format; } &lt;/code&gt;&lt;/div&gt;&lt;div class="line number88 index87 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;set&lt;/code&gt; &lt;code class="csharp plain"&gt;{ _format = value; } &lt;/code&gt;&lt;/div&gt;&lt;div class="line number89 index88 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number90 index89 alt1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number91 index90 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;接下来创建ExcelBase.cs:&lt;/p&gt;&lt;div&gt;&lt;div id="highlighter_358112" class="syntaxhighlighter  csharp ie"&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/springyangwc/archive/2011/08/12/2136498.html"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;9&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;10&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;11&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;12&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;13&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;14&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;15&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;16&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;17&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;18&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;19&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;20&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;21&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;22&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;23&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;24&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;25&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;26&lt;/div&gt;&lt;div class="line number27 index26 alt2"&gt;27&lt;/div&gt;&lt;div class="line number28 index27 alt1"&gt;28&lt;/div&gt;&lt;div class="line number29 index28 alt2"&gt;29&lt;/div&gt;&lt;div class="line number30 index29 alt1"&gt;30&lt;/div&gt;&lt;div class="line number31 index30 alt2"&gt;31&lt;/div&gt;&lt;div class="line number32 index31 alt1"&gt;32&lt;/div&gt;&lt;div class="line number33 index32 alt2"&gt;33&lt;/div&gt;&lt;div class="line number34 index33 alt1"&gt;34&lt;/div&gt;&lt;div class="line number35 index34 alt2"&gt;35&lt;/div&gt;&lt;div class="line number36 index35 alt1"&gt;36&lt;/div&gt;&lt;div class="line number37 index36 alt2"&gt;37&lt;/div&gt;&lt;div class="line number38 index37 alt1"&gt;38&lt;/div&gt;&lt;div class="line number39 index38 alt2"&gt;39&lt;/div&gt;&lt;div class="line number40 index39 alt1"&gt;40&lt;/div&gt;&lt;div class="line number41 index40 alt2"&gt;41&lt;/div&gt;&lt;div class="line number42 index41 alt1"&gt;42&lt;/div&gt;&lt;div class="line number43 index42 alt2"&gt;43&lt;/div&gt;&lt;div class="line number44 index43 alt1"&gt;44&lt;/div&gt;&lt;div class="line number45 index44 alt2"&gt;45&lt;/div&gt;&lt;div class="line number46 index45 alt1"&gt;46&lt;/div&gt;&lt;div class="line number47 index46 alt2"&gt;47&lt;/div&gt;&lt;div class="line number48 index47 alt1"&gt;48&lt;/div&gt;&lt;div class="line number49 index48 alt2"&gt;49&lt;/div&gt;&lt;div class="line number50 index49 alt1"&gt;50&lt;/div&gt;&lt;div class="line number51 index50 alt2"&gt;51&lt;/div&gt;&lt;div class="line number52 index51 alt1"&gt;52&lt;/div&gt;&lt;div class="line number53 index52 alt2"&gt;53&lt;/div&gt;&lt;div class="line number54 index53 alt1"&gt;54&lt;/div&gt;&lt;div class="line number55 index54 alt2"&gt;55&lt;/div&gt;&lt;div class="line number56 index55 alt1"&gt;56&lt;/div&gt;&lt;div class="line number57 index56 alt2"&gt;57&lt;/div&gt;&lt;div class="line number58 index57 alt1"&gt;58&lt;/div&gt;&lt;div class="line number59 index58 alt2"&gt;59&lt;/div&gt;&lt;div class="line number60 index59 alt1"&gt;60&lt;/div&gt;&lt;div class="line number61 index60 alt2"&gt;61&lt;/div&gt;&lt;div class="line number62 index61 alt1"&gt;62&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="csharp keyword"&gt;public&lt;/code&gt; &lt;code class="csharp keyword"&gt;class&lt;/code&gt; &lt;code class="csharp plain"&gt;ExcelBase &lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;private&lt;/code&gt; &lt;code class="csharp plain"&gt;Microsoft.Office.Interop.Excel.Application app = &lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;private&lt;/code&gt; &lt;code class="csharp plain"&gt;Microsoft.Office.Interop.Excel.Workbook workbook = &lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;private&lt;/code&gt; &lt;code class="csharp plain"&gt;Microsoft.Office.Interop.Excel.Worksheet worksheet = &lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;private&lt;/code&gt; &lt;code class="csharp plain"&gt;Microsoft.Office.Interop.Excel.Range workSheet_range = &lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;public&lt;/code&gt; &lt;code class="csharp plain"&gt;ExcelBase() &lt;/code&gt;&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;createDoc(); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;public&lt;/code&gt; &lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;createDoc() &lt;/code&gt;&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;try&lt;/code&gt;&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;app = &lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp plain"&gt;Microsoft.Office.Interop.Excel.Application(); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;app.Visible = &lt;/code&gt;&lt;code class="csharp keyword"&gt;true&lt;/code&gt;&lt;code class="csharp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;workbook = app.Workbooks.Add(1); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Sheets[1]; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;catch&lt;/code&gt; &lt;code class="csharp plain"&gt;(Exception e) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;Console.Write(&lt;/code&gt;&lt;code class="csharp string"&gt;"Error"&lt;/code&gt;&lt;code class="csharp plain"&gt;); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;finally&lt;/code&gt;&lt;/div&gt;&lt;div class="line number27 index26 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number28 index27 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number29 index28 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number30 index29 alt1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number31 index30 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;public&lt;/code&gt; &lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;InsertData(ExcelBE be) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number32 index31 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number33 index32 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;worksheet.Cells[be.Row, be.Col] = be.Text; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number34 index33 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;workSheet_range = worksheet.get_Range(be.StartCell, be.EndCell); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number35 index34 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;workSheet_range.MergeCells = be.IsMerge; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number36 index35 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;workSheet_range.Interior.Color = GetColorValue(be.InteriorColor); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number37 index36 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;workSheet_range.Borders.Color = System.Drawing.Color.Black.ToArgb(); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number38 index37 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;workSheet_range.ColumnWidth = be.Size; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number39 index38 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;workSheet_range.Font.Color = &lt;/code&gt;&lt;code class="csharp keyword"&gt;string&lt;/code&gt;&lt;code class="csharp plain"&gt;.IsNullOrEmpty(be.FontColor) ? System.Drawing.Color.White.ToArgb() : System.Drawing.Color.Black.ToArgb(); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number40 index39 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;workSheet_range.NumberFormat = be.Formart; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number41 index40 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number42 index41 alt1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number43 index42 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;private&lt;/code&gt; &lt;code class="csharp keyword"&gt;int&lt;/code&gt; &lt;code class="csharp plain"&gt;GetColorValue(&lt;/code&gt;&lt;code class="csharp keyword"&gt;string&lt;/code&gt; &lt;code class="csharp plain"&gt;interiorColor) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number44 index43 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number45 index44 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;switch&lt;/code&gt; &lt;code class="csharp plain"&gt;(interiorColor) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number46 index45 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number47 index46 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;case&lt;/code&gt; &lt;code class="csharp string"&gt;"YELLOW"&lt;/code&gt;&lt;code class="csharp plain"&gt;: &lt;/code&gt;&lt;/div&gt;&lt;div class="line number48 index47 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;return&lt;/code&gt; &lt;code class="csharp plain"&gt;System.Drawing.Color.Yellow.ToArgb(); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number49 index48 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;case&lt;/code&gt; &lt;code class="csharp string"&gt;"GRAY"&lt;/code&gt;&lt;code class="csharp plain"&gt;: &lt;/code&gt;&lt;/div&gt;&lt;div class="line number50 index49 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;return&lt;/code&gt; &lt;code class="csharp plain"&gt;System.Drawing.Color.Gray.ToArgb(); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number51 index50 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;case&lt;/code&gt; &lt;code class="csharp string"&gt;"GAINSBORO"&lt;/code&gt;&lt;code class="csharp plain"&gt;: &lt;/code&gt;&lt;/div&gt;&lt;div class="line number52 index51 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;return&lt;/code&gt; &lt;code class="csharp plain"&gt;System.Drawing.Color.Gainsboro.ToArgb(); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number53 index52 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;case&lt;/code&gt; &lt;code class="csharp string"&gt;"Turquoise"&lt;/code&gt;&lt;code class="csharp plain"&gt;: &lt;/code&gt;&lt;/div&gt;&lt;div class="line number54 index53 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;return&lt;/code&gt; &lt;code class="csharp plain"&gt;System.Drawing.Color.Turquoise.ToArgb(); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number55 index54 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;case&lt;/code&gt; &lt;code class="csharp string"&gt;"PeachPuff"&lt;/code&gt;&lt;code class="csharp plain"&gt;: &lt;/code&gt;&lt;/div&gt;&lt;div class="line number56 index55 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;return&lt;/code&gt; &lt;code class="csharp plain"&gt;System.Drawing.Color.PeachPuff.ToArgb(); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number57 index56 alt2"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number58 index57 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;default&lt;/code&gt;&lt;code class="csharp plain"&gt;: &lt;/code&gt;&lt;/div&gt;&lt;div class="line number59 index58 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp keyword"&gt;return&lt;/code&gt; &lt;code class="csharp plain"&gt;System.Drawing.Color.White.ToArgb(); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number60 index59 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number61 index60 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;} &lt;/code&gt;&lt;/div&gt;&lt;div class="line number62 index61 alt1"&gt;&lt;code class="csharp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;调用的代码如下:&lt;/p&gt;&lt;div&gt;&lt;div id="highlighter_255709" class="syntaxhighlighter  csharp ie"&gt;&lt;div class="toolbar"&gt;&lt;span&gt;&lt;a class="toolbar_item command_help help" href="http://www.cnblogs.com/springyangwc/archive/2011/08/12/2136498.html"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;5&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;6&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;7&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;8&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;9&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;10&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;11&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;12&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;13&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;14&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;15&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;16&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;17&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;18&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;19&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;20&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;21&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;22&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;23&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;24&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;25&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;26&lt;/div&gt;&lt;div class="line number27 index26 alt2"&gt;27&lt;/div&gt;&lt;div class="line number28 index27 alt1"&gt;28&lt;/div&gt;&lt;div class="line number29 index28 alt2"&gt;29&lt;/div&gt;&lt;div class="line number30 index29 alt1"&gt;30&lt;/div&gt;&lt;div class="line number31 index30 alt2"&gt;31&lt;/div&gt;&lt;div class="line number32 index31 alt1"&gt;32&lt;/div&gt;&lt;div class="line number33 index32 alt2"&gt;33&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="csharp keyword"&gt;private&lt;/code&gt; &lt;code class="csharp keyword"&gt;void&lt;/code&gt; &lt;code class="csharp plain"&gt;btnRun_Click(&lt;/code&gt;&lt;code class="csharp keyword"&gt;object&lt;/code&gt; &lt;code class="csharp plain"&gt;sender, EventArgs e) &lt;/code&gt;&lt;/div&gt;&lt;div class="line number2 index1 alt1"&gt;&lt;code class="csharp plain"&gt;{ &lt;/code&gt;&lt;/div&gt;&lt;div class="line number3 index2 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;ExcelBase excel = &lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp plain"&gt;ExcelBase(); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number4 index3 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp comments"&gt;//creates the main header &lt;/code&gt;&lt;/div&gt;&lt;div class="line number5 index4 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;ExcelBE be = &lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number6 index5 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;be = &lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp plain"&gt;ExcelBE (5, 2, &lt;/code&gt;&lt;code class="csharp string"&gt;"Total of Products"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"B5"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"D5"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"YELLOW"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp keyword"&gt;true&lt;/code&gt;&lt;code class="csharp plain"&gt;, 10, &lt;/code&gt;&lt;code class="csharp string"&gt;"n"&lt;/code&gt;&lt;code class="csharp plain"&gt;,&lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number7 index6 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;excel.InsertData(be); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number8 index7 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp comments"&gt;//creates subheaders &lt;/code&gt;&lt;/div&gt;&lt;div class="line number9 index8 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;be = &lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp plain"&gt;ExcelBE (6, 2, &lt;/code&gt;&lt;code class="csharp string"&gt;"Sold Product"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"B6"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"B6"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"GRAY"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp keyword"&gt;true&lt;/code&gt;&lt;code class="csharp plain"&gt;, 10, &lt;/code&gt;&lt;code class="csharp string"&gt;""&lt;/code&gt;&lt;code class="csharp plain"&gt;,&lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number10 index9 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;excel.InsertData(be); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number11 index10 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;be=&lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp plain"&gt;ExcelBE(6, 3, &lt;/code&gt;&lt;code class="csharp string"&gt;""&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"C6"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"C6"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"GRAY"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp keyword"&gt;true&lt;/code&gt;&lt;code class="csharp plain"&gt;, 10, &lt;/code&gt;&lt;code class="csharp string"&gt;""&lt;/code&gt;&lt;code class="csharp plain"&gt;,&lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number12 index11 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;excel.InsertData(be); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number13 index12 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;be=&lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp plain"&gt;ExcelBE (6, 4, &lt;/code&gt;&lt;code class="csharp string"&gt;"Initial Total"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"D6"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"D6"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"GRAY"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp keyword"&gt;true&lt;/code&gt;&lt;code class="csharp plain"&gt;, 10, &lt;/code&gt;&lt;code class="csharp string"&gt;""&lt;/code&gt;&lt;code class="csharp plain"&gt;,&lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number14 index13 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;excel.InsertData(be); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number15 index14 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp comments"&gt;//add Data to cells &lt;/code&gt;&lt;/div&gt;&lt;div class="line number16 index15 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;be=&lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp plain"&gt;ExcelBE (7, 2, &lt;/code&gt;&lt;code class="csharp string"&gt;"114287"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"B7"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"B7"&lt;/code&gt;&lt;code class="csharp plain"&gt;,&lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;,&lt;/code&gt;&lt;code class="csharp keyword"&gt;false&lt;/code&gt;&lt;code class="csharp plain"&gt;,10,&lt;/code&gt;&lt;code class="csharp string"&gt;""&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"#,##0"&lt;/code&gt;&lt;code class="csharp plain"&gt;); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number17 index16 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;excel.InsertData(be); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number18 index17 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;be=&lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp plain"&gt;ExcelBE (7, 3, &lt;/code&gt;&lt;code class="csharp string"&gt;""&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"C7"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"C7"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;,&lt;/code&gt;&lt;code class="csharp keyword"&gt;false&lt;/code&gt;&lt;code class="csharp plain"&gt;,10,&lt;/code&gt;&lt;code class="csharp string"&gt;""&lt;/code&gt;&lt;code class="csharp plain"&gt;,&lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number19 index18 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;excel.InsertData(be); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number20 index19 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;be = &lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp plain"&gt;ExcelBE(7, 4, &lt;/code&gt;&lt;code class="csharp string"&gt;"129121"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"D7"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"D7"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp keyword"&gt;false&lt;/code&gt;&lt;code class="csharp plain"&gt;, 10, &lt;/code&gt;&lt;code class="csharp string"&gt;""&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"#,##0"&lt;/code&gt;&lt;code class="csharp plain"&gt;); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number21 index20 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;excel.InsertData(be); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number22 index21 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp comments"&gt;//add percentage row &lt;/code&gt;&lt;/div&gt;&lt;div class="line number23 index22 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;be = &lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp plain"&gt;ExcelBE(8, 2, &lt;/code&gt;&lt;code class="csharp string"&gt;""&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"B8"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"B8"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp keyword"&gt;false&lt;/code&gt;&lt;code class="csharp plain"&gt;, 10, &lt;/code&gt;&lt;code class="csharp string"&gt;""&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;""&lt;/code&gt;&lt;code class="csharp plain"&gt;); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number24 index23 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;excel.InsertData(be); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number25 index24 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;be = &lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp plain"&gt;ExcelBE(8, 3, &lt;/code&gt;&lt;code class="csharp string"&gt;"=B7/D7"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"C8"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"C8"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp keyword"&gt;false&lt;/code&gt;&lt;code class="csharp plain"&gt;, 10, &lt;/code&gt;&lt;code class="csharp string"&gt;""&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"0.0%"&lt;/code&gt;&lt;code class="csharp plain"&gt;); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number26 index25 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;excel.InsertData(be); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number27 index26 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;be = &lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp plain"&gt;ExcelBE(8, 4, &lt;/code&gt;&lt;code class="csharp string"&gt;""&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"D8"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"D8"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp keyword"&gt;false&lt;/code&gt;&lt;code class="csharp plain"&gt;, 10, &lt;/code&gt;&lt;code class="csharp string"&gt;""&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;""&lt;/code&gt;&lt;code class="csharp plain"&gt;); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number28 index27 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;excel.InsertData(be); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number29 index28 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp comments"&gt;//add empty divider &lt;/code&gt;&lt;/div&gt;&lt;div class="line number30 index29 alt1"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;be = &lt;/code&gt;&lt;code class="csharp keyword"&gt;new&lt;/code&gt; &lt;code class="csharp plain"&gt;ExcelBE(9, 2, &lt;/code&gt;&lt;code class="csharp string"&gt;""&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"B9"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"D9"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp string"&gt;"GAINSBORO"&lt;/code&gt;&lt;code class="csharp plain"&gt;, &lt;/code&gt;&lt;code class="csharp keyword"&gt;true&lt;/code&gt;&lt;code class="csharp plain"&gt;, 10, &lt;/code&gt;&lt;code class="csharp string"&gt;""&lt;/code&gt;&lt;code class="csharp plain"&gt;,&lt;/code&gt;&lt;code class="csharp keyword"&gt;null&lt;/code&gt;&lt;code class="csharp plain"&gt;); &lt;/code&gt;&lt;/div&gt;&lt;div class="line number31 index30 alt2"&gt;&lt;code class="csharp spaces"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code class="csharp plain"&gt;excel.InsertData(be);&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;/div&gt;&lt;div class="line number32 index31 alt1"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line number33 index32 alt2"&gt;&lt;code class="csharp plain"&gt;}&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;结果如下图所示：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/springyangwc/201108/201108121714553380.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/springyangwc/201108/201108121714571787.png" alt="image" width="620" height="297" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;作者：&lt;a href="http://home.cnblogs.com/u/springyangwc/"&gt;spring yang&lt;/a&gt;&lt;/p&gt;&lt;p&gt;出处：&lt;a href="http://www.cnblogs.com/springyangwc/"&gt;http://www.cnblogs.com/springyangwc/&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;script type="text/javascript"&gt;&lt;/script&gt;&lt;div id="blog_post_info_block"&gt;&lt;div id="BlogPostCategory"&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/blsong/aggbug/2282326.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/blsong/archive/2011/12/09/2282326.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/blsong/archive/2011/10/27/2226753.html</id><title type="text">(转)jquery调WCF</title><summary type="text">在项目中用过一些WCF的技术这篇文章是对以前用过的一点东西的一个梳理一,webconfig的配置除了一般的配置外,与WCF相关的配置如下&lt;system.serviceModel&gt;&lt;behaviors&gt;&lt;endpointBehaviors&gt;&lt;behaviorname="AllenBehavior"&gt;&lt;enableWebScript/&gt;&lt;/behavior&gt;&lt;/endpointBehaviors&gt;&lt;/behaviors&gt;&lt;serviceHostingEnvironmentasp</summary><published>2011-10-27T08:33:00Z</published><updated>2011-10-27T08:33:00Z</updated><author><name>风雨者2</name><uri>http://www.cnblogs.com/blsong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/blsong/archive/2011/10/27/2226753.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/blsong/archive/2011/10/27/2226753.html"/><content type="html">&lt;div id="cnblogs_post_body"&gt;&lt;p&gt;在项目中用过一些WCF的技术&lt;br /&gt;这篇文章是对以前用过的一点东西的一个梳理&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;一,webconfig的配置&lt;/span&gt;&lt;br /&gt;除了一般的配置外,与WCF相关的配置如下&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;behaviors&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;endpointBehaviors&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;behavior&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="AllenBehavior"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;enableWebScript&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;behavior&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;endpointBehaviors&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;behaviors&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;serviceHostingEnvironment&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;aspNetCompatibilityEnabled&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="true"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;services&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;service&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="jqueryWCF.WCFservice"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;endpoint&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;address&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;=""&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&amp;nbsp;behaviorConfiguration&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="AllenBehavior"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&amp;nbsp;&amp;nbsp;binding&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="webHttpBinding"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&amp;nbsp;contract&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="jqueryWCF.WCFservice"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;service&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;services&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;其中&amp;lt;service&amp;gt;节点中的name属性,是实现了服务契约的类型名,类型名必须是完整的,要包括名称空间&lt;br /&gt;&amp;lt;endpoint&amp;gt;节点的address属性为空,说明使用基地址.&lt;br /&gt;behaviorConfiguration属性与behavior节点的name属性相匹配&lt;br /&gt;binding属性说明WCF服务使用什么协议,这里是HTTP协议&lt;br /&gt;contract属性是描述契约的接口名称,也必须是完整的.如果没有接口直接写实现契约的类型名也可以(我这里就是这样).&lt;/p&gt;&lt;div&gt;&amp;lt;behavior&amp;gt;节点的信息是描述WCF服务端的一些特性,行为的&lt;/div&gt;&lt;div&gt;&amp;lt;behavior name="AllenBehavior"&amp;gt; name属性与前面说的behaviorConfiguration属性一致&lt;br /&gt;&amp;lt;enableWebScript /&amp;gt;节点使我们的WCF支持ajax&lt;br /&gt;&lt;br /&gt;&amp;lt;serviceHostingEnvironment aspNetCompatibilityEnabled="true" /&amp;gt;&lt;br /&gt;与后端的AspNetCompatibilityRequirements配合使用&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;span style="color: #ff0000;"&gt;二:页面中的js代码&lt;br /&gt;&lt;/span&gt;这段JS是写在JQUERY框架下面的&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;function&amp;nbsp;callServer(){&lt;br /&gt;var&amp;nbsp;id&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Number($(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;#id&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;).val());&lt;br /&gt;var&amp;nbsp;title&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;String($(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;#title&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;).val());&lt;br /&gt;var&amp;nbsp;content&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;String($(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;#content&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;).val());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$.ajax({&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;post&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;/WCFservice.svc/InsertRow&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;contentType:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;text/json&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;{"id":&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;id&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,"title":"&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;title&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;","content":"&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;content&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;"}&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;success:&amp;nbsp;function(msg)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;a&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;eval(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;msg&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(String(a.d).length&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;){alert(a.d);}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;{alert(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;服务器超时&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;其中&lt;br /&gt;$.ajax(.....)是框架提供的一个调用ajax的方法,兼容目前大多数浏览器&lt;/div&gt;&lt;div&gt;&lt;br /&gt;url: '/WCFservice.svc/InsertRow'&lt;br /&gt;这里是WCF的地址+方法名&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;contentType: 'text/json',&lt;/div&gt;&lt;div&gt;这是以JSON的方式POST数据,当然也可以用XML的方式(要配合WCF后端的定义)&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;data: '{"id":'+id+',"title":"'+title+'","content":"'+content+'"}',&lt;/div&gt;&lt;div&gt;数据必须按照InsertRow方法的签名传递(这里稍有不慎就出错了,而且js的调试比较难搞)&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;success: function(msg) {}&lt;/div&gt;&lt;div&gt;成功后的回调函数,msg参数是一个object类型的,要eval()一下才能得到里面的数据&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;span style="color: #ff0000;"&gt;三:后端WCF代码&lt;br /&gt;&lt;/span&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Linq;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Runtime.Serialization;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.ServiceModel;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.ServiceModel.Activation;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.ServiceModel.Web;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;jqueryWCF&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[ServiceContract(Namespace&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[AspNetCompatibilityRequirements(RequirementsMode&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;AspNetCompatibilityRequirementsMode.Allowed)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;WCFservice&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[OperationContract]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[WebInvoke(RequestFormat&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;WebMessageFormat.Json,&amp;nbsp;ResponseFormat&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;WebMessageFormat.Json,&amp;nbsp;BodyStyle&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;WebMessageBodyStyle.WrappedRequest)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;InsertRow(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;id,&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;title,&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;content)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Format(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;您输入的标题是：{0}\n\n您输入的内容是：{1}\n\n此文章的id是：{2}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,title,content,id.ToString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;系统要引用System.ServiceModel.Web的DLL默认是不引用的&lt;/div&gt;&lt;div&gt;ServiceContract属性把此类型公开在WCF服务中&lt;/div&gt;&lt;div&gt;AspNetCompatibilityRequirements属性确保端点使用了WEBHTTP绑定模型&lt;br /&gt;与webconfig中的&amp;lt;serviceHostingEnvironment aspNetCompatibilityEnabled="true" /&amp;gt;配合使用&lt;br /&gt;&lt;br /&gt;OperationContract属性把方法公开在WCF服务中&lt;br /&gt;&lt;br /&gt;RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json&lt;br /&gt;说明传递近来的数据都是JSON形式的,只有两种形式,一个是JSON,一个是XML.&lt;br /&gt;(我觉得JSON更"对象"一点,XML更"数据"一点)&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;BodyStyle = WebMessageBodyStyle.WrappedRequest&lt;/div&gt;&lt;div&gt;是把参数包装一下&lt;br /&gt;这样可以传递多个参数进来,&lt;/div&gt;&lt;div&gt;我猜返回值之所以是一个javascript的对象(json流得来的对象)也是因为这里&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;项目示例:&lt;a href="http://files.cnblogs.com/liulun/jqueryWCF.rar"&gt;点此下载&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/liulun/articles/1425382.html#1661515"&gt;http://www.cnblogs.com/liulun/articles/1425382.html#1661515&lt;/a&gt;&amp;nbsp;注：评论更精彩&lt;/p&gt;&lt;p&gt;相关文章：&lt;a href="http://www.cnblogs.com/dudu/archive/2009/07/14/1523082.html"&gt;http://www.cnblogs.com/dudu/archive/2009/07/14/1523082.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cokkiy/archive/2009/10/22/jscallwcf.html"&gt;http://www.cnblogs.com/cokkiy/archive/2009/10/22/jscallwcf.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/dudu/archive/2011/01/19/1939094.html"&gt;http://www.cnblogs.com/dudu/archive/2011/01/19/1939094.html&lt;/a&gt;&lt;script type="text/javascript"&gt;&lt;/script&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/blsong/aggbug/2226753.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/blsong/archive/2011/10/27/2226753.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/blsong/archive/2011/10/27/2226375.html</id><title type="text">JavaScript的单线程性质以及定时器的工作原理</title><summary type="text">最近在写JavaScript时遇到一些问题，就是当JavaScript多事件连续触发，JavaScript的单线程引擎是如何控制的。找了一些资料，觉得很有用，在此分享一下。虽然不是原创，但是觉得此文章对JavaScript程序员非常有用。翻译的不是十分精确，但希望对大家有用。原文：John Resighttp://ejohn.org/blog/how-javascript-timers-work/How JavaScript Timers Work从基础的层面来讲，理解JavaScript的定时器是如何工作的是非常重要的。计时器的执行常常和我们的直观想象不同，那是因为JavaScript引擎是</summary><published>2011-10-27T04:55:00Z</published><updated>2011-10-27T04:55:00Z</updated><author><name>风雨者2</name><uri>http://www.cnblogs.com/blsong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/blsong/archive/2011/10/27/2226375.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/blsong/archive/2011/10/27/2226375.html"/><content type="html">&lt;div style="line-height: 150%; margin: 0px; font-family: verdana, 'courier new'; font-size: 14px; cursor: pointer; padding: 3px;"&gt;&lt;p&gt;最近在写JavaScript时遇到一些问题，就是当JavaScript多事件连续触发，JavaScript的单线程引擎是如何控制的。找了一些资料，觉得很有用，在此分享一下。&amp;nbsp;&lt;/p&gt;&lt;p&gt;虽然不是原创，但是觉得此文章对JavaScript程序员非常有用。翻译的不是十分精确，但希望对大家有用。&lt;/p&gt;&lt;p&gt;原文：John Resig&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href="http://ejohn.org/blog/how-javascript-timers-work/"&gt;http://ejohn.org/blog/how-javascript-timers-work/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 14pt;"&gt;How JavaScript Timers Work&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="postentry"&gt;&lt;p&gt;从基础的层面来讲，理解JavaScript的定时器是如何工作的是非常重要的。计时器的执行常常和我们的直观想象不同，那是因为JavaScript引擎是单线程的。我们先来认识一下下面三个函数是如何控制计时器的。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;var id = setTimeout(fn, delay);&lt;/code&gt;&amp;nbsp;- 初始化一个计时器，然后在指定的时间间隔后执行。该函数返回一个唯一的标志ID（Number类型），我们可以使用它来取消计时器。&lt;/li&gt;&lt;li&gt;&lt;code&gt;var id = setInterval(fn, delay);&lt;/code&gt;&amp;nbsp;- 和setTimeout有些类似，但它是连续调用一个函数（时间间隔是delay参数）直到它被取消。&lt;/li&gt;&lt;li&gt;&lt;code&gt;clearInterval(id);&lt;/code&gt;,&amp;nbsp;&lt;code&gt;clearTimeout(id);&lt;/code&gt;&amp;nbsp;- 使用计时器ID（setTimeout 和 setInterval的返回值）来取消计时器回调的发生&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;为了理解计时器的内在执行原理，有一个重要的概念需要加以探讨：计时器的延迟(delay)是无法得到保障的。由于所有JavaScript代码是在一个线程里执行的，所有异步事件（例如，鼠标点击和计时器）只有拥有执行机会时才会执行。用一个很好的图表加以说明：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;center&gt;&lt;a href="http://ejohn.org/files/Timers.png"&gt;&lt;img style="border-width: 0px;" alt="" src="http://ejohn.org/files/427px-Timers.png" /&gt;&lt;br /&gt;(点击查看大图)&lt;/a&gt;&lt;/center&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;在这个图表中有许多信息需要理解，如果完全理解了它们，你会对JavaScript引擎如何实现异步事件有一个很好的认识。这是一个一维的图标：垂直方向表示时间，蓝色的区块表示JavaScript代码执行块。例如第一个JavaScript代码执行块需要大约18ms，鼠标点击所触发的代码执行块需要11ms，等等。&lt;/p&gt;&lt;p&gt;由于JavaScript引擎同一时间只执行一条代码（这是由于JavaScript单线程的性质），所以每一个JavaScript代码执行块会&amp;ldquo;阻塞&amp;rdquo;其它异步事件的执行。这就意味着当一个异步事件发生（例如，鼠标点击，计时器被触发，或者Ajax异步请求）后，这些事件的回调函数将排在执行队列的最后等待执行（实际上，排队的方式根据浏览器的不同而不同，所以这里只是一个简化）；&lt;/p&gt;&lt;p&gt;从第一个JavaScript执行块开始研究，在第一个执行块中两个计时器被初始化：一个10ms的&lt;code&gt;setTimeout()&lt;/code&gt;和一个10ms的&lt;code&gt;setInterval()&lt;/code&gt;。依据何时何地计时器被初始化(计时器初始化完毕后就会开始计时)，计时器实际上会在第一个代码块执行完毕前被触发。但是，计时器上绑定的函数不会立即执行（不被立即执行的原因是JavaScript是单线程的）。实际上，被延迟的函数将依次排在执行队列的最后，等待下一次恰当的时间再执行。&lt;/p&gt;&lt;p&gt;此外，在第一个JavaScript执行块中我们看到了一个&amp;ldquo;鼠标点击&amp;rdquo;事件发生了。一个JavaScript回调函数绑定在这个异步事件上了（我们从来不知道用户什么时候执行这个（点击）事件，因此认为它是异步的），这个函数不会被立即执行，和上面的计时器一样，它将排在执行队列的最后，等待下一次恰当的时候执行。&lt;/p&gt;&lt;p&gt;当第一个JavaScript执行块执行完毕后，浏览器会立即问一个问题：哪个函数（语句）在等待被执行？在这时，一个&amp;ldquo;鼠标点击事件处理函数&amp;rdquo;和一个&amp;ldquo;计时器回调函数&amp;rdquo;都在等待执行。浏览器会选择一个（实际上选择了&amp;ldquo;鼠标点击事件的处理函数&amp;rdquo;，因为由图可知它是先进队的）立即执行。而&amp;ldquo;计时器回调函数&amp;rdquo;将等待下次适合的时间执行。&lt;/p&gt;&lt;p&gt;注意，当&amp;ldquo;鼠标点击事件处理函数&amp;rdquo;执行的时候，&lt;code&gt;setInterval&lt;/code&gt;的回调函数第一次被触发了。和&lt;code&gt;setTimeout&lt;/code&gt;的回调函数一样，它将排到执行队列的最后等待执行。但是，一定要注意这一点：当&lt;code&gt;setInterva&lt;/code&gt;l回调函数第二次被触发时（此时&lt;code&gt;setTimeout&lt;/code&gt;函数仍在执行）&lt;code&gt;setTimeout&lt;/code&gt;的第一次触发将被抛弃掉。当一个很长的代码块在执行时，可能把所有的&lt;code&gt;setInterval&lt;/code&gt;回调函数都排在执行队列的后面，代码块执行完之后，结果便会是一大串的setInterval回调函数等待执行，并且这些函数之间没有间隔，直到全部完成。所以，浏览器倾向于的当没有更多&lt;code&gt;interval&lt;/code&gt;的处理函数在排队时再将下一个处理函数排到队尾(这是由于间隔的问题)。&lt;/p&gt;&lt;p&gt;我们能够发现，当第三个&lt;code&gt;setInterval&lt;/code&gt;回调函数被触发时，之前的setInterval回调函数仍在执行。这就说明了一个很重要的事实：&lt;code&gt;setInterval&lt;/code&gt;不会考虑当前正在执行什么，而把所有的堵塞的函数排到队列尾部。这意味着两次setInterval回调函数之间的时间间隔会被牺牲掉（缩减）。&lt;/p&gt;&lt;p&gt;最后，当第二个&lt;code&gt;setInterval&lt;/code&gt;回调函数执行完毕后，我们可以看到没有任何程序等待JavaScript引擎执行了。这就意味着浏览器现在在等待一个新的异步事件的发生。在50ms时一个新的&lt;code&gt;setInterval&lt;/code&gt;回调函数再次被触发，这时，没有任何的执行块阻塞它的执行了。所以它会立刻被执行。&lt;/p&gt;&lt;p&gt;让我们用一个例子来阐明&lt;code&gt;setTimeout&lt;/code&gt;和&lt;code&gt;setInterval&lt;/code&gt;之间的区别：&lt;/p&gt;&lt;div class="syntax_hilite"&gt;&lt;div id="js-1"&gt;&lt;div&gt;&amp;nbsp; setTimeout&lt;span style="color: #008800; font-weight: bold;"&gt;(&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #008800; font-weight: bold;"&gt;(&lt;/span&gt;&lt;span style="color: #008800; font-weight: bold;"&gt;)&lt;/span&gt;&lt;span style="color: #008800; font-weight: bold;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="font-style: italic; color: #009900;"&gt;/* Some long block of code... */&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; setTimeout&lt;span style="color: #008800; font-weight: bold;"&gt;(&lt;/span&gt;arguments.&lt;span style="color: #006600;"&gt;callee&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #cc0000;"&gt;10&lt;/span&gt;&lt;span style="color: #008800; font-weight: bold;"&gt;)&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008800; font-weight: bold;"&gt;}&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #cc0000;"&gt;10&lt;/span&gt;&lt;span style="color: #008800; font-weight: bold;"&gt;)&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; setInterval&lt;span style="color: #008800; font-weight: bold;"&gt;(&lt;/span&gt;&lt;span style="color: #003366; font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: #008800; font-weight: bold;"&gt;(&lt;/span&gt;&lt;span style="color: #008800; font-weight: bold;"&gt;)&lt;/span&gt;&lt;span style="color: #008800; font-weight: bold;"&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="font-style: italic; color: #009900;"&gt;/* Some long block of code... */&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008800; font-weight: bold;"&gt;}&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #cc0000;"&gt;10&lt;/span&gt;&lt;span style="color: #008800; font-weight: bold;"&gt;)&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这两句代码乍一看没什么差别，但是它们是不同的。setTimeout回调函数的执行和上一次执行之间的间隔至少有10ms（可能会更多，但不会少于10ms），而setInterval的回调函数将尝试每隔10ms执行一次，不论上次是否执行完毕。&lt;/p&gt;&lt;p&gt;在这里我们学到了很多知识，总结一下：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;JavaScript引擎是单线程的，强制所有的异步事件排队等待执行&lt;/li&gt;&lt;li&gt;&lt;code&gt;setTimeout&lt;/code&gt;&amp;nbsp;和&amp;nbsp;&lt;code&gt;setInterval&lt;/code&gt;&amp;nbsp;在执行异步代码的时候有着根本的不同&lt;/li&gt;&lt;li&gt;如果一个计时器被阻塞而不能立即执行，它将延迟执行直到下一次可能执行的时间点才被执行（比期望的时间间隔要长些）&lt;/li&gt;&lt;li&gt;如果&lt;code&gt;setInterval&lt;/code&gt;回调函数的执行时间将足够长（比指定的时间间隔长），它们将连续执行并且彼此之间没有时间间隔。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;上述这些知识点都是非常重要的。了解了JavaScript引擎是如何工作的，尤其是大量的异步事件（连续）发生时，才能为构建高级应用程序打好基础。&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.phpweblog.net/rainman/archive/2009/01/05/6267.html"&gt;http://www.phpweblog.net/rainman/archive/2009/01/05/6267.html&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/blsong/aggbug/2226375.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/blsong/archive/2011/10/27/2226375.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/blsong/archive/2011/10/27/2226265.html</id><title type="text">深入理解JavaScript定时机制</title><summary type="text">本文地址: http://www.laruence.com/2009/09/23/1089.html转载文章转帖地址:http://www.9demo.com/archives/341容易欺骗别人感情的JavaScript定时器JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如setTimeout(function() { alert('你好!');}, 0);setInterval(callbackFunction, 100);认为setTimeout</summary><published>2011-10-27T03:33:00Z</published><updated>2011-10-27T03:33:00Z</updated><author><name>风雨者2</name><uri>http://www.cnblogs.com/blsong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/blsong/archive/2011/10/27/2226265.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/blsong/archive/2011/10/27/2226265.html"/><content type="html">&lt;div class="copyright"&gt;&lt;ul&gt;&lt;li&gt;本文地址: &lt;a title="Permanet Link to 深入理解JavaScript定时机制" href="http://www.laruence.com/2009/09/23/1089.html"&gt;http://www.laruence.com/2009/09/23/1089.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;转载文章&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;转帖地址:&lt;a href="http://www.9demo.com/archives/341"&gt;http://www.9demo.com/archives/341&lt;/a&gt;&lt;/p&gt;&lt;p&gt;容易欺骗别人感情的JavaScript定时器&lt;/p&gt;&lt;p&gt;JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如&lt;/p&gt;&lt;span class="sh_function"&gt;setTimeout&lt;/span&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;function&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br/&gt;    &lt;span class="sh_function"&gt;alert&lt;/span&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;'你好!'&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br/&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br/&gt;&lt;span class="sh_function"&gt;setInterval&lt;/span&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;callbackFunction&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;100&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br/&gt;&lt;p&gt;认为setTimeout中的问候方法会立即被执行,因为这并不是凭空而说,而是JavaScript API文档明确定义第二个参数意义为隔多少毫秒后,回调方法就会被执行. 这里设成0毫秒,理所当然就立即被执行了.&lt;br /&gt;同理对setInterval的callbackFunction方法每间隔100毫秒就立即被执行深信不疑!&lt;/p&gt;&lt;p&gt;但随着JavaScript应用开发经验不断的增加和丰富,有一天你发现了一段怪异的代码而百思不得其解:&lt;/p&gt;div&lt;span class="sh_symbol"&gt;.&lt;/span&gt;onclick &lt;span class="sh_symbol"&gt;=&lt;/span&gt; &lt;span class="sh_keyword"&gt;function&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br/&gt;        &lt;span class="sh_function"&gt;setTimeout&lt;/span&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;function&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br/&gt;                document&lt;span class="sh_symbol"&gt;.&lt;/span&gt;&lt;span class="sh_function"&gt;getElementById&lt;/span&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;'inputField'&lt;/span&gt;&lt;span class="sh_symbol"&gt;).&lt;/span&gt;&lt;span class="sh_function"&gt;focus&lt;/span&gt;&lt;span class="sh_symbol"&gt;();&lt;/span&gt;&lt;br/&gt;        &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;0&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br/&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;;&lt;/span&gt;&lt;br/&gt;&lt;p&gt;既然是0毫秒后执行,那么还用setTimeout干什么, 此刻, 坚定的信念已开始动摇.&lt;/p&gt;&lt;p&gt;直到最后某一天 , 你不小心写了一段糟糕的代码:&lt;/p&gt;&lt;span class="sh_function"&gt;setTimeout&lt;/span&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;function&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br/&gt;        &lt;span class="sh_keyword"&gt;while&lt;/span&gt; &lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;true&lt;/span&gt;&lt;span class="sh_symbol"&gt;)&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br/&gt;        &lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;br/&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;100&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br/&gt;&lt;span class="sh_function"&gt;setTimeout&lt;/span&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;function&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br/&gt;        &lt;span class="sh_function"&gt;alert&lt;/span&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_string"&gt;'你好!'&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br/&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;200&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br/&gt;&lt;span class="sh_function"&gt;setInterval&lt;/span&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;callbackFunction&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;200&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br/&gt;&lt;p&gt;第一行代码进入了死循环,但不久你就会发现,第二,第三行并不是预料中的事情,alert问候未见出现,callbacKFunction也杳无音讯!&lt;/p&gt;&lt;p&gt;这时你彻底迷惘了,这种情景是难以接受的,因为改变长久以来既定的认知去接受新思想的过程是痛苦的,但情事实摆在眼前,对JavaScript真理的探求并不会因为痛苦而停止,下面让我们来展开JavaScript线程和定时器探索之旅!&lt;/p&gt;&lt;p&gt;拔开云雾见月明&lt;/p&gt;&lt;p&gt;出现上面所有误区的最主要一个原因是:潜意识中认为,JavaScript引擎有多个线程在执行,JavaScript的定时器回调函数是异步执行的.&lt;/p&gt;&lt;p&gt;而事实上的,JavaScript使用了障眼法,在多数时候骗过了我们的眼睛,这里背光得澄清一个事实:&lt;/p&gt;&lt;p&gt;JavaScript引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行JavaScript程序.&lt;/p&gt;&lt;p&gt;JavaScript引擎用单线程运行也是有意义的,单线程不必理会线程同步这些复杂的问题,问题得到简化.&lt;/p&gt;&lt;p&gt;那么单线程的JavaScript引擎是怎么配合浏览器内核处理这些定时器和响应浏览器事件的呢?&lt;br /&gt;下面结合浏览器内核处理方式简单说明.&lt;/p&gt;&lt;p&gt;浏览器内核实现允许多个线程异步执行,这些线程在内核制控下相互配合以保持同步.假如某一浏览器内核的实现至少有三个常驻线程:javascript引擎线程,界面渲染线程,浏览器事件触发线程,除些以外,也有一些执行完就终止的线程,如Http请求线程,这些异步线程都会产生不同的异步事件,下面通过一个图来阐明单线程的JavaScript引擎与另外那些线程是怎样互动通信的.虽然每个浏览器内核实现细节不同,但这其中的调用原理都是大同小异.&lt;/p&gt;&lt;div style="width: 510px;" id="attachment_1090" class="wp-caption aligncenter"&gt;&lt;a href="http://laruence-wordpress.stor.sinaapp.com/uploads/jstimer.jpg"&gt;&lt;img class="size-full wp-image-1090" title="jstimer" alt="Js线程图示" src="http://laruence-wordpress.stor.sinaapp.com/uploads/jstimer.jpg" width="500" height="272" /&gt;&lt;/a&gt;&lt;p class="wp-caption-text"&gt;Js线程图示&lt;/p&gt;&lt;/div&gt;&lt;p&gt;由图可看出,浏览器中的JavaScript引擎是基于事件驱动的,这里的事件可看作是浏览器派给它的各种任务,这些任务可以源自JavaScript引擎当前执行的代码块,如调用setTimeout添加一个任务,也可来自浏览器内核的其它线程,如界面元素鼠标点击事件,定时触发器时间到达通知,异步请求状态变更通知等.从代码角度看来任务实体就是各种回调函数,JavaScript引擎一直等待着任务队列中任务的到来.由于单线程关系,这些任务得进行排队,一个接着一个被引擎处理.&lt;/p&gt;&lt;p&gt;上图t1-t2..tn表示不同的时间点,tn下面对应的小方块代表该时间点的任务,假设现在是t1时刻,引擎运行在t1对应的任务方块代码内,在这个时间点内,我们来描述一下浏览器内核其它线程的状态.&lt;/p&gt;&lt;p&gt;t1时刻:&lt;/p&gt;&lt;p&gt;GUI渲染线程:&lt;/p&gt;&lt;p&gt;该线程负责渲染浏览器界面HTML元素,当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行.本文虽然重点解释JavaScript定时机制,但这时有必要说说渲染线程,因为该线程与JavaScript引擎线程是互斥的,这容易理解,因为JavaScript脚本是可操纵DOM元素,在修改这些元素属性同时渲染界面,那么渲染线程前后获得的元素数据就可能不一致了.&lt;/p&gt;&lt;p&gt;在JavaScript引擎运行脚本期间,浏览器渲染线程都是处于挂起状态的,也就是说被&amp;rdquo;冻结&amp;rdquo;了.&lt;/p&gt;&lt;p&gt;所以,在脚本中执行对界面进行更新操作,如添加结点,删除结点或改变结点的外观等更新并不会立即体现出来,这些操作将保存在一个队列中,待JavaScript引擎空闲时才有机会渲染出来.&lt;/p&gt;&lt;p&gt;GUI事件触发线程:&lt;/p&gt;&lt;p&gt;JavaScript脚本的执行不影响html元素事件的触发,在t1时间段内,首先是用户点击了一个鼠标键,点击被浏览器事件触发线程捕捉后形成一个鼠标点击事件,由图可知,对于JavaScript引擎线程来说,这事件是由其它线程异步传到任务队列尾的,由于引擎正在处理t1时的任务,这个鼠标点击事件正在等待处理.&lt;/p&gt;&lt;p&gt;定时触发线程:&lt;/p&gt;&lt;p&gt;注意这里的浏览器模型定时计数器并不是由JavaScript引擎计数的,因为JavaScript引擎是单线程的,如果处于阻塞线程状态就计不了时,它必须依赖外部来计时并触发定时,所以队列中的定时事件也是异步事件.&lt;/p&gt;&lt;p&gt;由图可知,在这t1的时间段内,继鼠标点击事件触发后,先前已设置的setTimeout定时也到达了,此刻对JavaScript引擎来说,定时触发线程产生了一个异步定时事件并放到任务队列中, 该事件被排到点击事件回调之后,等待处理.&lt;br /&gt;同理, 还是在t1时间段内,接下来某个setInterval定时器也被添加了,由于是间隔定时,在t1段内连续被触发了两次,这两个事件被排到队尾等待处理.&lt;/p&gt;&lt;p&gt;可见,假如时间段t1非常长,远大于setInterval的定时间隔,那么定时触发线程就会源源不断的产生异步定时事件并放到任务队列尾而不管它们是否已被处理,但一旦t1和最先的定时事件前面的任务已处理完,这些排列中的定时事件就依次不间断的被执行,这是因为,对于JavaScript引擎来说,在处理队列中的各任务处理方式都是一样的,只是处理的次序不同而已.&lt;/p&gt;&lt;p&gt;t1过后,也就是说当前处理的任务已返回,JavaScript引擎会检查任务队列,发现当前队列非空,就取出t2下面对应的任务执行,其它时间依此类推,由此看来:&lt;/p&gt;&lt;p&gt;如果队列非空,引擎就从队列头取出一个任务,直到该任务处理完,即返回后引擎接着运行下一个任务,在任务没返回前队列中的其它任务是没法被执行的.&lt;/p&gt;&lt;p&gt;相信您现在已经很清楚JavaScript是否可多线程,也了解理解JavaScript定时器运行机制了,下面我们来对一些案例进行分析:&lt;/p&gt;&lt;p&gt;案例1:setTimeout与setInterval&lt;/p&gt;&lt;span class="sh_function"&gt;setTimeout&lt;/span&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;function&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt; &lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br/&gt;        &lt;span class="sh_comment"&gt;/* 代码块... */&lt;/span&gt;&lt;br/&gt;        &lt;span class="sh_function"&gt;setTimeout&lt;/span&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_predef_var"&gt;arguments&lt;/span&gt;&lt;span class="sh_symbol"&gt;.&lt;/span&gt;callee&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;10&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br/&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;10&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span class="sh_function"&gt;setInterval&lt;/span&gt;&lt;span class="sh_symbol"&gt;(&lt;/span&gt;&lt;span class="sh_keyword"&gt;function&lt;/span&gt;&lt;span class="sh_symbol"&gt;()&lt;/span&gt;&lt;span class="sh_cbracket"&gt;{&lt;/span&gt;&lt;br/&gt;        &lt;span class="sh_comment"&gt;/*代码块... */&lt;/span&gt;&lt;br/&gt;&lt;span class="sh_cbracket"&gt;}&lt;/span&gt;&lt;span class="sh_symbol"&gt;,&lt;/span&gt; &lt;span class="sh_number"&gt;10&lt;/span&gt;&lt;span class="sh_symbol"&gt;);&lt;/span&gt;&lt;br/&gt;&lt;p&gt;这两段代码看一起效果一样,其实非也,第一段中回调函数内的setTimeout是JavaScript引擎执行后再设置新的setTimeout定时, 假定上一个回调处理完到下一个回调开始处理为一个时间间隔,理论两个setTimeout回调执行时间间隔&amp;gt;=10ms .第二段自setInterval设置定时后,定时触发线程就会源源不断的每隔十秒产生异步定时事件并放到任务队列尾,理论上两个setInterval回调执行时间间隔&amp;lt;=10.&lt;/p&gt;&lt;p&gt;案例2:ajax异步请求是否真的异步?&lt;/p&gt;&lt;p&gt;很多同学朋友搞不清楚,既然说JavaScript是单线程运行的,那么XMLHttpRequest在连接后是否真的异步?&lt;br /&gt;其实请求确实是异步的,不过这请求是由浏览器新开一个线程请求(参见上图),当请求的状态变更时,如果先前已设置回调,这异步线程就产生状态变更事件放到JavaScript引擎的处理队列中等待处理,当任务被处理时,JavaScript引擎始终是单线程运行回调函数,具体点即还是单线程运行onreadystatechange所设置的函数.&lt;script type="text/javascript" src="http://www.laruence.com/wp-content/plugins/shjs-syntax-hiliter/shjs/lang/sh_javascript.js"&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://www.laruence.com/wp-content/plugins/shjs-syntax-hiliter/shjs/lang/sh_javascript.js"&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://www.laruence.com/wp-content/plugins/shjs-syntax-hiliter/shjs/lang/sh_javascript.js"&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://www.laruence.com/wp-content/plugins/shjs-syntax-hiliter/shjs/lang/sh_javascript.js"&gt;&lt;/script&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/blsong/aggbug/2226265.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/blsong/archive/2011/10/27/2226265.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/blsong/archive/2011/10/27/2226193.html</id><title type="text">JavaScript异步编程的Promise模式</title><summary type="text">异步模式在web编程中变得越来越重要，对于web主流语言Javscript来说，这种模式实现起来不是很利索，为此，许多Javascript库（比如 jQuery和Dojo）添加了一种称为promise的抽象（有时也称之为deferred）。通过这些库，开发人员能够在实际编程中使用 promise模式。IE官方博客最近发表了一篇文章，详细讲述了如何使用XMLHttpRequest2来实践promise模式。我们来了解一下相关的概念和应用。考虑这样一个例子，某网页存在异步操作（通过XMLHttpRequest2或者 Web Workers）。随着Web 2.0技术的深入，浏览器端承受了越来越多的计</summary><published>2011-10-27T02:54:00Z</published><updated>2011-10-27T02:54:00Z</updated><author><name>风雨者2</name><uri>http://www.cnblogs.com/blsong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/blsong/archive/2011/10/27/2226193.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/blsong/archive/2011/10/27/2226193.html"/><content type="html">&lt;p&gt;异步模式在web编程中变得越来越重要，对于web主流语言Javscript来说，这种模式实现起来不是很利索，为此，许多Javascript库（比如 jQuery和Dojo）添加了一种称为promise的抽象（有时也称之为deferred）。通过这些库，开发人员能够在实际编程中使用 promise模式。IE官方博客最近发表了一篇&lt;a href="http://blogs.msdn.com/b/ie/archive/2011/09/11/asynchronous-programming-in-javascript-with-promises.aspx"&gt;文章&lt;/a&gt;，详细讲述了如何使用&lt;a href="http://www.w3.org/TR/XMLHttpRequest2/"&gt;XMLHttpRequest2&lt;/a&gt;来实践promise模式。我们来了解一下相关的概念和应用。&lt;/p&gt;&lt;p&gt;考虑这样一个例子，某网页存在异步操作（通过&lt;a href="http://www.w3.org/TR/XMLHttpRequest2/"&gt;XMLHttpRequest2&lt;/a&gt;或者&lt;a href="http://blogs.msdn.com/b/ie/archive/2011/07/01/web-workers-in-ie10-background-javascript-makes-web-apps-faster.aspx"&gt; Web&lt;/a&gt; &lt;a href="http://blogs.msdn.com/b/ie/archive/2011/07/12/debugging-web-workers-in-ie10.aspx"&gt;Workers&lt;/a&gt;）。随着Web 2.0技术的深入，浏览器端承受了越来越多的计算压力，所以&amp;ldquo;并发&amp;rdquo;具有积极的意义。对于开发人员来说，既要保持页面与用户的交互不受影响，又要协调页面与异步任务的关系，这种非线性执行的编程要求存在适应的困难。先抛开页面交互不谈，我们能够想到对于异步调用需要处理两种结果&amp;mdash;&amp;mdash;成功操作和失败处理。在成功的调用后，我们可能需要把返回的结果用在另一个Ajax请求中，这就会出现&amp;ldquo;函数连环套&amp;rdquo;的情况（在笔者的另一篇文章《&lt;a href="http://www.infoq.com/cn/news/2011/09/nodejs-async-code"&gt;NodeJS的异步编程风格&lt;/a&gt;》中有详细的解释）。这种情况会造成编程的复杂性。看看下面的代码示例（基于XMLHttpRequest2）：&lt;/p&gt;function searchTwitter(term, onload, onerror) {&lt;br/&gt; &lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; var xhr, results, url;&lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; url = 'http://search.twitter.com/search.json?rpp=100&amp;amp;q=' + term;&lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; xhr = new XMLHttpRequest();&lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; xhr.open('GET', url, true);&lt;br/&gt; &lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; xhr.onload = function (e) {&lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (this.status === 200) {&lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; results = JSON.parse(this.responseText);&lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; onload(results);&lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br/&gt; &lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; xhr.onerror = function (e) {&lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; onerror(e);&lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br/&gt; &lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; xhr.send();&lt;br/&gt; }&lt;br/&gt; &lt;br/&gt; function handleError(error) {&lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; /* handle the error */&lt;br/&gt; }&lt;br/&gt; &lt;br/&gt; function concatResults() {&lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; /* order tweets by date */&lt;br/&gt; }&lt;br/&gt; &lt;br/&gt; function loadTweets() {&lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; var container = document.getElementById('container');&lt;br/&gt; &lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; searchTwitter('#IE10', function (data1) {&lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; searchTwitter('#IE9', function (data2) {&lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Reshuffle due to date */&lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var totalResults = concatResults(data1.results, data2.results);&lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; totalResults.forEach(function (tweet) {&lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var el = document.createElement('li');&lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; el.innerText = tweet.text;&lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; container.appendChild(el);&lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }, handleError);&lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; }, handleError);&lt;br/&gt; }&lt;p&gt;上面的代码其功能是获取Twitter中hashtag为IE10和IE9的内容并在页面中显示出来。这种嵌套的回调函数难以理解，开发人员需要仔细分析哪些代码用于应用的业务逻辑，而哪些代码处理异步函数调用的，代码结构支离破碎。错误处理也分解了，我们需要在各个地方检测错误的发生并作出相应的处理。&lt;/p&gt;&lt;p&gt;为了降低异步编程的复杂性，开发人员一直寻找简便的方法来处理异步操作。其中一种处理模式称为promise，它代表了一种可能会长时间运行而且不一定必须完整的操作的结果。这种模式不会阻塞和等待长时间的操作完成，而是返回一个代表了承诺的（promised）结果的对象。&lt;/p&gt;&lt;p&gt;考虑这样一个例子，页面代码需要访问第三方的API，网络延迟可能会造成响应时间较长，在这种情况下，采用异步编程不会影响整个页面与用户的交互。promise模式通常会实现一种称为then的方法，用来注册状态变化时对应的回调函数。比如下面的代码示例：&lt;/p&gt;searchTwitter(term).then(filterResults).then(displayResults);&lt;p&gt;promise模式在任何时刻都处于以下三种状态之一：未完成（unfulfilled）、已完成（resolved）和拒绝（rejected）。以CommonJS Promise/A 标准为例，promise对象上的then方法负责添加针对已完成和拒绝状态下的处理函数。then方法会返回另一个promise对象，以便于形成promise管道，这种返回promise对象的方式能够支持开发人员把异步操作串联起来，如then(resolvedHandler, rejectedHandler); 。resolvedHandler 回调函数在promise对象进入完成状态时会触发，并传递结果；rejectedHandler函数会在拒绝状态下调用。&lt;/p&gt;&lt;p&gt;有了promise模式，我们可以重新实现上面的Twitter示例。为了更好的理解实现方法，我们尝试着从零开始构建一个promise模式的框架。首先需要一些对象来存储promise。&lt;/p&gt;var Promise = function () {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* initialize promise */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;p&gt;接下来，定义then方法，接受两个参数用于处理完成和拒绝状态。&lt;/p&gt;Promise.prototype.then = function (onResolved, onRejected) {&lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; /* invoke handlers based upon state transition */&lt;br/&gt; };&lt;p&gt;同时还需要两个方法来执行理从未完成到已完成和从未完成到拒绝的状态转变。&lt;/p&gt;Promise.prototype.resolve = function (value) {&lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; /* move from unfulfilled to resolved */&lt;br/&gt; };&lt;br/&gt; &lt;br/&gt; Promise.prototype.reject = function (error) {&lt;br/&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; /* move from unfulfilled to rejected */&lt;br/&gt; };&lt;p&gt;现在搭建了一个promise的架子，我们可以继续上面的示例，假设只获取IE10的内容。创建一个方法来发送Ajax请求并将其封装在promise中。这个promise对象分别在xhr.onload和xhr.onerror中指定了完成和拒绝状态的转变过程，请注意searchTwitter函数返回的正是promise对象。然后，在loadTweets中，使用then方法设置完成和拒绝状态对应的回调函数。&lt;/p&gt;function searchTwitter(term) {&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var url, xhr, results, promise;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; url = 'http://search.twitter.com/search.json?rpp=100&amp;amp;q=' + term;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; promise = new Promise();&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xhr = new XMLHttpRequest();&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xhr.open('GET', url, true);&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xhr.onload = function (e) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (this.status === 200) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; results = JSON.parse(this.responseText);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; promise.resolve(results);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xhr.onerror = function (e) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; promise.reject(e);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xhr.send();&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return promise;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;function loadTweets() {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var container = document.getElementById('container');&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; searchTwitter('#IE10').then(function (data) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data.results.forEach(function (tweet) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var el = document.createElement('li');&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; el.innerText = tweet.text;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; container.appendChild(el);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }, handleError);&lt;br/&gt;}&lt;p&gt;到目前为止，我们可以把promise模式应用于单个Ajax请求，似乎还体现不出promise的优势来。下面来看看多个Ajax请求的并发协作。此时，我们需要另一个方法when来存储准备调用的promise对象。一旦某个promise从未完成状态转化为完成或者拒绝状态，then方法里对应的处理函数就会被调用。when方法在需要等待所有操作都完成的时候至关重要。&lt;/p&gt;Promise.when = function () {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* handle promises arguments and queue each */&lt;br/&gt;};&lt;p&gt;以刚才获取IE10和IE9两块内容的场景为例，我们可以这样来写代码：&lt;/p&gt;var container, promise1, promise2;&lt;br/&gt;container = document.getElementById('container');&lt;br/&gt;promise1 = searchTwitter('#IE10');&lt;br/&gt;promise2 = searchTwitter('#IE9');&lt;br/&gt;Promise.when(promise1, promise2).then(function (data1, data2) {&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Reshuffle due to date */&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var totalResults = concatResults(data1.results, data2.results);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; totalResults.forEach(function (tweet) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var el = document.createElement('li');&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; el.innerText = tweet.text;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; container.appendChild(el);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br/&gt;}, handleError);&lt;p&gt;分析上面的代码可知，when函数会等待两个promise对象的状态发生变化再做具体的处理。在实际的Promise库中，when函数有很多变种，比如 when.some()、when.all()、when.any()等，读者从函数名字中大概能猜出几分意思来，详细的说明可以参考CommonJS的一个promise实现&lt;a href="https://github.com/briancavalier/when.js"&gt;when.js&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;除了CommonJS，其他主流的Javascript框架如jQuery、Dojo等都存在自己的promise实现。开发人员应该好好利用这种模式来降低异步编程的复杂性。我们选取Dojo为例，看一看它的实现有什么异同。&lt;/p&gt;&lt;p&gt;Dojo框架里实现promise模式的对象是Deferred，该对象也有then函数用于处理完成和拒绝状态并支持串联，同时还有resolve和reject，功能如之前所述。下面的代码完成了Twitter的场景：&lt;/p&gt;function searchTwitter(term) {&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var url, xhr, results, def;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; url = 'http://search.twitter.com/search.json?rpp=100&amp;amp;q=' + term;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def = new dojo.Deferred();&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xhr = new XMLHttpRequest();&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xhr.open('GET', url, true);&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xhr.onload = function (e) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (this.status === 200) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; results = JSON.parse(this.responseText);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def.resolve(results);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xhr.onerror = function (e) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def.reject(e);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xhr.send();&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return def;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;dojo.ready(function () {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var container = dojo.byId('container');&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; searchTwitter('#IE10').then(function (data) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data.results.forEach(function (tweet) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dojo.create('li', {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; innerHTML: tweet.text&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }, container);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br/&gt;});&lt;p&gt;不仅如此，类似dojo.xhrGet方法返回的即是dojo.Deferred对象，所以无须自己包装promise模式。&lt;/p&gt;var deferred = dojo.xhrGet({&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; url: "search.json",&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; handleAs: "json"&lt;br/&gt;});&lt;br/&gt;&lt;br/&gt;deferred.then(function (data) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* handle results */&lt;br/&gt;}, function (error) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* handle error */&lt;br/&gt;});&lt;p&gt;除此之外，Dojo还引入了dojo.DeferredList,支持开发人员同时处理多个dojo.Deferred对象，这其实就是上面所提到的when方法的另一种表现形式。&lt;/p&gt;dojo.require("dojo.DeferredList");&lt;br/&gt;dojo.ready(function () {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var container, def1, def2, defs;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; container = dojo.byId('container');&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def1 = searchTwitter('#IE10');&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def2 = searchTwitter('#IE9');&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; defs = new dojo.DeferredList([def1, def2]);&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; defs.then(function (data) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Handle exceptions&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!results[0][0] || !results[1][0]) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dojo.create("li", {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; innerHTML: 'an error occurred'&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }, container);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var totalResults = concatResults(data[0][1].results, data[1][1].results);&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; totalResults.forEach(function (tweet) {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dojo.create("li", {&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; innerHTML: tweet.text&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }, container);&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br/&gt;});&lt;p&gt;上面的代码比较清楚，不再详述。&lt;/p&gt;&lt;p&gt;说到这里，读者可能已经对promise模式有了一个比较完整的了解，异步编程会变得越来越重要，在这种情况下，我们需要找到办法来降低复杂度，promise模式就是一个很好的例子，它的风格比较人性化，而且主流的JS框架提供了自己的实现。所以在编程实践中，开发人员应该尝试这种便捷的编程技巧。需要注意的是，promise模式的使用需要恰当地设置promise对象，在对应的事件中调用状态转换函数，并且在最后返回promise对象。&lt;/p&gt;&lt;p&gt;技术社区对异步编程的关注也在升温，国内社区也发出了自己的声音。资深技术专家老赵就发布了一套开源的异步开发辅助库Jscex，它的设计很巧妙，抛弃了回调函数的编程方式，采用一种&amp;ldquo;线性编码、异步执行&amp;rdquo;的思想，感兴趣的读者可以查看&lt;a href="http://www.infoq.com/cn/articles/jscex-javascript-asynchronous-programming"&gt;这里&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;不仅仅是前端的JS库，如今火热的NodeJS平台也出现了许多第三方的promise模块，具体的清单可以访问&lt;a href="https://github.com/joyent/node/wiki/modules#wiki-async-flow"&gt;这里&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;注：本文中的所有代码示例均来自于IE官方博客。&lt;/p&gt;&lt;p class="miniBio"&gt;&lt;i&gt;&lt;strong&gt;&lt;a class="editorlink f_taxonomyEditor" href="http://www.infoq.com/cn/author/%E5%B4%94%E5%BA%B7"&gt;崔康&lt;/a&gt; &lt;/strong&gt;是InfoQ中文站的翻译主编，从事企业级Web应用的相关工作，关注性能优化、Web技术、浏览器等领域。 &lt;/i&gt;&lt;/p&gt;&lt;p class="miniBio"&gt;&lt;i&gt;转自：&lt;a href="http://www.infoq.com/cn/news/2011/09/js-promise"&gt;http://www.infoq.com/cn/news/2011/09/js-promise&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/blsong/aggbug/2226193.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/blsong/archive/2011/10/27/2226193.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/blsong/archive/2011/10/26/2225442.html</id><title type="text">程序员技术练级攻略</title><summary type="text">伯乐人才网6月9日发表了《写给即将入行的程序员的一封信》，翻译自《An open letter to those who want to start programming》，我的朋友（他在本站的id是Mailper）告诉我，他希望在酷壳上看到一篇更具操作性的文章。因为他也是喜欢编程和技术的家伙，于是，我让他把他的一些学习Python和Web编程的一些点滴总结一下。于是他给我发来了一些他的心得和经历，我在把他的心得做了不多的增改，并根据我的经历增加了“进阶”一节。这是一篇由新手和我这个老家伙根据我们的经历完成的文章。 我的这个朋友把这篇文章取名叫Build Your Programming..</summary><published>2011-10-26T09:04:00Z</published><updated>2011-10-26T09:04:00Z</updated><author><name>风雨者2</name><uri>http://www.cnblogs.com/blsong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/blsong/archive/2011/10/26/2225442.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/blsong/archive/2011/10/26/2225442.html"/><content type="html">&lt;p&gt;　&lt;a href="http://www.jobbole.com/"&gt;伯乐人才网&lt;/a&gt;6月9日发表了《&lt;a href="http://news.cnblogs.com/n/104778/"&gt;写给即将入行的程序员的一封信&lt;/a&gt;》，翻译自《&lt;a href="http://blog.akash.im/an-open-letter-to-those-who-want-to-start" target="_blank"&gt;An open letter to those who want to start programming&lt;/a&gt;》，我的朋友（他在本站的id是&lt;a href="http://coolshell.cn/?author=3" target="_blank"&gt;Mailper&lt;/a&gt;）告诉我，他希望在酷壳上看到一篇更具操作性的文章。因为他也是喜欢编程和技术的家伙，于是，我让他把他的一些学习Python和Web编程的一些点滴总结一下。于是他给我发来了一些他的心得和经历，我在把他的心得做了不多的增改，并根据我的经历增加了&amp;ldquo;进阶&amp;rdquo;一节。&lt;strong&gt;这是一篇由新手和我这个老家伙根据我们的经历完成的文章&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;我的这个朋友把这篇文章取名叫Build Your Programming&amp;nbsp;Technical&amp;nbsp;Skills，我实在不知道用中文怎么翻译，但我在写的过程中，&lt;strong&gt;我觉得这很像一个打网游做任务升级的一个过程，所以取名叫&amp;ldquo;技术练级攻略&amp;rdquo;，题目有点大，呵呵，这个标题纯粹是为了好玩&lt;/strong&gt;。&lt;strong&gt;这里仅仅是在分享Mailper和我个人的学习经历。&lt;/strong&gt;（注：省去了我作为一个初学者曾经学习过的一些技术(今天明显过时了)，如：Delphi/Power builder，也省去了我学过的一些我觉得没意思的技术Lotus Notes/ActiveX/COM/ADO/ATL/.NET &amp;hellip;&amp;hellip;）&lt;/p&gt;&lt;p&gt;&lt;strong&gt;前言&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;你是否觉得自己从学校毕业的时候只做过小玩具一样的程序？走入职场后哪怕没有什么经验也可以把以下这些课外练习走一遍（朋友的抱怨：学校课程总是从理论出发，作业项目都看不出有什么实际作用，不如从工作中的需求出发）&lt;/p&gt;&lt;p&gt;建议：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;不要乱买书，不要乱追新技术新名词，基础的东西经过很长时间积累而且还会在未来至少10年通用。&lt;/li&gt;&lt;li&gt;回顾一下历史，看看历史上时间线上技术的发展，你才能明白明天会是什么样。&lt;/li&gt;&lt;li&gt;一定要动手，例子不管多么简单，建议至少自己手敲一遍看看是否理解了里头的细枝末节。&lt;/li&gt;&lt;li&gt;一定要学会思考，思考为什么要这样，而不是那样。还要举一反三地思考。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;注&lt;/strong&gt;：你也许会很奇怪为什么下面的东西很偏Unix/Linux，这是因为我觉得Windows下的编程可能会在未来很没有前途，原因如下：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;现在的用户界面几乎被两个东西主宰了，1）Web，2）移动设备iOS或Android。Windows的图形界面不吃香了。&lt;/li&gt;&lt;li&gt;越来越多的企业在用成本低性能高的Linux和各种开源技术来构架其系统，Windows的成本太高了。&lt;/li&gt;&lt;li&gt;微软的东西变得太快了，很不持久，他们完全是在玩弄程序员。详情参见《&lt;a title="Windows编程革命简史" href="http://coolshell.cn/articles/3008.html" target="_blank"&gt;Windows编程革命史&lt;/a&gt;》&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;所以，我个人认为以后的趋势是前端是Web+移动，后端是Linux+开源。开发这边基本上没Windows什么事。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;启蒙入门&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1、学习一门脚本语言，例如Python/Ruby&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;可以让你摆脱对底层语言的恐惧感，脚本语言可以让你很快开发出能用得上的小程序。实践项目:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;处理文本文件，或者csv(关键词 python csv， python open, python sys)读一个本地文件，逐行处理（例如word count，或者处理log）&lt;/li&gt;&lt;li&gt;遍历本地文件系统(sys, os, path)，例如写一个程序统计一个目录下所有文件大小并按各种条件排序并保存结果&lt;/li&gt;&lt;li&gt;跟数据库打交道(python sqlite)，写一个小脚本统计数据库里条目数量&lt;/li&gt;&lt;li&gt;学会用各种print之类简单粗暴的方式进行调试&lt;/li&gt;&lt;li&gt;学会用Google (phrase, domain, use reader to follow tech blogs)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;为什么要学脚本语言，因为他们实在是太方便了，很多时候我们需要写点小工具或是脚本来帮我们解决问题，你就会发现正规的编程语言太难用了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2、用熟一种程序员的编辑器(不是IDE)和一些基本工具&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Vim / Emacs /&amp;nbsp;Notepad++，学会如何配置代码补全，外观，外部命令等。&lt;/li&gt;&lt;li&gt;Source Insight (或 ctag)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;使用这些东西不是为了Cool，而是这些编辑器在查看、修改代码/配置文章/日志会更快更有效率。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3、熟悉Unix/Linux Shell和常见的命令行&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;如果你用windows，至少学会用虚拟机里的linux，vmware player是免费的，装个Ubuntu吧&lt;/li&gt;&lt;li&gt;一定要少用少用图形界面。&lt;/li&gt;&lt;li&gt;学会使用man来查看帮助&lt;/li&gt;&lt;li&gt;文件系统结构和基本操作 ls/chmod/chown/rm/find/ln/cat/mount/mkdir/tar/gzip &amp;hellip;&lt;/li&gt;&lt;li&gt;学会使用一些文本操作命令 sed/awk/grep/tail/less/more &amp;hellip;&lt;/li&gt;&lt;li&gt;学会使用一些管理命令 ps/top/lsof/netstat/kill/tcpdump/iptables/dd&amp;hellip;&lt;/li&gt;&lt;li&gt;了解/etc目录下的各种配置文章，学会查看/var/log下的系统日志，以及/proc下的系统运行信息&lt;/li&gt;&lt;li&gt;了解正则表达式，使用正则表达式来查找文件。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;对于程序员来说Unix/Linux比Windows简单多了。（参看我四年前CSDN的博文《&lt;a href="http://blog.csdn.net/haoel/article/details/1533720" target="_blank"&gt;其实Unix很简单&lt;/a&gt;》）学会使用Unix/Linux你会发现图形界面在某些时候实在是太难用了，相当地相当地降低工作效率。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4、学习Web基础（HTML/CSS/JS)+服务器端技术(LAMP)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;未来必然是Web的世界，学习Web基础的最佳网站是&lt;a href="http://www.w3school.com.cn/" target="_blank"&gt;W3School&lt;/a&gt;。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;学习HTML基本语法&lt;/li&gt;&lt;li&gt;学习CSS如何选中HTML元素并应用一些基本样式（关键词：box model）&lt;/li&gt;&lt;li&gt;学会用&amp;nbsp;Firefox + Firebug 或 Chrome 查看你觉得很炫的网页结构，并动态修改。&lt;/li&gt;&lt;li&gt;学习使用Javascript操纵HTML元件。理解DOM和动态网页（&lt;a href="http://oreilly.com/catalog/9780596527402" target="_blank"&gt;http://oreilly.com/catalog/9780596527402&lt;/a&gt;)网上有免费的章节，足够用了。或参看 &lt;a href="http://www.w3school.com.cn/htmldom/index.asp" target="_blank"&gt;DOM&lt;/a&gt;&amp;nbsp;。&lt;/li&gt;&lt;li&gt;学会用&amp;nbsp;Firefox + Firebug 或 Chrome 调试 Javascript 代码（设置断点，查看变量，性能，控制台等）&lt;/li&gt;&lt;li&gt;在一台机器上配置&lt;a href="http://coolshell.cn/articles/www.apache.org" target="_blank"&gt;Apache&lt;/a&gt;或&lt;a href="http://coolshell.cn/articles/nginx.net" target="_blank"&gt;Nginx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;学习&lt;a href="http://coolshell.cn/articles/www.php.net" target="_blank"&gt;PHP&lt;/a&gt;，让后台PHP和前台HTML进行数据交互，对服务器相应浏览器请求形成初步认识。实现一个表单提交和反显的功能。&lt;/li&gt;&lt;li&gt;把PHP连接本地或者远程数据库 MySQL（MySQL 和 SQL现学现用够了）&lt;/li&gt;&lt;li&gt;跟完一个名校的网络编程课程（例如：&lt;a href="http://www.stanford.edu/~ouster/cgi-bin/cs142-fall10/index.php" target="_blank"&gt;http://www.stanford.edu/~ouster/cgi-bin/cs142-fall10/index.php&lt;/a&gt;&amp;nbsp;)不要觉得需要多于一学期时间，大学生是全职一学期选3-5门课，你业余时间一定可以跟上&lt;/li&gt;&lt;li&gt;学习一个Javascript库（例如jQuery或ExtJS）+&amp;nbsp;Ajax(异步读入一个服务器端图片或者数据库内容）+ JSON数据格式。&lt;/li&gt;&lt;li&gt;HTTP: The Definite Guide 读完前4章你就明白你每天上网用浏览器的时候发生的事情了(proxy, gateway, browsers)&lt;/li&gt;&lt;li&gt;做个小网站（例如：一个小的留言板，支持用户登录，Cookie/Session，增、删、改、查，上传图片附件，分页显示）&lt;/li&gt;&lt;li&gt;买个域名，租个空间，做个自己的网站。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;进阶加深&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1、 C语言和操作系统调用&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;重新学C语言，理解指针和内存模型，用C语言实现一下各种经典的算法和数据结构。推荐《&lt;a href="http://product.china-pub.com/197050"&gt;计算机程序设计艺术&lt;/a&gt;》、《&lt;a href="http://product.china-pub.com/31701" target="_blank"&gt;算法导论&lt;/a&gt;》和《&lt;a href="http://product.china-pub.com/209243" target="_blank"&gt;编程珠玑&lt;/a&gt;》。&lt;/li&gt;&lt;li&gt;学习&lt;a title="（麻省理工免费课程）计算机科学和编程导论" href="http://coolshell.cn/articles/3723.html" target="_blank"&gt;（麻省理工免费课程）计算机科学和编程导论&lt;/a&gt;&lt;/li&gt;&lt;li&gt;学习&lt;a title="（麻省理工免费课程）C语言内存管理和C++面向对象编程" href="http://coolshell.cn/articles/2474.html" target="_blank"&gt;（麻省理工免费课程）C语言内存管理&lt;/a&gt;&lt;/li&gt;&lt;li&gt;学习Unix/Linux系统调用（&lt;a href="http://product.china-pub.com/30181" target="_blank"&gt;Unix高级环境编程&lt;/a&gt;），了解系统层面的东西。&lt;ul&gt;&lt;li&gt;用这些系统知识操作一下文件系统，用户（实现一个可以拷贝目录树的小程序）&lt;/li&gt;&lt;li&gt;用fork/wait/waitpid写一个多进程的程序，用pthread写一个多线程带同步或互斥的程序。多进程多进程购票的程序。&lt;/li&gt;&lt;li&gt;用signal/kill/raise/alarm/pause/sigprocmask实现一个多进程间的信号量通信的程序。&lt;/li&gt;&lt;li&gt;学会使用gcc和gdb来编程和调试程序（参看我的《&lt;a href="http://coolshell.cn/articles/blog.csdn.net/haoel/article/details/2879" target="_blank"&gt;用gdb调试程序&lt;/a&gt;》）&lt;/li&gt;&lt;li&gt;学会使用makefile来编译程序。（参看我的《&lt;a href="http://coolshell.cn/articles/blog.csdn.net/haoel/article/details/2886" target="_blank"&gt;跟我一起写makefile&lt;/a&gt;》）&lt;/li&gt;&lt;li&gt;IPC和Socket的东西可以放到高级中来实践。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;学习Windows SDK编程（&lt;a href="http://product.china-pub.com/52880" target="_blank"&gt;Windows 程序设计&amp;nbsp;&lt;/a&gt;，）&lt;ul&gt;&lt;li&gt;写一个窗口，了解WinMain/WinProcedure，以及Windows的消息机制。&lt;/li&gt;&lt;li&gt;写一些程序来操作Windows SDK中的资源文件或是各种图形控件，以及作图的编程。&lt;/li&gt;&lt;li&gt;学习如何使用MSDN查看相关的SDK函数，各种WM_消息以及一些例程。&lt;/li&gt;&lt;li&gt;这本书中有很多例程，在实践中请不要照抄，试着自己写一个自己的例程。&lt;/li&gt;&lt;li&gt;不用太多于精通这些东西，因为GUI正在被Web取代，主要是了解一下Windows 图形界面的编程。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;2、学习Java&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Java 的学习主要是看经典的Core Java 《&lt;a href="http://product.china-pub.com/208978" target="_blank"&gt;Java 核心技术编程&lt;/a&gt;》和《&lt;a href="http://product.china-pub.com/34838" target="_blank"&gt;Java编程思想&lt;/a&gt;》（有两卷，我仅链了第一卷，足够了，因为Java的图形界面了解就可以了）&lt;/li&gt;&lt;li&gt;学习JDK，学会查阅Java API Doc&amp;nbsp;&lt;a href="http://download.oracle.com/javase/6/docs/api/"&gt;http://download.oracle.com/javase/6/docs/api/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;了解一下Java这种虚拟机语言和C和Python语言在编译和执行上的差别。从C、Java、Python思考一下&amp;ldquo;跨平台&amp;rdquo;这种技术。&lt;/li&gt;&lt;li&gt;学会使用IDE Eclipse，使用 Eclipse 编译，调试和开发Java程序。&lt;/li&gt;&lt;li&gt;建一个Tomcat的网站，尝试一下JSP/Servlet/JDBC/MySQL的Web开发。把前面所说的那个PHP的小项目试着用JSP和Servlet实现一下。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;3、Web的安全与架构&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;学习HTML5，网上有很多很多教程，以前&lt;a href="http://coolshell.cn/" target="_blank"&gt;酷壳&lt;/a&gt;也介绍过很多，我在这里就不罗列了。&lt;/li&gt;&lt;li&gt;学习Web开发的安全问题（参考&lt;a title="新浪微博的XSS攻击" href="http://coolshell.cn/articles/4914.html" target="_blank"&gt;新浪微博被攻击的这个事&lt;/a&gt;，以及&lt;a href="http://guides.rubyonrails.org/security.html" target="_blank"&gt;Ruby的这篇文章&lt;/a&gt;）&lt;/li&gt;&lt;li&gt;学习HTTP Server的rewrite机制，Nginx的反向代理机制，&lt;a href="http://en.wikipedia.org/wiki/Fast_CGI" target="_blank"&gt;fast-cgi&lt;/a&gt;（如：&lt;a href="http://php-fpm.org/" target="_blank"&gt;PHP-FPM&lt;/a&gt;）&lt;/li&gt;&lt;li&gt;学习Web的静态页面缓存技术。&lt;/li&gt;&lt;li&gt;学习Web的异步工作流处理，数据Cache，数据分区，负载均衡，水平扩展的构架。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;实践任务：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;使用HTML5的 canvas 制作一些Web动画。&lt;/li&gt;&lt;li&gt;尝试在前面开发过的那个Web应用中进行SQL注入，JS注入，以及XSS攻击。&lt;/li&gt;&lt;li&gt;把前面开发过的那个Web应用改成构造在Nginx + PHP-FPM + 静态页面缓存的网站。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;4、一些开发工具&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;学会使用SVN或Git来管理程序版本。&lt;/li&gt;&lt;li&gt;学会使用JUnit来对Java进行单元测试。&lt;/li&gt;&lt;li&gt;学习C语言和Java语言的 coding standard 或 coding guideline。（我N年前写过一篇关C语言非常简单的文章&amp;mdash;&amp;mdash;《&lt;a href="http://blog.csdn.net/haoel/article/category/9200/2" target="_blank"&gt;编程修养&lt;/a&gt;》，这样的东西你可以上网查一下，一大堆）。&lt;/li&gt;&lt;li&gt;推荐阅读《&lt;a href="http://product.china-pub.com/28351" target="_blank"&gt;代码大全&lt;/a&gt;》《&lt;a href="http://product.china-pub.com/196374" target="_blank"&gt;重构&lt;/a&gt;》《&lt;a href="http://product.china-pub.com/196266" target="_blank"&gt;代码整洁之道&lt;/a&gt;》&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;高级深入&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1、C++ / Java 和面向对象&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我个人以为学好C++，Java也就是举手之劳。但是C++的学习曲线相当的陡。不过，我觉得C++是最需要学好的语言了。参看两篇趣文&amp;ldquo;&lt;a title="C++程序员自信心曲线图" href="http://coolshell.cn/articles/2287.html" target="_blank"&gt;C++学习信心图&lt;/a&gt;&amp;rdquo;和&amp;ldquo;&lt;a title="&amp;ldquo;21天教你学会C++&amp;rdquo;" href="http://coolshell.cn/articles/2250.html" target="_blank"&gt;21天学好C++&lt;/a&gt;&amp;rdquo;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;学习&lt;a title="（麻省理工免费课程）C语言内存管理和C++面向对象编程" href="http://coolshell.cn/articles/2474.html" target="_blank"&gt;（麻省理工免费课程）C++面向对象编程&lt;/a&gt;&lt;/li&gt;&lt;li&gt;读我的&amp;ldquo;&lt;a title="如何学好C++语言" href="http://coolshell.cn/articles/4119.html" target="_blank"&gt;如何学好C++&lt;/a&gt;&amp;rdquo;中所推荐的那些书至少两遍以上（如果你对C++的理解能够深入到像我所写的《&lt;a href="http://blog.csdn.net/haoel/article/details/1948051" target="_blank"&gt;C++虚函数表解析&lt;/a&gt;》或是《&lt;a href="http://blog.csdn.net/haoel/article/details/3081328" target="_blank"&gt;C++对象内存存局&lt;/a&gt;（&lt;a href="http://blog.csdn.net/haoel/article/details/3081328" target="_blank"&gt;上&lt;/a&gt;）（&lt;a href="http://blog.csdn.net/haoel/article/details/3081385" target="_blank"&gt;下&lt;/a&gt;）》，或是《&lt;a href="http://blog.csdn.net/haoel/article/details/1388498" target="_blank"&gt;C/C++返回内部静态成员的陷阱&lt;/a&gt;》那就非常不错了）&lt;/li&gt;&lt;li&gt;然后反思为什么C++要干成这样，Java则不是？你一定要学会对比C++和Java的不同。比如，Java中的初始化，垃圾回收，接口，异常，虚函数，等等。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;实践任务：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;用C++实现一个BigInt，支持128位的整形的加减乘除的操作。&lt;/li&gt;&lt;li&gt;用C++封装一个数据结构的容量，比如hash table。&lt;/li&gt;&lt;li&gt;用C++封装并实现一个智能指针（一定要使用模板）。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;《&lt;a href="http://product.china-pub.com/25961" target="_blank"&gt;设计模式&lt;/a&gt;》必需一读，两遍以上，思考一下，这23个模式的应用场景。主要是两点：1）钟爱组合而不是继承，2）钟爱接口而不是实现。（也推荐《&lt;a href="http://product.china-pub.com/27862"&gt;深入浅出设计模式&lt;/a&gt;》）&lt;/li&gt;&lt;li&gt;&lt;strong&gt;实践任务：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;使用工厂模式实现一个内存池。&lt;/li&gt;&lt;li&gt;使用策略模式制做一个类其可以把文本文件进行左对齐，右对齐和中对齐。&lt;/li&gt;&lt;li&gt;使用命令模式实现一个命令行计算器，并支持undo和redo。&lt;/li&gt;&lt;li&gt;使用修饰模式实现一个酒店的房间价格订价策略&amp;mdash;&amp;mdash;旺季，服务，VIP、旅行团、等影响价格的因素。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;学习STL的用法和其设计概念&amp;nbsp;-容器，算法，迭代器，函数子。如果可能，请读一下其源码。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;实践任务：&lt;/strong&gt;尝试使用面向对象、STL，设计模式、和WindowsSDK图形编程的各种技能&lt;ul&gt;&lt;li&gt;做一个贪吃蛇或是俄罗斯方块的游戏。支持不同的级别和难度。&lt;/li&gt;&lt;li&gt;做一个文件浏览器，可以浏览目录下的文件，并可以对不同的文件有不同的操作，文本文件可以打开编辑，执行文件则执行之，mp3或avi文件可以播放，图片文件可以展示图片。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;学习C++的一些类库的设计，如： MFC（看看候捷老师的《&lt;a href="http://product.china-pub.com/3565" target="_blank"&gt;深入浅出MFC&lt;/a&gt;》），Boost, ACE,&amp;nbsp;CPPUnit，STL （STL可能会太难了，但是如果你能了解其中的设计模式和设计那就太好了，如果你能深入到我写的《&lt;a href="http://blog.csdn.net/haoel/article/details/24058" target="_blank"&gt;STL string类的写时拷贝技术&lt;/a&gt;》那就非常不错了，ACE需要很强在的系统知识，参见后面的&amp;ldquo;加强对系统的了解&amp;rdquo;）&lt;/li&gt;&lt;li&gt;Java是真正的面向对象的语言，Java的设计模式多得不能再多，也是用来学习面向对象的设计模式的最佳语言了（参看&lt;a title="JDK里的设计模式" href="http://coolshell.cn/articles/3320.html" target="_blank"&gt;Java中的设计模式&lt;/a&gt;）。&lt;/li&gt;&lt;li&gt;推荐阅读《&lt;a href="http://product.china-pub.com/195040"&gt;Effective Java&lt;/a&gt;》 and 《&lt;a href="http://product.china-pub.com/197212"&gt;Java解惑&lt;/a&gt;》&lt;/li&gt;&lt;li&gt;学习Java的框架，Java的框架也是多，如Spring,&amp;nbsp;Hibernate，Struts 等等，主要是学习Java的设计，如IoC等。&lt;/li&gt;&lt;li&gt;Java的技术也是烂多，重点学习J2EE架构以及JMS， RMI,等消息传递和远程调用的技术。&lt;/li&gt;&lt;li&gt;学习使用Java做Web Service （&lt;a href="http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/2.0/tutorial/doc/" target="_blank"&gt;官方教程在这里&lt;/a&gt;）&lt;/li&gt;&lt;li&gt;&lt;strong&gt;实践任务： &lt;/strong&gt;尝试在Spring或Hibernate框架下构建一个有网络的Web Service的远程调用程序，并可以在两个Service中通过JMS传递消息。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;C++和Java都不是能在短时间内能学好的，C++玩是的深，Java玩的是广，我建议两者选一个。我个人的学习经历是：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;深究C++（我深究C/C++了十来年了）&lt;/li&gt;&lt;li&gt;学习Java的各种设计模式。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;2、加强系统了解&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;重要阅读下面的几本书：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;《&lt;a href="http://product.china-pub.com/197413" target="_blank"&gt;Unix编程艺术&lt;/a&gt;》了解Unix系统领域中的设计和开发哲学、思想文化体系、原则与经验。你一定会有一种醍醐灌顶的感觉。&lt;/li&gt;&lt;li&gt;《&lt;a href="http://product.china-pub.com/196770" target="_blank"&gt;Unix网络编程卷1，套接字&lt;/a&gt;》这是一本看完你就明白网络编程的书。重要注意TCP、UDP，以及多路复用的系统调用select/poll/epoll的差别。&lt;/li&gt;&lt;li&gt;《&lt;a href="http://product.china-pub.com/35" target="_blank"&gt;TCP/IP详解卷1:协议&lt;/a&gt;》- 这是一本看完后你就可以当网络黑客的书。了解以太网的的运作原理，了解TCP/IP的协议，运作原理以及如何TCP的调优。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;实践任务：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;理解什么是阻塞（同步IO），非阻塞（异步IO），多路复用（select, poll, epoll）的IO技术。&lt;/li&gt;&lt;li&gt;写一个网络聊天程序，有聊天服务器和多个聊天客户端（服务端用UDP对部分或所有的的聊天客户端进Multicast或Broadcast）。&lt;/li&gt;&lt;li&gt;写一个简易的HTTP服务器。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;《&lt;a href="http://product.china-pub.com/196859" target="_blank"&gt;Unix网络编程卷2，进程间通信&lt;/a&gt;》信号量，管道，共享内存，消息等各种IPC&amp;hellip;&amp;hellip;这些技术好像有点老掉牙了，不过还是值得了解。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;实践任务：&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;主要实践各种IPC进程序通信的方法。&lt;/li&gt;&lt;li&gt;尝试写一个管道程序，父子进程通过管道交换数据。&lt;/li&gt;&lt;li&gt;尝试写一个共享内存的程序，两个进程通过共享内存交换一个C的结构体数组。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;学习《&lt;a href="http://product.china-pub.com/209058" target="_blank"&gt;Windows核心编程&lt;/a&gt;》一书。把CreateProcess，Windows线程、线程调度、线程同步（Event,&amp;nbsp;信号量，互斥量）、异步I/O，内存管理，DLL，这几大块搞精通。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;实践任务：&lt;/strong&gt;使用CreateProcess启动一个记事本或IE，并监控该程序的运行。把前面写过的那个简易的HTTP服务用线程池实现一下。写一个DLL的钩子程序监控指定窗口的关闭事件，或是记录某个窗口的按键。&lt;/li&gt;&lt;li&gt;有了多线程、多进程通信，TCP/IP，套接字，C++和设计模式的基本，你可以研究一下ACE了。使用ACE重写上述的聊天程序和HTTP服务器（带线程池）&lt;/li&gt;&lt;li&gt;&lt;strong&gt;实践任务：&lt;/strong&gt;通过以上的所有知识，尝试&lt;ul&gt;&lt;li&gt;写一个服务端给客户端传大文件，要求把100M的带宽用到80%以上。（注意，磁盘I/O和网络I/O可能会很有问题，想一想怎么解决，另外，请注意网络传输最大单元MTU）&lt;/li&gt;&lt;li&gt;了解BT下载的工作原理，用多进程的方式模拟BT下载的原理。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;3、系统架构&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;负载均衡。HASH式的，纯动态式的。（可以到Google学术里搜一些&lt;a href="http://scholar.google.com.hk/scholar?q=%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1&amp;amp;hl=zh-CN&amp;amp;as_sdt=0&amp;amp;as_vis=1&amp;amp;oi=scholart" target="_blank"&gt;关于负载均衡的文章&lt;/a&gt;读读）&lt;/li&gt;&lt;li&gt;多层分布式系统&amp;ndash;客户端服务结点层、计算结点层、数据cache层，数据层。J2EE是经典的多层结构。&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Content_delivery_network" target="_blank"&gt;CDN系统&lt;/a&gt; &amp;ndash; 就近访问，内容边缘化。&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Peer-to-peer" target="_blank"&gt;P2P式系统&lt;/a&gt;，研究一下BT和电驴的算法。比如：&lt;a href="http://en.wikipedia.org/wiki/Distributed_hash_table" target="_blank"&gt;DHT算法&lt;/a&gt;。&lt;/li&gt;&lt;li&gt;服务器备份，双机备份系统（Live-Standby和Live-Live系统），两台机器如何通过心跳监测对方？集群主结点备份。&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Virtualization" target="_blank"&gt;虚拟化技术&lt;/a&gt;，使用这个技术，可以把操作系统当应用程序一下切换或重新配置和部署。&lt;/li&gt;&lt;li&gt;学习&lt;a href="http://thrift.apache.org/" target="_blank"&gt;Thrift&lt;/a&gt;，二进制的高性能的通讯中间件，支持数据(对象)序列化和多种类型的RPC服务。&lt;/li&gt;&lt;li&gt;学习&lt;a href="http://hadoop.apache.org/" target="_blank"&gt;Hadoop&lt;/a&gt;。Hadoop框架中最核心的设计就是：MapReduce和HDFS。MapReduce的思想是由Google的一篇论文所提及而被广为流传的，简单的一句话解释MapReduce就是&amp;ldquo;任务的分解与结果的汇总&amp;rdquo;。HDFS是Hadoop分布式文件系统（Hadoop Distributed File System）的缩写，为分布式计算存储提供了底层支持。&lt;/li&gt;&lt;li&gt;了解&lt;a href="http://en.wikipedia.org/wiki/NoSQL" target="_blank"&gt;NoSQL数据库&lt;/a&gt;（有人说可能是一个&lt;a title="那些炒作过度的技术和概念" href="http://coolshell.cn/articles/3609.html" target="_blank"&gt;过渡炒作的技术&lt;/a&gt;），不过因为超大规模以及高并发的纯动态型网站日渐成为主流，而SNS类网站在数据存取过程中有着实时性等刚性需求，这使得目前NoSQL数据库慢慢成了人们所关注的焦点，并大有成为取代关系型数据库而成为未来主流数据存储模式的趋势。当前NoSQL数据库很多，大部分都是开源的，其中比较知名的有：MemcacheDB、Redis、Tokyo Cabinet(升级版为Kyoto Cabinet)、Flare、MongoDB、CouchDB、Cassandra、Voldemort等。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;写了那么多，回顾一下，觉得自己相当的有成就感。希望大家不要吓着，我自己这十来年也在不断地学习，今天我也在学习中，人生本来就是一个不断学习和练级的过程。&lt;strong&gt;不过，一定有漏的，也有不对的，还希望大家补充和更正&lt;/strong&gt;。（&lt;strong&gt;我会根据大家的反馈随时更新此文&lt;/strong&gt;）欢迎大家通过我的微博（&lt;a href="http://weibo.com/haoel" target="_blank"&gt;@左耳朵耗子&lt;/a&gt;）和twitter（@&lt;a href="http://twitter.com/haoel" target="_blank"&gt;haoel&lt;/a&gt;）和我交流。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;原文：&lt;a href="http://kb.cnblogs.com/page/108911/"&gt;http://kb.cnblogs.com/page/108911/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/blsong/aggbug/2225442.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/blsong/archive/2011/10/26/2225442.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
