下è²å®Œæ¯•åŽï¼Œæˆ‘ä»¬éœ€è¦æŠŠæ–‡äšgä¸çš„jxl.jaråŠ å…¥åˆîC½ 的开å‘classpathä¸ã€?br />下图是现在è¦ç”Ÿäñ”çš„excel截图åQ?br />http://blog.csdn.net/beming/gallery/image/3437.aspx
代ç 如下åQ?/p>
   File excel = new File("d:/aming.xls");
   if(!excel.exists()){
    excel.createNewFile();
   }  Â
   WritableWorkbook wwb = Workbook.createWorkbook(excel);
   WritableSheet ws = wwb.createSheet("testexcel",0);
   Label lable = null;
  Â
   //坹䏿–‡çš„æ”¯æŒéžå¸¸å¥?br />   lable = new Label(0,0,"我的ä¸å›½å¿?);
   ws.addCell(lable);
  Â
   //å¯ä»¥å®šä¹‰æ¨¡æ¿æ ¼å¼åŒ–ä½ çš„cell
   WritableFont wf = new WritableFont(WritableFont.ARIAL,10,WritableFont.NO_BOLD,false,UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
   WritableCellFormat wcf = new WritableCellFormat(wf);
   wcf.setBackground(Colour.WHITE);
   lable = new Label(0,1,"fdsl",wcf);
   ws.addCell(lable);
  Â
   wf = new WritableFont(WritableFont.TIMES,18,WritableFont.BOLD,true);
   wcf = new WritableCellFormat(wf);
   lable = new Label(0,2,"aming",wcf);
   ws.addCell(lable);
  Â
   //cellçš„ç±»åž‹åŒæ ·å¯ä»¥å®šä¹‰äؓ数嗾cÕdž‹
   Number nb = new Number(0,3,21.4321321);
   ws.addCell(nb);
  Â
   //æ”¯æŒæ ¼å¼åŒ–ä½ çš„æ•°å—串
   NumberFormat nf = new NumberFormat("#.###");
   wcf = new WritableCellFormat(nf);
   nb = new Number(0,4,21.43254354354354,wcf);
   ws.addCell(nb);
   //cell的类型å¯ä»¥äØ“boolean¾cÕdž‹
   Boolean bl = new Boolean(0,5,true);
   ws.addCell(bl);
   //cellçš„ç±»åž‹åŒæ ·å¯ä»¥äؓ日期åQŒæ—¶é—?br />   DateTime dt = new DateTime(0,6,new Date());
   ws.addCell(dt);
   //òq¶ä¸”å¯ä»¥å¾ˆå¥½æ ¼å¼åŒ–ä½ çš„æ—¥æœŸæ ¼å¼?br />   DateFormat df = new DateFormat("MM dd yyyy hh:mm:ss");
   wcf = new WritableCellFormat(df);
   dt = new DateTime(0,7,new Date(),wcf);
   ws.addCell(dt);
  Â
   //开始写文äšgäº?br />   wwb.write();
   wwb.close();
上é¢çš„ä¸‹è½½åœ°å€æ— 法打开.
下è²è¯·åˆ°:http://prdownloads.sourceforge.net/jexcelapi
      ½W¬ä¸€‹Æ¡æŽ¥è§?/span>BeanUtils是在å¦ä¹ Struts的过½E‹ä¸åQŒåœ¨Strutsä¸å®ƒè¢«å¤§é‡ç”¨äºŽå¤„ç?/span>FormBeanã€?/span>
BeanUtilsä¸»è¦æä¾›äº†å¯¹äº?/span>JavaBean˜q›è¡Œå„ç§æ“作åQ?/span>
      BeanUtils一共分4个包åQ?/span>
Ø        org.apache.commons.beanutils
Ø        org.apache.commons.beanutils.converters
Ø        org.apache.commons.beanutils.locale
Ø        org.apache.commons.beanutils.locale.converters
å…¶ä¸ä¸Šé¢ä¸¤ä¸ªæ˜?/span>BeanUtils的默认实玎ͼŒå®ƒæ²¡æœ‰é’ˆå¯ÒŽ(gu¨©)œ¬åœ°åŒ–çš„ä“Q何处ç†ï¼Œ˜q™ä¸ªå¯ä»¥æé«˜æ‰§è¡Œæ•ˆçŽ‡ã€‚ä½†æ˜¯è‹¥ä½ çš„½E‹åºå¯¹äºŽæœ¬åœ°åŒ–æœ‰è¦æ±‚çš„è¯åQŒé‚£˜q˜æ˜¯ä½¿ç”¨ä¸‹é¢2个包比较安全ã€?/span>
Â
2.  org.apache.commons.beanutils
      ˜q™ä¸ªåŒ…ä¸»è¦æä¾›ç”¨äºŽæ“ä½?/span>JavaBean的工å…ïL±»åQ?/span>Jakarta-Common-BeanUtils的主è¦åŠŸèƒ½éƒ½åœ¨è¿™ä¸ªåŒ…é‡Œå®žçŽ°ã€?span lang="EN-US">
   下é¢åˆ†åˆ«ä»‹ç»å‡ 个主è¦çš„å·¥å…ïL±»åQ?/span>
1ã€é¦–先,我先定义一ä¸?/span>JavaBeanä½œäØ“ä¹‹åŽä¾‹åçš„æ“作对象ã€?/span>
    public class Company
    {
     private String name;
     private HashMap address = new HashMap();
     private String[] otherInfo;
     private ArrayList product;
     private ArrayList employee;
     private HashMap telephone;
Â
     public Company(){}
Â
     public String getName()
     {
       return name;
     }
     public void setName(String name)
     {
       this.name = name;
     }
Â
     public String getAddress(String type)
     {
       return address.get(type).toString();
     }
     public void setAddress(String type, String address)
     {
       this.address.put(type,address);
     }
Â
     public String[] getOtherInfo()
     {
       return otherInfo;
     }
     public void setOtherInfo(String[] otherInfo)
     {
       this.otherInfo = otherInfo;
     }
Â
     public ArrayList getProduct()
     {
       return product;
     }
     public void setProduct(ArrayList product)
     {
       this.product = product;
     }
Â
     public ArrayList getEmployee()
     {
       return employee;
     }
     public void setEmployee(ArrayList employee)
     {
       this.employee = employee;
     }
Â
     public HashMap getTelephone()
     {
       return telephone;
     }
     public void setTelephone(HashMap telephone)
     {
       this.telephone = telephone;
     }
    }
2ã€?/span>BeanUtilså¯ä»¥ç›´æŽ¥getå’?/span>set一个属性的倹{€‚它?y¨u)?/span>property分æˆ3¿U类型:
      Simple——简å•类型,å¦?/span>Stirngã€?/span>Int…â€?/span>
      Indexed——烦引类型,�/span>数组�/span>arrayList…�/span>
      Maped——这个ä¸ç”¨è¯´ä¹Ÿè¯¥çŸ¥é“åQŒå°±æ˜¯æŒ‡Map啦,比如HashMap…â€?/span>
      讉K—®ä¸åŒ¾cÕdž‹çš„æ•°æ®å¯ä»¥ç›´æŽ¥è°ƒç”¨å‡½æ•?/span>getPropertyå’?/span>setPropertyã€‚å®ƒä»¬éƒ½åªæœ‰2ä¸ªå‚æ•ŽÍ¼Œ½W¬ä¸€ä¸ªæ˜¯JavaBean对象åQŒç¬¬äºŒä¸ªæ˜¯è¦æ“作的属性åã€?/span>
Company c = new Company();
c.setName("Simple");
Â
对于Simple¾cÕdž‹åQŒå‚æ•îCºŒç›´æŽ¥æ˜¯å±žæ€§åå›_¯
//Simple
   System.out.println(BeanUtils.getProperty(c, "name"));
   对于Map¾cÕdž‹åQŒåˆ™éœ€è¦ä»¥â€œå±žæ€§ååQ?/span>keyå€û|¼‰â€çš„å½¢å¼
//Map
   System.out.println(BeanUtils.getProperty(c, "address (A2)"));
   HashMap am = new HashMap();
   am.put("1","234-222-1222211");
   am.put("2","021-086-1232323");
   BeanUtils.setProperty(c,"telephone",am);
   System.out.println(BeanUtils.getProperty(c, "telephone (2)"));
   对于IndexedåQŒåˆ™ä¸ºâ€œå±žæ€§å[索引å€?/span>]â€ï¼Œæ³¨æ„˜q™é‡Œå¯¹äºŽArrayList和数¾l„都å¯ä»¥ç”¨ä¸€æ ïLš„æ–¹å¼˜q›è¡Œæ“作ã€?/span>
//index
   System.out.println(BeanUtils.getProperty(c, "otherInfo[2]"));
   BeanUtils.setProperty(c, "product[1]", "NOTES SERVER");
   System.out.println(BeanUtils.getProperty(c, "product[1]"));
Â
      当然˜q?/span>3¿U类也å¯ä»¥ç»„åˆä‹É用啦åQ?/span>
   //nest
   System.out.println(BeanUtils.getProperty(c, "employee[1].name"));
Â
3ã€æ¤å¤–,˜q˜æœ‰ä¸€ä¸ªå¾ˆé‡è¦çš„æ–¹æ³?/span>copyPropertyåQŒå¯ä»¥ç›´æŽ¥è¿›è¡?/span>Bean之间çš?/span>cloneã€?/span>
      Company c2 = new Company();
       BeanUtils.copyProperties(c2, c);
      但是˜q™ç§copy都是‹¹…æ‹·è´ï¼Œå¤åˆ¶åŽçš„2ä¸?/span>Beançš„åŒä¸€ä¸ªå±žæ€§å¯èƒ½æ‹¥æœ‰åŒä¸€ä¸ªå¯¹è±¡çš„refåQŒè¿™ä¸ªåœ¨ä½¿ç”¨æ—¶è¦ž®å¿ƒåQŒç‰¹åˆ«æ˜¯å¯¹äºŽå±žæ€§äؓ自定义类的情å†üc€?/span>
4ã€æœ€åŽè¿˜æœ?/span>populateåQŒå®ƒç”¨äºŽž®†ä¸€ä¸?/span>map的值填充到一ä¸?/span>beanä¸ï¼Œå…¶å‡½æ•°åŽŸåž‹å¦‚ä¸‹ï¼š
public void populate(java.lang.Object bean,
               java.util.Map properties)
             throws java.lang.IllegalAccessException,
                    java.lang.reflect.InvocationTargetException
åœ?/span>strutsä¸è¿™ä¸ªå‡½æ•°è¢«ç”¨äºŽä»?/span>http requestä¸å–得傿•°æ·»åŠ åˆ°FormBeanåQŒç›®å‰å¥½åƒæˆ‘也没有看到这个函数还有什么其他的用途?åQä»¥åŽæƒ³åˆ°å†è¯´å§åQ?/span>P
Â
      它实çŽîC¸€ä¸ªåЍæ€çš„BeanåQŒå¯ä»¥ç›´æŽ¥å¾€é‡Œé¢åŠ å…¥å±žæ€§ï¼Œä½œäØ“ä¸€ä¸?/span>JavaBeanä¸€æ ·ä‹É用,也å¯ä»¥ç”¨ä¸Šé¢çš?/span>BeanUtilsæˆ?/span>get/setæ–ÒŽ(gu¨©)³•˜q›è¡Œæ“作åQŒè€Œä¸ç”¨äº‹å…ˆå®šä¹‰ä¸€ä¸ªæ ‡å‡†çš„JavaBean¾cÕd•¦åQšï¼‰
è®°å¾—åœ?/span>J2ee设计模å¼ä¸æœ‰ä¸€¿U?/span>Value Object的模å¼ï¼Œç”¨äºŽåœ?/span>MVCå„å±‚ä¹‹é—´ä¼ é€’æ•°æ®ï¼Œé¿å…ç›´æŽ¥ä¼ é€’å¤§ä¸šåŠ¡å¯¹è±¡å¼•è“v的性能问题åQŒäؓ了é¿å…在™å¹ç›®ä¸å‡ºçŽ°å¾ˆå¤?/span>Bean¾c»ï¼Œåœ¨ä¹¦ä¸æä¾›äº†ä¸€ä¸ªåЍæ€?/span>Value Object的实玎ͼˆé€šè¿‡æ‰©å±•MapåQ‰ã€‚è¿™é‡?/span>LazyDynaBean则å¯ä»¥ä½œä¸ÞZ¸€¿Uæ›´åŠ æˆç†Ÿã€ç¨³å®šçš„实现æ¥ä‹Éç”¨ã€‚å‘µå‘µï¼ŒåŽŸæ¥æ›¾æ‰“½Ž—自己写一个类似的value object¾cÈš„åQŒçŽ°åœ¨çœ‹æ¥å¯ä»¥ç›´æŽ¥ç”¨˜q™ä¸ªå•¦ï¼šP
      a€å½’æ£ä¼ ,LazyBean的确æä¾›äº†ä¸€ä¸ªå¾ˆä¸é”™çš?/span>DynaBean的实现。而且ž®±åƒå®ƒçš„åå—ä¸è¡¨˜q°çš„é‚£æ ·åQŒå®ƒçš„ç¡®æ˜¯äØ“æˆ‘è¿™æ ïLš„æ‡’äh考虑的很周到åQŒç”¨èµäh¥å‡ 乎ä¸éœ€è¦å†™ä»€ä¹ˆå¤šä½™çš„代ç ^_^åQŒä¸‹é¢å°±çœ‹çœ‹ä½¿ç”¨çš„例åå§åQ?/span>
       //˜q™é‡Œä½¿ç”¨LazyDynaMapåQŒå®ƒæ˜?/span>LazyBean的一个轻é‡çñ”实现
     LazyDynaMap dynaBean1 = new LazyDynaMap();
Â
     dynaBean1.set("foo", "bar");                 // simple
     dynaBean1.set("customer", "title", "Mr");       // mapped
     dynaBean1.set("address", 0, "address1");        // indexed
     System.out.println(dynaBean1.get("address",0));
Â
     Map myMap = dynaBean1.getMap();          // retrieve the Map
     System.out.println(myMap.toString());
      上é¢çš„例åå¯ä»¥çœ‹åˆŽÍ¼Œå®ƒå¯ä»¥åœ¨set时自动增åŠ?/span>beançš?/span>propertyåQˆæ—¢èµ‹å€¼çš„åŒæ—¶å¢žåŠ Beanä¸çš„propertyåQ‰ï¼ŒåŒæ—¶ä¹Ÿæ”¯æŒ?/span>3ä¸ç±»åž‹çš„propertyåQŒåƈä¸?/span>LazyDynaMap˜q˜å¯ä»¥å¯¼å‡ÞZØ“mapã€?/span>
      对于˜q™ä¸ª¾c»è¿˜æœ‰ä¸¤ä¸ªé‡è¦çš„Fieldè¦æ³¨æ„:
      returnnull——指定在getæ–ÒŽ(gu¨©)³•使用了一个没有定义过çš?/span>propertyæ—Óž¼ŒDynaBean的行为ã€?/span>
       //å–çš„å—æ®µçš„ä¿¡æ?/span>
     dynaBean1.setReturnNull(true);//è®¾äØ“ture。若Bean䏿²¡æœ‰æ¤å—段åQŒè¿”å›?/span>null
                               //默认ä¸?/span>false。若Bean䏿²¡æœ‰æ¤å—段åQŒè‡ªåŠ¨å¢žåŠ ä¸€ä¸ªï¼šåQ?/span>
     System.out.println(dynaBean1.get("aaa"));//æ¤æ—¶˜q”回null
      Restricted——指定是å¦å…许改å˜è¿™ä¸?/span>beançš?/span>propertyã€?/span>
//MutableDynaClass.setRestrictedè®¾äØ“trueåŽï¼Œå—段ä¸å¯å†å¢žåˆ 和修改.
     //默认ä¸?/span>falseåQŒå…è®¸å¢žåˆ å’Œä¿®æ”¹
     dynaBean1.setRestricted(true);
     dynaBean1.set("test","error");//˜q™é‡Œä¼šå‡ºé”™ï¼
      通过讄¡½®˜q™ä¸¤ä¸ªå±žæ€§ï¼Œå¯ä»¥é˜²æ¢æ„外修改DynaBeançš?/span>property。在设计架构æ—Óž¼Œä½ å¯ä»¥åœ¨åŽå°ä»Žæ•°æ®è¡¨æˆ?/span>xmlæ–‡äšg自动产生DynaBeanåQŒåœ¨ä¼ 到控制层和表示层之å‰è®¾¾|®ä¸Š˜q°å±žæ€§ä‹Éå…?/span>Bean¾l“æž„ä¸å…è®æ€¿®æ”¹ï¼Œå¦‚椞®×ƒ¸å¯èƒ½æ— æ„ä¸ä¿®æ”?/span>Bean包å«çš„属性……这æ äh—¢å¯ä»¥äº«ç”¨å®ƒçš„便利åQŒæœ‰å¯ä»¥é˜²æ¢ç”±æ¤å¼•入的错误å¯èƒ½ï¼Œè®¾è®¡è€…å®žåœ¨æ·±å¾—å·æ‡’çš„¾_ùN«“啊ï¼åQï¼åQï¼
Â
3.1.BeanUtilså’?/span>PropertyUtils
      ˜q™ä¸¤ä¸ªç±»å‡ ä¹Žæœ‰ä¸€æ‘æ€¸€æ ïLš„功能åQŒå”¯ä¸€çš„区别是åQ?/span>BeanUtils在对Bean赋值是会进行类型è{化。ä‹D例æ¥è¯´ä¹Ÿž®±æ˜¯åœ?/span>copyPropertyæ—¶åªè¦å±žæ€§å相åŒåQŒå°±½Ž—类型ä¸åŒï¼ŒBeanUtils也å¯ä»¥è¿›è¡?/span>copyåQ›è€?/span>PropertyBean则å¯èƒ½ä¼šæŠ¥é”™åQï¼
      针对上é¢çš„例å,新å¾ä¸€ä¸?/span>Company2的类åQŒå…¶ä¸ä»£ç 与Companyä¸€æ øP¼Œåªæ˜¯ž®?/span>otherinfoä»?/span>String[]æ”¹äØ“Stringã€?/span>
     Company c = init();
     Company2 c2 = new Company2();
    Â
     BeanUtils.copyProperties(c2,c);
//     PropertyUtils.copyProperties(c2,c); ˜q™å¥ä¼šæŠ¥é”™ï¼åQ?/span>
     System.out.println(c2.getOtherInfo());
   当然2ä¸?/span>Bean之间的åŒå属性的¾cÕdž‹å¿…须是å¯ä»¥è{化的åQŒå¦åˆ™ç”¨BeanUtilsä¸€æ ·ä¼šæŠ¥é”™ã€?/span>
      若实çŽîCº†org.apache.commons.beanutils.Converter接å£åˆ™å¯ä»¥è‡ªå®šä¹‰¾cÕdž‹ä¹‹é—´çš„è{化ã€?/span>
ç”׃ºŽä¸åš¾cÕdž‹è½¬åŒ–åQŒç”¨PropertyUtils在速度上会有很大æé«˜ï¼
æ¤å¤–åQŒä¸ä½œç±»åž‹è{化还有一个好处,如下é¢çš„代ç åQ?/span>
     //test data type convert
//     ArrayList a1 = BeanUtils.getProperty(c,"product"); //BeanUtils˜q”回的是String
     System.out.println("--" + BeanUtils.getProperty(c,"product"));     //å–出åŽç›´æŽ¥è¢«è½¬äØ“String
     ArrayList a = (ArrayList)PropertyUtils.getProperty(c,"product");//PropertyUtils˜q”回的是Object
     System.out.println("--" + a.get(1));
ç”?/span>BeanUtilsæ— æ³•˜q”回一个对象(除éžè‡ªå·±å†™ä¸€ä¸?/span>ConverteråQ‰ï¼Œå®ƒä¼šè‡ªåЍ˜q›è¡Œ¾cÕdž‹è½¬åŒ–åQŒç„¶åŽè¿”å›?/span>String。对于想˜q”回java¾cÀLˆ–自定义类的è¯åQŒè¿˜æ˜¯ä¸è¦è€å®ƒå¤§é©¾è½¬åŒ–了ã€?/span>
Â
3.2.Utils¾c?/font>
      所有的XXXUtils¾c»éƒ½æä¾›çš„æ˜¯é™æ€æ–¹æ³•,å¯ä»¥ç›´æŽ¥è°ƒç”¨åQŒå…¶ä¸»è¦å®žçŽ°éƒ½åœ¨ç›¸åº”çš?/span>XXXUtilsBeanä¸ï¼š
BeanUtils   —�span lang="EN-US">> BeanUtilsBean
      ConvertUtils —�span lang="EN-US">> ConvertUtilsBean
   PropertyUtils —�span lang="EN-US">> PropertyUtilsBean
Â
å…¶æ„æ€çœ‹¾cÕd也应该知é“的差ä¸å¤šäº†åQŒæˆ‘ž®×ƒ¸å†åºŸè¯å•¦åQå½“ç„¶ä½ ä¹Ÿå¯ä»¥ç›´æŽ¥è°ƒç”¨é‚£äº?/span>XXXUtilsBeanåQŒåŠŸèƒ½éƒ½ä¸€æ øP¼
AåQ‰ã€è®¾¾|®æœåС噍é…置选项å¡ï¼Œ
Window > Preferences > NitroX > Server Configuration > Edit Server Configuration > Configuration TabåQŒå¦‚图:
BåQ‰ã€è¿è¡ŒDEBUGåQŒåˆ™åœ¨TOMCAT5.0çš„\conf\Catalina\localhost\目录下äñ”生一个ROOT.xmlæ–‡äšgåQŒæ‹·è´ROOT.xmlæ–‡äšg内容åQˆæœ‰å…Œ™™šæ‹Ÿç›®å½•设¾|®ï¼‰åˆ°\conf\下的Server.xmlæ–‡äšgä¸ï¼Œæ ¼å¼å¦‚下åQ?o:p>
<Context debug="0" docBase="/d:/eclipse/workspace/MyProject/web/" path=""
reloadable="true" workDir="C:\Tomcat 5.0\work\nitrox_dbg\MyProject">
<Loader className="org.apache.catalina.loader.DevLoader" reloadable="true" debug="0"/>
    <Resource name="jdbc/OracleDS" auth="Container" type="javax.sql.DataSource"/>
    <ResourceParams name="jdbc/OracleDS">
    �o:p>
</Context>
注:特别是调试èµ\径的讄¡½®åQŒç³»¾lŸä¼šåœ?/span>
ROOT.xml�/span>
自动生æˆåQŒç›´æŽ¥æ‹·è´ç›¸å…›_†…容过åŽÕd³å¯ï¼Œ
�span lang="EN-US">workDir="C:\Tomcat 5.0\work\nitrox_dbg\MyProject"
import org.springframework.beans.factory.access.BeanFactoryReference;
import org.springframework.beans.factory.access.SingletonBeanFactoryLocator;
import org.springframework.beans.factory.access.BeanFactoryLocator;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.logging.Log;
public class AppContextManager {
 private AppContextManager() {
 }
 private static AppBeanFactory m_appBeanFactory = null;
 /**
  * æ ÒŽ(gu¨©)®BeanName获得对应的类工厂[ä¸é€šè¿‡PlugInæ–ÒŽ(gu¨©)³•实现] 更新日志åQ?lt;br>
  * 日期 作�内容<br>
  * =================================================================<br>
  * 2004-08-26 黄å¾å¾?lt;br>
  * ①创建WEB-INF/classes/下beanRefFactory.xml<br>
  * â‘¡beanRefFactory.xmlé…置相关Contextæ–‡äšg <bean id="beanFactory" class=...><br>
  * â‘¢web.xmlé…置路径为WEB-INF/classes/... <br>
  * â‘£struts-config.xmlæ–‡äšgåŽÀLމ[注释]相关PlugIn<br>
  * <plug-in className=" com.hsit.common.spring.InitAppContext "/>
  * =================================================================<br>
  *
  * @param beanName
  *         String Beané…置体系的IDå如<bean id="beanCompany" ...>
  * @return Object æ ÒŽ(gu¨©)®BeanName获得对应的类工厂
  */
 public static Object getBean(String beanName) {
   BeanFactoryLocator bfLocator = SingletonBeanFactoryLocator.getInstance();
   BeanFactoryReference bf = bfLocator.useBeanFactory("beanFactory");
   return bf.getFactory().getBean(beanName);
 }
 public static void setBeanFactory(AppBeanFactory appBeanFactory) {
   m_appBeanFactory = appBeanFactory;
 }
 public static AppBeanFactory getBeanFactory() {
   return m_appBeanFactory;
 }
}