2007年7月12日

环境的安装和设定以及hello world

这方面的文章网络上一搜一大堆。偶也不引用了。
偶的感觉是python的安装和组件安装乱七八糟。ruby的安装和插件安装感觉比较爽。其理念是学习linux的port和apt的包管理思路。

posted @ 2008-04-29 11:49 wanglin 阅读(260) | 评论 (0)编辑 收藏

python和ruby的学习【绪】

昨天准备离职了。

其实在这家公司里面,项目leader对我很不错,时间也是比较宽松的。给了我很多的机会学习。甚至曾经我有整整一个星期的时间去完整的学习ruby。对此我还是非常感激的。不过因为项目的原因以及各种管理上的不如意,我感觉自己始终不开心。

索性这次终于解放,于是我想先静下心来,思考一下人生未来的路。顺便学习一下我所喜爱的ruby和python。上次学习ruby已经是几个月以前的事情了,学完以后基本上没有得到什么使用的机会到现在基本上忘记了。这次一并将python也学了,并比较列出。

几乎所有的语言,都包含以下几个部分
1,数据类型              ————被处理的
    一般包括数字,字符串,可能还包括布尔类型;复杂数据类型;对oo的语言还要包括对象等。
2,对数据的处理     ————语法部分,
    a,操作符和表达式
    b,条件判断语句
    c,循环语句
    d,跳转语句
     f,异常处理
3,代码的组织     
    a,文件的组织
    b,函数
    c,对象
4,类库
    a,标准输出入库
    b,文件库


以上前三个部分,是一个语言基础的部分。但是对一个语言深入的了解,还必须结合这个语言的背景,哲学理念,才可以达到比较深刻的地步。是以我们对python和ruby的学习将从这个地方开始。

posted @ 2008-04-29 11:20 wanglin 阅读(586) | 评论 (1)编辑 收藏

技术的位置

 

我曾是个技术粉丝

但是多年的开发经验,使得我对技术的本质认识的越来越清楚。至少对企业软件开发人员来说,纯粹的技术coding是没有多少价值的。如同建筑行业一样,真正有价值的东西在设计阶段已经完成了。

和传统建筑行业开发不同,软件开发行业不光是技术设计,还包括业务的设计。业务和技术掺杂在一起,构成了软件开发的复杂性。

在业务上,在技术上,尤其是在技术和业务的鸿沟之间,存在了太多太多因素。使得我们本来对相对简单的软件开发不敢抱有那么大的乐观。更何况真正一个成功的项目还需要市场,客户等等各个方面。

作为一个软件开发人员,真的应该放弃软件自大的心态,客观的去看待软件开发技术在整个软件开发工程中的位置和地位。以一种推动企业发展,推动项目发展和成功的心态和目的去看待整个项目。就明白了软件开发的真正意义和任务。也就能更好的完成自己的工作,甚至可以改变项目的成败。

所以成败不由技术,成败由你我的视野和努力。

posted @ 2008-04-28 15:04 wanglin 阅读(213) | 评论 (0)编辑 收藏

工作流、soa以及esb

最近公司项目经理派我研究工作流并考虑在项目中使用。很有一些心得。工作流应用我将之分为狭义工作流和广义工作流。对狭义工作流而言,你可以将之理解为在工作流设计器里画画节点以及方向箭头,设置好就节点数据,动作就差不多了。(具体可以参见jbpm的websale这个demo)。

广义的工作流是对服务之间的整合。核心问题是业务节点和工作流节点之间的映射,以及业务数据和工作流数据之间的映射,和普通工作流一样还有流程判断等等服务。实现了这些,各个业务模块之间的数据就可以通过服务,以定好的方式(进行方向控制和格式转化)在各个节点之间流通,达到了服务整合的目的。


 

  IBM为ESB定义了四个必备的功能:“路由器”——根据信息内容,在不同应用和服务之间进行信息传输和路由;“转换器”——进行应用之间的通信协议转换;“翻译机”——进行应用之间的消息格式转换;“收发室”——处理来自不同渠道的业务事件(同步传输,异步传输,发布/订阅等方式)。

  其中“路由器”和“收发室”都是针对服务的重用而设计的,而“转换器”和“翻译机”则专门用来解决异构的通信问题。

  针对重用和异构这两个难题,倪晓兵认为ESB提供了两个核心的功能,服务的管理和数据的转换。


我们DEC项目的目标就是建立一个全能服务仓库(暂时我在DEC设计人员zy哪里得到的信息),而服务之间如何路由,如何转换,语义的协调都没有考虑,而后者却是成败的关键。

最关键的语义翻译这一点,就现在的技术上来说还不能做到(需要很高的机器智能才能达到使得不同的系统的业务词汇可以正确的映射,更何况是在所有的系统之间进行映射,同时应用在企业级的应用环境中)

也许真的有这样的幻想,但是真的能够做到这一步么?我深深的怀疑。就目前的技术手段,如果要达到数据映射的高度正确性,必须由人不同系统之间需要协调的数据进行语义确认方能进行有效的映射。

当考虑到还必须做到ESB系统对其接入的所有的服务数据的语义都这样做时。我怀疑真的需要做到协调所有的服务么?

也许ESB的应用范围就是在公司内部或者有限范围内的整合目标明确的业务节点之间业务的整合。
        

posted @ 2008-04-11 17:11 wanglin 阅读(675) | 评论 (1)编辑 收藏

ruby的优秀

ruby很火,ror很火。但凡一个东西火,我们要知道他火的原因。

因为他开发快,你看

rails project_name
#config db
rake db:create:all
rake db:mirage scoffled table_name [field_name:field_type,.....]
#编辑model
rake db:mirage
#编辑action和route
ruby script/server

然后一个应用程序就生成啦,这个过程大概就2、3分钟;而且他热部署,所写即所得,语法超级强大,简单几句话就可以表达很复杂的逻辑,真正让人把精力集中在业务逻辑上和页面逻辑上(他的mirage真是太cool了,完美的体现了定义一次schame,到处使用的原则)

坦率的讲,这些别的东西——包括java都可以做到~,为什么到现在java还是这么杀手呢(不是应用程序杀手,是程序员杀手,开发起来罗嗦到死。

既然ror出现了,所以我想jor也很快了,不过ruby使人愉快的是,它从不限制你,包括写的更难懂——如果你真的觉得别人写的你看不懂的话——幸运的是,它也没有限制你写的更简单。

那就用ruby去快乐的编程吧

posted @ 2008-03-05 19:08 wanglin 阅读(275) | 评论 (0)编辑 收藏

linux控制台分辨率

linux控制台分辨率调节
2007年12月07日 上午 11:16   | 640x480   800x600   1024x768 1280x1024
-----+-----------------------------------------------------
256 |    257        259         261           263
32k |    272        275         278           281
64k |    273        276         279           282
16M|    274        277         280           283


   VESA:
Colors   (depth) 640x480 800x600 1024x768 1280x1024 1600x1200
------------------+-----------+-----------+------------+-------------+-------------
   256 ( 8 bit)   |    769         771          773          775         796
32,768 (15 bit)|    784         787          790          793         797
65,536 (16 bit)|    785         788          791          794         798
16.8M (24 bit) |    786         789          792          795         799

 

查上面的表,编辑/boot/grub/menu.lst
kernel /boot/vmlinuz-2.6.15-23-386 root=/dev/hdb10 ro quiet splash vga=791
这行最后补上vga=792

posted @ 2008-02-21 09:44 wanglin 阅读(1610) | 评论 (3)编辑 收藏

随想

posted @ 2008-01-22 22:46 wanglin 阅读(210) | 评论 (0)编辑 收藏

说说韩寒【转】

说说韩寒
http://bbs.book.tom.com/i_87_22259.html

各项指数综合打分,活着的大陆人里面,韩寒应该可以排到我最欣赏(敬佩)的人的前三名——还有一位应该是晓波老师。还有一位?暂时空缺,欢迎推荐。王怡信教之后越来越看不懂了,连岳又太“大隐隐于市”了。
以前很傻,以为自己比韩寒年纪大就敢于瞧不起人,愚昧!后来才慢慢调整过来,敢于承认一个年轻人,一个谁都敢批几句的年轻人,其实比自己强太多了。
说几点我欣赏韩寒的地方:
语言才华:这个不用说了;
独立精神:主要是对作协的态度;
公民意识,有社会责任感:比如对厦门px的关注,比如帮助路人;
生活态度,有健康的心理:纯属个人感觉。聚光灯下,不变态很难,难得韩寒还有平常心。我挺认同韩寒自己说的“并不叛逆”;
职业精神:爱一行做一行,还都能做好,比如半月前夺得2007华赛CFR全国汽车场地锦标赛中国量产车1600cc组年度车手总冠军;
挣钱的能力也很强:现在越来越认同一个人赚钱的能力了,以前一直回避这一点。而且“君子爱财,取之有道”,这八个字说起来容易,真正做好很难;
还有,人也长得挺帅的,作为公众人物,这点还是很重要的,比如看了郭敬明的照片,吃饭就会很困难。
......
突然说起这些,是因为昨天看了南方周末对韩寒的采访。

南方周末:你怎么看待张悦然、小饭、郭敬明等大批“80后”作家加入作协这件事?
韩寒:我觉得也挺好的,总得有他们这样的人。要不然我又得和一帮人竞争。现在比较好,就我一个人,没有对手。我是一个冠军车手,我的内心比他们更强大,我觉得是这样。而且很多时候他们也只是可能有熟人介绍,面子上过不去罢了。以张和郭现在的能量,是否加入作协应该无所谓。
南方周末:如果他们邀请你,你会去参加作协吗?
韩寒:可以啊,我可以把这个当作代言活动。所有的商业代言我都是推掉的,这一次我可以代言你们作协,作协需要一个年轻化的代表,我代言你们给我200万,这算是我给作协的一个面子——第一次商业代言就给你,而且价格也不高。但你要我加入作协不可能。
我的立场一如既往,我绝不加入作协,打死我也不干。我认为,真正的艺术家应该永远独立,绝不能被组织左右。


韩寒:陆 天明骂作协门槛降低,把抄袭犯 都收进来了,说自己当年加入作协如何难,你进入作协身份就高人一等吗?我认为,国家就不应该有这些协会,想当初,加入作协对你的意识形态有所控制,文字更 加奴性,现在虽然好很多,但对创作没有任何帮助。一帮作家闲云野鹤的,自由创作多好,要什么协会。我在电视上一看到那些作家参加什么会的时候,和一些领导 弯腰点头握手,表示一定要把颂歌唱得更动听。作为一个作家,这种行为是不道德的,你仗着自己文字功底好,和喉舌机构的御用文人抢饭碗,怎么可以嘛。


南方周末:怎么看待那些和你一起出道的年轻人的改变?加入作协、买房、结婚、生子、赚钱。
韩寒:我不会因为岁数增长而改变。很多人婚姻不幸,其实是因为岁数的原因,到了一定的岁月就要结婚、生子、赚钱,所以才造成了很多不幸,我现在还住在老家乡下房子里。我内心很有安全感,房子、钱,我并不觉得这些很安定。一场地震一分钟就能摧毁一切,保险公司还都不赔。好多人没有安全感,所以要寄托在一些身外之物上。


南方周末:你也会老的,你能永远保持少年偶像这个形象吗?
韩寒:对 我来说,少年偶像是别人给的,不是我自己要保持,或者说不是我想保持下去我就能保持下去的。这是一种惯性,你自己一点办法都没有。生活里我是一个很不修边 幅的人,没有经纪人、助手。我也看过明星玩赛车,赛车前还在那里化妆,其实比赛的时候有很多汗,化妆干什么?他们才是真正想要做偶像,想要做明星。
几年前就有人请我拍戏、唱歌、做商演、做代言,都被我拒绝了。有钱是一个很好的事情,如果能够赚更多的钱更好,但问题是赚那个钱我心里会不舒服,我会权衡这个重要,还是钱重要。比如说你看到某个作家在那里推荐药、肾宝、洗液什么的,我觉得那个效果很怪。权衡下来,我觉得单纯的钱不能打动我。
我去年推掉的代言至少有500万到1000万,全部推掉了。去年靠写作和赛车,我一共赚了两百万,我认为自己归根结底还是一个写东西的人。
我发现,人生里30-50岁这一段是最尴尬的,不再是一个愤怒青年,也不是一个老顽童,有些不伦不类。我现在离尴尬的时间已经很近了,所以我要比他们更早地打好基础,以免像崔健一样,步入中年再交出DV短片那样的学生作业来。
南方周末:近两年,你一直在博客上发言,什么户口啊、交通啊都要参与一把。动机是什么?
韩寒:我在博客上写那么多免费文字,就一些社会问题发言,有人说我是在炒作知名度卖书。我写博客真的不是为了炒作自己,写那么多文字,甚至参与那么多讨论,还和人吵架,没有任何经济收益,甚至我觉得自己在影响书的销量。
作为一个公民,我认为我有权对一些社会问题发表自己的观点和意见。以前只对朋友说,现在对大家说。
南方周末:你愿意成为王小波那样的公共知识分子吗?
韩寒:想 起王小波是很难受的一件事情。王小波生前写了那么多文字,苦口婆心讲道理说常识。后来他死了,人们才假装发现了他作品的价值,觉得他写得不错,是个优秀的 作家。如果王小波没有死,到今天的话,他在人们口中应该算是那种一天到晚炒作的人吧。炒作和冒着一定的风险发表观点是有很大区别的,也是非常好分辨的。只 可惜,大家似乎都分辨不了。
在这个国家,做一个忧国忧民的人是最傻和最痛苦的,国家不乐意,国民不在意。我不要做那样的人,我只希望自己60岁时是个被年轻姑娘喜欢的深沉的老顽童。




posted @ 2007-11-16 08:51 wanglin 阅读(291) | 评论 (1)编辑 收藏

后悔大学没好好读书

    工作两年了。这两年的时间一直感觉很充实。最近却突然感觉有点无聊的感觉——以前两年一直计划学的东西都学差不多了。

    了解函数式编程的途径中,知道了lambda演算。简单看了看,发现居然是数学的一个分支——可叹我数学系理学学士,居然是第一次听说这个名词。google之下,不胜渺小了。于是后悔起大学的幼稚来。

    上学的时候,总是抱怨整天学习、面对的都是数学,枯燥无聊而且没用,除了大一大二好好学习,大三大四都是逃课比上课多,而且居然因此自鸣得意.....幼稚...

    最近有点小想法。突然觉得我这样的程序员没有技术含量,平心而论,现在我写的东西,一个高中生也可以写;而我大学学的那些东西,这些年一点没用上,这说明这份工作技术含量不是很大。那么做开发最大的技术含量在哪里?其实最大的技术含量(即..的解决方案)在写代码之前以前做完了,代码不过是把(..解决方案)具体化了而已,所谓的“..解决方案”,有业务的,也有技术上的,反正不是代码。无论精通struts还是hibernate,还是spring,会rpc、ext....都没有区别,之不过把已经有的组合起来,是谁都可以做。

    考虑考虑自己的未来之路......

posted @ 2007-10-17 13:31 wanglin 阅读(642) | 评论 (0)编辑 收藏

今天开始学ruby

    首先现了一个ruby的netbeans,地址....(这里没记清楚:),这个东西大小才30m,还不错。

    然后感觉字体不爽,就想换字体(参见那个啥的方法——把vjre\lib\font*.properties里面东西改改),然后也ok了。

    开始写代码的时候,觉得屏幕好像刷新率不够似的,于是又google了一下,把jdk换成6的(正搞个openjdk玩)——那个je上的啥说的。然后发现还是不快,换成jdk5的,快了好多。郁闷一个。。。。。

下面是ruby笔记第一天


To change this template, choose Tools | Templates
and open the template in the editor.

##一,了解ruby中类的构造
#定义一个类,并定义初始化方法,可以给new使用做构造函数
class Dog                         
  def initialize(name)
    @name 
= name
  
end
#  def initialize(name,color)
#    @name 
= name
#    @color 
= color
#  
end
#在类中追加定义一个方法,@是ruby中的变量的开头.默认的ly,ruby认识什么是属性什么是变量 
  def eat(food)
    @food 
= food
    puts  @name 
+ "eat "+@food
  
end
end

class Dog  
  def la
    puts @name 
+" la "+ @food
  
end
end
#你看,我们定义了一个啦的方法,把狗狗吃的全啦出来了:
-
@dd 
= Dog.new("Big Dog")
@dd.eat(
'food')
@dd.la
##他还支持重载么?看一下我们定义的构造函数(的时候没报错,现在调用的时候呢??)——他告诉我
#E:
\mydoc\NetBeansProjects\RTest\lib\main.rb:29:in `new': Wrong # of arguments(1 for 2) (ArgumentError)
##from E:\mydoc\NetBeansProjects\RTest\lib\main.rb:29

#@gg 
= Dog.new("name""color")
#@gg.eat(food)
#@gg.la

puts 
"Hello World"


——javablog居然不支持ruby的语法。就模拟vb的好了,反正都有个end


posted @ 2007-10-06 18:28 wanglin 阅读(282) | 评论 (0)编辑 收藏

新的开始。。。。。。

度假回来以后就来uns上班了。uns的框架是evan写的,看了两天:服务器端还满容易懂的,关键是ext.js不熟。

evan准备使用ext.js(jquery),以前我只使用过propetype.js,所以jquery.js也要看,还好,一看之下发现是更好用的js框架。

——马上台风了,接下来回家写。。。。。。

ext.js没什么感想。因为不熟,evan些的服务器端我有点感想。

1,首先可以肯定的是evan些的这个框架非常好,spring,hibernate,webwork等使用的非常恰当,层次结构也非常合理
2,evan和我说他们是TDD开发。我看了一下,其实不是的。
所谓的TDD是什么,是测试驱动,是需求驱动。现实的情况我们实践的是数据库驱动的开发,更严重的问题是这个结构一杆子到底。我不希望看到UserInfoDaoHiberante-UserInfoDao-UserInfoManagerImpl-UserInfoManager这样的结构。这是完全不对的,不论什么驱动的开发,都应该完全以业务为中心的结构UserInfoDao-UserDao-UserManagerImpl-UserManager
3,因此evan的所谓那个模板我看还是不用的好。

这里记下来,回头和evan讨论下。





posted @ 2007-09-19 14:10 wanglin 阅读(691) | 评论 (2)编辑 收藏

隔日观花,老书再读

      去度假之前我塞了本spring到旅行包里,寻思路上看看。可是路上实在是净不下心来,于是暗暗告诫自己:回来的路上一定要看一看。。。。。回来的路上基本上光睡觉了。惭愧啊~~~
      可是那本spring,的确是让人生厌,自从上周翻完以后,我就再也提不起再读一遍的兴趣来。我的想法就是理解其所以然,至于具体用法用时再查就是了。于是心安理得的看了一会恐怖片,上一会网——发现了一个讨论讨论ejb架构的帖子。于是想起来再读WITHOUT EJB的兴趣来。上次读的时候,大不以为然,大家把这本书都夸到天上去了,可是我什么都没看出来,感觉就是在谈概念,今天一读之下(其实还没读,就是看看目录,猜猜里面讲什么,猜测作者意图传达的想法)发现真不愧是人人传诵的好书。J2EE最近两三年的潮流,不外是此书罢了。
     一年来,从当初刚刚会struts、hibernate的小菜鸟,经历了追逐新的技术潮流,理解新的技术理念,从仅仅负责项目的某个模块到自己负责整个项目,从编写代码的程序员到真个项目的需求规划管理等。我不是当初的我了。
    所以我想:读书,何必强求自己呢!
    倘若有读书的爱好,他喜欢读哈利波特,何必非要强求他读红楼梦呢。顺其自然而已。

posted @ 2007-09-10 11:05 wanglin 阅读(115) | 评论 (0)编辑 收藏

面试趣事

刚刚离职,本来想好好休息一阵子。没想到前天以前一个同事对我说要我给他一份简历,他们公司缺人。我不好意思推托,就答应了。 面试那天,当然是我那个同事面试我的,可是令我惊奇的是另外一个面试官也是我的一个同事,不过是上上家公司的同事。。。。。好惊奇啊!!!! 于是大家攀谈了好大一会,顺便聊了点面试题目 1,xmlFactory和ApplicationContent的区别 我还真是不太了解,隐约知道后者好像是对前者的加强。。。。。哎~~~那个郁闷啊 第二个问题更郁闷呢~ 2,悲观锁和乐观锁的区别 我隐约记得以前做同事的时候他就说过这个,那时候我还搜索了一下。现在却怎么也想不起来。。。。。哎~~~~更郁闷啊~~~~ 还有第三个问题 3,写过JS表树么>.>..>...... 刚开始我还以为是树,就说EXT不是有现成的么?他说是表格里的树。于是我明白类似RCP中的TableTreeViewer。老实说没有。然后他告诉我他们准备写一个这个。。。。。 我的那个汗~~~~~ 面试还从来没这么窘迫过啊 ~~~~ 不过,也挺有趣的。。。。

posted @ 2007-08-25 11:41 wanglin 阅读(175) | 评论 (0)编辑 收藏

休息和学习

还没毕业就工作到现在,整整工作了两年半的时间,一直是忙忙碌碌。有时候我很奇怪为什么我所在的这两家公司为什么就这么忙,另外那几个程序员同学就这么悠闲,但是很幸运的是,爱思考和学习的习惯一直保持着,这两年一直感觉很充实。 记得刚毕业的那会,非常好玩:除了jsp啥也不会,啥是struts,啥是hibernate,啥是spring都不知道,也不敢问——因为进公司的时候CTO考我struts会不会。其实我根本就是因为上一家面试听说过这个词语马上回去google了些概念。就开始忽悠,还非常理直气壮的。。。。。后来我就进去了,工作了两个星期以后有一天发现CTO缠着一个高程问struts到底是啥玩意。。。。。。汗~~~~~~ 那时候好辛苦,因为谎撒下来了。所以即使不懂也要硬着头皮干,而且还要在工期内。。。。。。基本上每天晚上回去我都要翻书学习,或者跟别人讨论概念。很辛苦可是很愉快。 两年后的今天,虽然我感觉自己还是很菜,可是居然发现很多工作了4、5年的甚至还不如我。我很郁闷。。。。。。所谓的程序员,不好好学习写程序,整天在说:做这个好累。。。赚钱好少。。。加班好辛苦。。。转型做管理。。。。云云。 浮躁啊。。。。。 回忆起来,选择现在这家公司真的很轻率。当时对RIA技术真的很看好,就希望能到使用RIA的公司。尽管另外一个非常年轻的有活力的team极力邀请我还是选择了她。可是在这里真的很孤单。找不到志同道合的朋友,大家都是写写代码能RUN就行,没有规划,没有测试,没有重构,没有对代码的美的追求。。。。。。曾经我希望给大家做个培训,可是反问自己有资格么?我努力做了很多改进,可是经过了项目经理的手就被改的面目全非。。。。。。 解脱了。

posted @ 2007-08-19 18:16 wanglin 阅读(146) | 评论 (0)编辑 收藏

一个生成excel的工具类

很多人都直接编辑html,保存成xls就当成excel报表了。挺方便的,于是我写了这个简化工作的工具类——将一个html的表格模板解析成一个xls报表
模板如下
<?xml version="1.0" encoding="GB2312" ?>
<div style="width:100%;height:450;overflow-x:auto;overflow-y:auto">
    <table width="100%" border="1" cellspacing="2" cellpadding="0">
            <tr id="title" bgcolor="#fefcce">
                <td nowrap="true" >客户</td>
                <td nowrap="true" >产品</td>
                <td nowrap="true" >中文名称</td>
                <td nowrap="true" >英文名称</td>
                <td nowrap="true" >产品分类</td>
                <td nowrap="true" >包装</td>
                <td nowrap="true" >单位</td>
                <td nowrap="true" >数量</td>
                <td nowrap="true" >冻结数量</td>
                <td nowrap="true" >可用数量</td>
                <td nowrap="true"  id="CUBIC"></td>
                <td nowrap="true"  id="WEIGHT"></td>
            </tr>
            <tr id="record">
                <td nowrap="true" id="CUSTOMERID"></td>
                <td nowrap="true" id="SKU_ID"></td>
                <td nowrap="true" id="SKU_DESCR_C"></td>
                <td nowrap="true" id="SKU_DESCR_E"></td>
                <td nowrap="true" id="SKU_CLASS"></td>
                <td nowrap="true" id="PACKAGE_ID"></td>
                <td nowrap="true" id="UOM"></td>
                <td nowrap="true" id="QUANTITY"></td>
                <td nowrap="true" id="FREEZE_QUANTITY"></td>
                <td nowrap="true" id="AVAILABLE_QUANTITY"></td>
                <td nowrap="true" id="CUBIC"></td>
                <td nowrap="true" id="WEIGHT"></td>
            </tr>
    </table>
</div>
工具类如下

public class ExcelTemplateUtil {
    private static String CHARSET = "";
    private static final String ROOT = "ROOT";
    private static final String TITLE = "TITLE";
    private static final String RECORD = "RECORD";
    private static Map temp = new HashMap();

    public static String generateListToTemplate(Object titleObj, List recordList, File templateFile)
    {
        readTemplateFile(templateFile);
        ByteArrayOutputStream os = (ByteArrayOutputStream) builderExcelOutput(titleObj, recordList);
        return removeXMLHeader(os);
    }

    public static void readTemplateFile(File file)
    {
        try {
            Document templateDocument = new SAXReader().read(file);
            Element root = templateDocument.getRootElement();
            List trList = root.selectNodes("//div/table/tr");
            Element titleTemp = (Element) trList.get(0);
            Element recordTemp = (Element) trList.get(1);
            root.element("table").remove(titleTemp);
            root.element("table").remove(recordTemp);
            temp.put(TITLE, trList.get(0));
            temp.put(RECORD, trList.get(1));
            temp.put(ROOT, root);
        } catch (DocumentException e) {
            e.printStackTrace();
            throw new RuntimeException("Parse xml file error, Cause:", e);
        }
    }

    public static OutputStream builderExcelOutput(Object titleObj, List list)
    {

        ByteArrayOutputStream os = new ByteArrayOutputStream();
        Element root = (Element) ((Element) temp.get(ROOT)).clone();
        Document document = DocumentHelper.createDocument();
        document.setRootElement(root);
        Element tableEle = root.element("table");
        tableEle.add(parseTitleElement(titleObj));
        for (int i = 0; i < list.size(); i++) {
            tableEle.add(parseRecordElement(list.get(i)));
        }
        try {
            OutputFormat format = new OutputFormat("", true, "GB2312");
            XMLWriter writer = new XMLWriter(os, format);
            writer.write(document);
            writer.flush();
            writer.close();
            os.close();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            throw new RuntimeException("Parse outstream error, Cause:", e);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("Parse outstream error, Cause:", e);
        }
        return os;
    }

    public static Element parseTitleElement(Object titleObj)
    {
        Element titleEle = (Element) ((Element) temp.get(TITLE)).clone();
        if (null == titleObj) return titleEle;
        List tdList = titleEle.selectNodes("td");
        Element td;
        for (int i = 0; i < tdList.size(); i++) {
            td = (Element) tdList.get(i);
            fullField(td, titleObj);
        }
        return titleEle;
    }

    public static Element parseRecordElement(Object recordObj)
    {
        Element recordEle = (Element) ((Element) temp.get(RECORD)).clone();
        List tdList = recordEle.selectNodes("td");
        Element td;
        for (int i = 0; i < tdList.size(); i++) {
            td = (Element) tdList.get(i);
            fullField(td, recordObj);
        }
        return recordEle;
    }

    public static void fullField(Element tdEle, Object obj)
    {
        Attribute att = tdEle.attribute("id");
        if (null == att || null == att.getText() || 0 == att.getText().trim().length()) {
            return;
        }
        String fieldName = att.getText();
        if (null == fieldName || fieldName.trim().length() == 0) return;
        Method[] objMethod = obj.getClass().getDeclaredMethods();

        Object value;
        for (int i = 0; i < objMethod.length; i++) {
            if (("get" + (fieldName.trim())).equals(objMethod[i].getName())) {
                try {
                    value = objMethod[i].invoke(obj, new Object[]{});
                    value = (null == value ? "" : value);
                    tdEle.setText(value.toString());
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }
            }
        }
    }

    public static String removeXMLHeader(OutputStream os)
    {
        String xml = os.toString();
        int position = xml.indexOf(">");
//        xml = xml.substring(position+1,xml.length());
//        position = xml.indexOf(">");
        return xml.substring(position + 1, xml.length());
    }
}

调用
OutputStream os = response.getOutputStream();
            response.setHeader(
"Content-disposition""attachment; filename=" + excelFileName);
            response.setContentType(
"application/msexcel");
            File excelTemplateFile 
= new File(report_path + templateFileName);
            String out 
= ExcelTemplateUtil.generateListToTemplate(titleObj, resultList, excelTemplateFile);
            response.getOutputStream().write(out.getBytes());
            os.close();

posted @ 2007-08-08 21:47 wanglin 阅读(1344) | 评论 (3)编辑 收藏

swt 日期控件

     摘要:   阅读全文

posted @ 2007-07-12 12:14 wanglin 阅读(561) | 评论 (6)编辑 收藏

<2007年7月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

统计

常用链接

留言簿(1)

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜