<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 22, comments - 17, trackbacks - 0, articles - 15
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

         摘要:   閱讀全文

    posted @ 2008-05-14 09:24 碼農(nóng)cz 閱讀(244) | 評論 (0)編輯 收藏

    Map接口:
        |
        + -- WeakHashMap: 以弱鍵 實現(xiàn)的基于哈希表的 Map。在 WeakHashMap 中,當(dāng)某個鍵不再正常使用時,將自動移除其條
        |      目。更精確地說,對于一個給定的鍵,其映射的存在并不阻止垃圾回收器對該鍵的丟棄,這就使該鍵成為可終止的,被終
        |      止,然后被回收。丟棄某個鍵時,其條目從映射中有效地移除,因此,該類的行為與其他的 Map 實現(xiàn)有所不同。此實現(xiàn)
        |      不是同步的。
        |
        + -- TreeMap:該映射根據(jù)其鍵的自然順序進(jìn)行排序,或者根據(jù)創(chuàng)建映射時提供的 Comparator 進(jìn)行排序,具體取決于使用的
        |    構(gòu)造方法。此實現(xiàn)不是同步的。
        |
        + -- HashMap:基于哈希表的 Map 接口的實現(xiàn)。此實現(xiàn)提供所有可選的映射操作,并允許使用 null 值和 null 鍵。(除了      
        |        非同步和允許使用 null 之外,HashMap 類與 Hashtable 大致相同。)此類不保證映射的順序,特別是它不保證該順   
        |       序恒久不變。此實現(xiàn)不是同步的。
        |
        +-- SortedMap: 進(jìn)一步提供關(guān)于鍵的總體排序 的 Map。該映射是根據(jù)其鍵的自然順序進(jìn)行排序的,或者根據(jù)通常在創(chuàng)建有
             序映射時提供的 Comparator 進(jìn)行排序。對有序映射的 collection 視圖(由 entrySet、keySet 和 values 方法返回
             )進(jìn)行迭代時,此順序就會反映出來。要采用此排序方式,還需要提供一些其他操作(此接口是 SortedSet 的對應(yīng)映
             射)。

    Collection接口:
        |
        + -- Set接口:一個不包含重復(fù)元素的 collection。更正式地說,set 不包含滿足 e1.equals(e2) 的元素對 e1 和 e2,并
        |      |     且最多包含一個 null 元素。正如其名稱所暗示的,此接口模仿了數(shù)學(xué)上的 set 抽象。
        |      |
        |      + -- HashSet:此類實現(xiàn) Set 接口,由哈希表(實際上是一個 HashMap 實例)支持。它不保證 set 的迭代順序;
        |      |    特別是它不保證該順序恒久不變。此類允許使用 null 元素。此類為基本操作提供了穩(wěn)定性能,此實現(xiàn)不是同
        |      |    步的。
        |      |
        |      + -- LinkedHashSet:具有可預(yù)知迭代順序的 Set 接口的哈希表和鏈接列表實現(xiàn)。此實現(xiàn)與 HashSet 的不同之外在
        |      |    于,后者維護(hù)著一個運(yùn)行于所有條目的雙重鏈接列表。此鏈接列表定義了迭代順序,即按照將元素插入到 set
        |      |    中 的順序(插入順序)進(jìn)行迭代。注意,插入順序不 受在 set 中重新插入的 元素的影響。此實現(xiàn)不是同步
        |      |    的。
        |      |
        |      + -- TreeSet:基于 TreeMap 的 NavigableSet 實現(xiàn)。使用元素的自然順序?qū)υ剡M(jìn)行排序,或者根據(jù)創(chuàng)建 set 時
        |           提供的 Comparator 進(jìn)行排序,具體取決于使用的構(gòu)造方法。此實現(xiàn)為基本操作(add、remove 和 contains)
        |           提供受保證的 log(n) 時間開銷。此實現(xiàn)不是同步的。
        |
        + -- List接口:有序的 collection(也稱為序列)。此接口的用戶可以對列表中每個元素的插入位置進(jìn)行精確地控制。用戶
               |      可以根據(jù)元素的整數(shù)索引(在列表中的位置)訪問元素,并搜索列表中的元素。
               |
               + -- ArrayList:List 接口的大小可變數(shù)組的實現(xiàn)。實現(xiàn)了所有可選列表操作,并允許包括 null 在內(nèi)的所有元素。
               |    除了實現(xiàn) List 接口外,此類還提供一些方法來操作內(nèi)部用來存儲列表的數(shù)組的大小。(此類大致上等同于
               |    Vector 類,除了此類是不同步的。)每個 ArrayList 實例都有一個容量。該容量是指用來存儲列表元素的數(shù)
               |    組的大小。它總是至少等于列表的大小。隨著向 ArrayList 中不斷添加元素,其容量也自動增長。并未指定增
               |    長策略的細(xì)節(jié),因為這不只是添加元素會帶來分?jǐn)偣潭〞r間開銷那樣簡單。此實現(xiàn)不是同步的。
               |
               + -- LinkedList:List 接口的鏈接列表實現(xiàn)。實現(xiàn)所有可選的列表操作,并且允許所有元素(包括 null)。除了實
               |    現(xiàn) List 接口外,LinkedList 類還為在列表的開頭及結(jié)尾 get、remove 和 insert 元素提供了統(tǒng)一的命名方
               |    法。這些操作允許將鏈接列表用作堆棧、隊列或雙端隊列。提供先進(jìn)先出隊列操作(FIFO)。此實現(xiàn)不是同步的。
               |
               + -- Vector:Vector 類可以實現(xiàn)可增長的對象數(shù)組。與數(shù)組一樣,它包含可以使用整數(shù)索引進(jìn)行訪問的組件。但是
                    ,Vector 的大小可以根據(jù)需要增大或縮小,以適應(yīng)創(chuàng)建 Vector 后進(jìn)行添加或移除項的操作。此實現(xiàn)是同步的
                    。

    posted @ 2007-04-18 11:18 碼農(nóng)cz 閱讀(332) | 評論 (0)編輯 收藏

         摘要:   閱讀全文

    posted @ 2007-03-13 16:22 碼農(nóng)cz 閱讀(948) | 評論 (0)編輯 收藏

    自從用上了tomcat5.5,發(fā)現(xiàn)日志信息沒了,出錯了也找不著有用的信息,上apache找答案,果然

    Tomcat 5.5 uses Commons Logging throughout its internal code allowing the developer to choose a logging configuration that suits their needs, e.g java.util.logging or Log4J. Commons Logging provides Tomcat the ability to log hierarchially across various log levels without needing to rely on a particular logging implementation.

    An important consequence for Tomcat 5.5 is that the <Logger> element found in previous versions to create a localhost_log is no longer a valid nested element of <Context>. Instead, the default Tomcat configuration will use java.util.logging. If the developer wishes to collect detailed internal Tomcat logging (i.e what is happening within the Tomcat engine), then they should configure a logging system such as java.util.logging or log4j as detailed next

    習(xí)慣用log4j來配置log信息的輸出。

    新建log4j.properties,內(nèi)容為

    log4j.rootLogger=info,Console,R

    log4j.appender.Console=org.apache.log4j.ConsoleAppender
    log4j.appender.Console.layout=org.apache.log4j.PatternLayout
    #log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
    log4j.appender.Console.layout.ConversionPattern=%d{yy-MM-dd HH:mm:ss} %5p %c{1}:%L - %m%n

    log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.R.File=${catalina.home}/logs/tomcat.log
    log4j.appender.R.layout=org.apache.log4j.PatternLayout
    log4j.appender.R.layout.ConversionPattern=%d{yyyy.MM.dd HH:mm:ss} %5p %c{1}(%L):? %m%n

    log4j.logger.org.apache=info, R
    log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost]=DEBUG, R
    log4j.logger.org.apache.catalina.core=info, R
    log4j.logger.org.apache.catalina.session=info, R

    最后四行是tomcat的信息,如果改為debug日志文件將十分龐大。

    將這個文件放入${catalina.home}/common/classes下,再將log4j.jar和commons-logging.jar放入${catalina.home}/common/lib下,就可以在${catalina.home}/logs/下見到日志了。

    posted @ 2007-01-09 18:42 碼農(nóng)cz 閱讀(1405) | 評論 (0)編輯 收藏

    我在做項目時曾碰到這個問題,怎樣動態(tài)地添加一個文本框或文件域,這在網(wǎng)上很容易找到。但對怎樣處理提交的動態(tài)數(shù)據(jù)就很少有這方面的信息了。本人翻閱了一些資料,把自己的方法寫了下來,以饗讀者。

    1.提交表單

    ?

    <html>
    <body>
    ?<form?name
    = " form " ?method = " post " ?action = " add.jsp " >
    ???<input?name
    = " button " ?type = button?onClick = 'additem( " tb " )'?value = " 添加>> " >
    ?<table?id
    = " tb " >
    ?</table>
    <script?language
    = " javascript " >

    function?additem(id)
    {
    ??var?row
    , cell , str ;
    ??row? = ?eval( " document.all[ " +' " '+id+' " '+ " ] " ).insertRow() ;
    ??if(row?! = ?null?)
    ?????{
    ????????cell?
    = ?row.insertCell() ;
    ????????str = " <input?type= " +' " '+ " text " +' " '+ " ?name= " +' " '+ " StuName " +' " '+ " ><input?type= " +' " '+ " button " +' " '+ " ?value= " +' " '+ " 刪除 " +' " '+ " ?onclick='deleteitem(this, " +' " '+ " tb " +' " '+ " );'> "
    ???cell.innerHTML
    = str ;

    ??????}
    }
    function?deleteitem(obj
    , id)
    {
    ??var?rowNum
    , curRow ;
    ??curRow? = ?obj.parentNode.parentNode ;
    ??rowNum? = ?eval( " document.all. " +id).rows.length?-? 1 ;
    ??eval( " document.all[ " +' " '+id+' " '+ " ] " ).deleteRow(curRow.rowIndex) ;
    }
    </script>
    ???<p>
    ?????<input?type
    = " submit " ?name = " submit " ?value = " 提交 " >
    ???</p>
    ?</form>
    </body>
    </html>

    ?

    2.處理數(shù)據(jù)

    < body >
    < table? border ="1" >< tr >< td? colspan ="2" > eg </ td ></ tr >
    <%
    Enumeration?params
    = request.getParameterNames();
    while (params.hasMoreElements()){
    String ?name = ( String )params.nextElement();
    String []?values = request.getParameterValues(name);
    if (name.equals( " StuName " )){
    %>
    < tr >
    < td > <% = name %> </ td >
    < td >
    <%
    for ( int ?index = 0 ;index < values.length;index ++ ){
    %>
    <% = values[index] %>
    <% }} %>
    </ td >
    </ tr >
    </ table >
    </ body >

    posted @ 2007-01-04 14:44 碼農(nóng)cz 閱讀(1429) | 評論 (1)編輯 收藏

    ?ServletfilterJ2EE開發(fā)中常用的技術(shù),使用方便,配置簡單,老少皆宜。估計大多數(shù)朋友都是直接配置用,也沒有關(guān)心過具體的細(xì)節(jié),今天遇到一個問題,上網(wǎng)查了servlet的規(guī)范才發(fā)現(xiàn),servletfilter中的url-pattern還是有一些文章在里面的,總結(jié)了一些東西,放出來供大家參考,以免遇到問題又要浪費(fèi)時間。

    ??? 一,servlet容器對url的匹配過程:

    ?????

    當(dāng)一個請求發(fā)送到servlet容器的時候,容器先會將請求的url減去當(dāng)前應(yīng)用上下文的路徑作為servlet的映射url,比如我訪問的是http://localhost/test/aaa.html,我的應(yīng)用上下文是test,容器會將http://localhost/test去掉,剩下的/aaa.html部分拿來做servlet的映射匹配。這個映射匹配過程是有順序的,而且當(dāng)有一個servlet匹配成功以后,就不會去理會剩下的servlet了(filter不同,后文會提到)。其匹配規(guī)則和順序如下:

    1.???? 精確路徑匹配。例子:比如servletA url-pattern /testservletBurl-pattern/* ,這個時候,如果我訪問的urlhttp://localhost/test,這個時候容器就會先進(jìn)行精確路徑匹配,發(fā)現(xiàn)/test正好被servletA精確匹配,那么就去調(diào)用servletA,也不會去理會其他的servlet了。

    2.???? 最長路徑匹配。例子:servletAurl-pattern/test/*,而servletBurl-pattern/test/a/*,此時訪問http://localhost/test/a時,容器會選擇路徑最長的servlet來匹配,也就是這里的servletB

    3.???? 擴(kuò)展匹配,如果url最后一段包含擴(kuò)展,容器將會根據(jù)擴(kuò)展選擇合適的servlet。例子:servletAurl-pattern*.action

    4.???? 如果前面三條規(guī)則都沒有找到一個servlet,容器會根據(jù)url選擇對應(yīng)的請求資源。如果應(yīng)用定義了一個default servlet,則容器會將請求丟給default servlet(什么是default servlet?后面會講)

    ???? 根據(jù)這個規(guī)則表,就能很清楚的知道servlet的匹配過程,所以定義servlet的時候也要考慮url-pattern的寫法,以免出錯。

    ????? 對于filter,不會像servlet那樣只匹配一個servlet,因為filter的集合是一個鏈,所以只會有處理的順序不同,而不會出現(xiàn)只選擇一個filterFilter的處理順序和filter-mappingweb.xml中定義的順序相同。

    ??? 二,url-pattern詳解

    ???????? web.xml文件中,以下語法用于定義映射:

    l? ”/’開頭和以”/*”結(jié)尾的是用來做路徑映射的。

    l? 以前綴”*.”開頭的是用來做擴(kuò)展映射的。

    l? “/” 是用來定義default servlet映射的。

    l? 剩下的都是用來定義詳細(xì)映射的。比如: /aa/bb/cc.action

    所以,為什么定義”/*.action”這樣一個看起來很正常的匹配會錯?因為這個匹配即屬于路徑映射,也屬于擴(kuò)展映射,導(dǎo)致容器無法判斷。

    posted @ 2006-12-18 10:45 碼農(nóng)cz 閱讀(387) | 評論 (0)編輯 收藏

    使用servlet來下載文件,其原理非常簡單,只要得到文件的輸入流(或相應(yīng)字節(jié)),然后寫輸出流即可。現(xiàn)就其中的幾個細(xì)節(jié)問題展開:
    1. MIME類型的設(shè)置:
    Web 瀏覽器使用 MIME 類型來識別非 HTML 文檔,并決定如何顯示該文檔內(nèi)的數(shù)據(jù)。
    例如EXCEL文件的 MIME 類型是 "application/vnd.ms-excel "。要用servlet 來打開一個 EXCEL 文檔,需要將 response 對象中 header 的 contentType 設(shè)置成“application/vnd.ms-excel ”。
    response.setContentType(contentType);
    2. Content disposition
    HTTP response header中的content-disposition 允許 servlet 指定文檔表示的信息。使用這種header ,你就可以將文檔指定成單獨(dú)打開(而不是在瀏覽器中打開),還可以根據(jù)用戶的操作來顯示。
    如果用戶要保存文檔,你還可以為該文檔建議一個文件名。這個建議名稱會出現(xiàn)在 Save As 對話框的“文件名”欄中。如果沒有指定,則對話框中就會出現(xiàn) servlet 的名字。
    servlet 中,將 header 設(shè)置成下面這樣:
    response.setHeader("Content-disposition","attachment;filename="+ "Example.xls" );

    response.setHeader("Content-Disposition", "inline; filename="fliename)
    點擊打開會在ie中打開。

    需要說明的有三點:
    ? 中文文件名需要進(jìn)行iso8859-1轉(zhuǎn)碼方可正確顯示:
    fileName = new String(fileName.getBytes("GBK"),"iso8859-1");
    ? 傳遞的文件名,需要包含后綴名(如果此文件有后綴名),否則丟失文件的屬性,而不能自行選擇相關(guān)程序打開。
    ? 有下載前詢問(是打開文件還是保存到計算機(jī))和通過IE瀏覽器直接選擇相關(guān)應(yīng)用程序插件打開兩種方式,前者如上代碼所示,后者如下:
    response.setHeader("Content-disposition","filename="+ "Example.xls" );
    3. 在研究文件的上傳及下載過程中,有幾點體會
    程序的I/O操作往往是性能的瓶頸所在,java io定義了兩個基本的抽象類:InputStream和OutputStream,對于不同的數(shù)據(jù)類型比如磁盤,網(wǎng)絡(luò)又提供了不同的實現(xiàn),java.io也提供了一些緩沖流(BufferedStream),使硬盤可以很快的讀寫一大塊的數(shù)據(jù), 而Java基本的I/O類一次只能讀寫一個字節(jié),但緩沖流(BufferedStream)可以一次讀寫一批數(shù)據(jù),,緩沖流(Buffered Stream)大大提高了I/O的性能。所以:
    ?小塊小塊的讀寫數(shù)據(jù)會非常慢,因此,盡量大塊的讀寫數(shù)據(jù)
    ?使用BufferedInputStream和BufferedOutputStream來批處理數(shù)據(jù)以提高性能
    ?對象的序列化(serialization)非常影響I/O的性能,盡量少用

    posted @ 2006-12-18 10:41 碼農(nóng)cz 閱讀(199) | 評論 (0)編輯 收藏

    希望對剛開始學(xué)Hibernate的同學(xué)有所幫助

    一、saveorUpdate與unsaved-value
    到底是sava還是update
    Hibernate需要判斷被操作的對象究竟是一個已經(jīng)持久化過的持久對象還是臨時對象。
    1).主鍵Hibernate的id generator產(chǎn)生
    <id name="id" type="java.lang.Long">
    <column name="ID" precision="22" scale="0" />
    <generator class="increment" />
    </id>

    Project project = new Project();
    project.setId(XXX);
    this.projectDao.saveOrUpdate(project);

    1、默認(rèn)unsaved-value="null"
    主鍵是對象類型,hebernate判斷project的主鍵是否位null,來判斷project是否已被持久化
    是的話,對project對象發(fā)送save(project),
    若自己設(shè)置了主鍵則直接生成update的sql,發(fā)送update(project),即便數(shù)據(jù)庫里沒有那條記錄。
    主鍵是基本類型如int/long/double/
    自己設(shè)置unsaved-null="0"。
    所以這樣的話save和update操作肯定不會報錯。

    2、unsaved-value="none",
    由于不論主鍵屬性為任何值,都不可能為none,因此Hibernate總是對project對象發(fā)送update(project)

    3、unsaved-value="any"
    由于不論主鍵屬性為任何值,都肯定為any,因此Hibernate總是對project對象發(fā)送save(project),hibernate生成主鍵。

    Hibernate文檔中寫到
    saveOrUpdate()完成了如下工作:
    如果對象已經(jīng)在這個session中持久化過了,什么都不用做
    如果對象沒有標(biāo)識值,調(diào)用save()來保存它
    如果對象的標(biāo)識值與unsaved-value中的條件匹配,調(diào)用save()來保存它
    如果對象使用了版本(version或timestamp),那么除非設(shè)置unsaved-value="undefined",版本檢查會發(fā)生在標(biāo)識符檢查之前.
    如果這個session中有另外一個對象具有同樣的標(biāo)識符,拋出一個異常

    2).主鍵由自己來賦值
    <id name="id" type="java.lang.Long">
    <column name="ID" precision="22" scale="0" />
    <generator class="assigned" />
    </id>

    Project project = new Project();
    project.setId(XXX);
    this.projectDao.saveOrUpdate(project);

    1、默認(rèn)unsaved-value="null"
    這時有所不同,hibernate會根據(jù)主鍵產(chǎn)生一個select,來判斷此對象是否已被持久化
    已被持久化則update,未被持久化則save。
    2、unsaved-value="none",update對象,同上

    3、unsaved-value="any" ,save對象,
    如果自己自己設(shè)置的ID在數(shù)據(jù)庫中已存在,則報錯。

    二、save與update操作
    顯式的使用session.save()或者session.update()操作一個對象的時候,實際上是用不到unsaved-value的
    在同一Session,save沒什么可說得
    update對象時, 最直接的更改一個對象的方法就是load()它,保持Session打開,然后直接修改即可:
    Session s =…
    Project p = (Project) sess.load(Project.class, id) );
    p.setName(“test”);
    s.flush();
    不用調(diào)用s.update(p);hibernate能察覺到它的變化,會自動更新。當(dāng)然顯示調(diào)用的話也不會錯

    Hibernate文檔中寫到
    update()方法在下列情形下使用:
    程序在前面的session中裝載了對象
    對象被傳遞到UI(界面)層
    對該對象進(jìn)行了一些修改
    對象被傳遞回業(yè)務(wù)層
    應(yīng)用程序在第二個session中調(diào)用update()保存修改

    三、delete操作
    刪除時直接自己構(gòu)造一個project即可刪除
    this.projectDao.delete(preojct);

    以前刪除我是這樣寫的
    public void deleteProject(String id) {
    Project project = (Project) this.projectDao.get(Project.class, id);
    if (project != null) {
    this.projectDao.delete(project);
    }
    即這樣也是可以的
    Project project = new Project();
    project.setId(id);
    this.projectDao.delete(project).

    如果有級聯(lián)關(guān)系,需要把級聯(lián)的子類也構(gòu)造出來add進(jìn)去,同樣可以刪除。

    好了,羅嗦的夠多了。

    posted @ 2006-12-18 10:40 碼農(nóng)cz 閱讀(507) | 評論 (0)編輯 收藏

    1、遍歷workbook

    代碼
    1. //?load源文件 ??
    2. POIFSFileSystem?fs?=? new ?POIFSFileSystem( new ?FileInputStream(filePath)); ??
    3. HSSFWorkbook?wb?=? new ?HSSFWorkbook(fs); ??
    4. for ?( int ?i?=? 0 ;?i?<?wb.getNumberOfSheets();?i++)?{ ??
    5. ????HSSFSheet?sheet?=?wb.getSheetAt(i); ??
    6. ???? for ?( int ?i?=?sheet.getFirstRowNum();?i?<?sheet.getLastRowNum();?i?++)?{ ??
    7. ????HSSFRow?row?=?sheet.getRow(i); ??
    8. ???????????? if ?(row?!=? null )?{ ??
    9. ????????。。。操作} ??
    10. ???????} ??
    11. ?????} ??
    12. //?目標(biāo)文件 ??
    13. FileOutputStream?fos?=? new ?FileOutputStream(objectPath); ??
    14. //寫文件 ??
    15. swb.write(fos); ??
    16. fos.close();??

    2、得到列和單元格

    代碼
    1. HSSFRow?row?=?sheet.getRow(i); ??
    2. HSSFCell?cell?=?row.getCell(( short )?j);??

    3、設(shè)置sheet名稱和單元格內(nèi)容為中文

    代碼
    1. wb.setSheetName(n,? "中文" ,HSSFCell.ENCODING_UTF_16);???? ??
    2. cell.setEncoding(( short )? 1 ); ??
    3. cell.setCellValue( "中文" );??

    4、單元格內(nèi)容未公式或數(shù)值,可以這樣讀寫

    代碼
    1. cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC); ??
    2. cell.getNumericCellValue()??


    5、設(shè)置列寬、行高

    代碼
    1. sheet.setColumnWidth(( short )column,( short )width); ??
    2. row.setHeight(( short )height);??


    6、添加區(qū)域,合并單元格

    代碼
    1. Region?region?=? new ?Region(( short )rowFrom,( short )columnFrom,( short )rowTo,( short )columnTo); ??
    2. sheet.addMergedRegion(region); ??
    3. //得到所有區(qū)域 ??
    4. sheet.getNumMergedRegions()??

    7、常用方法
    根據(jù)單元格不同屬性返回字符串?dāng)?shù)值

    代碼
    1. public ?String?getCellStringValue(HSSFCell?cell)?{ ??
    2. ????????String?cellValue?=? "" ; ??
    3. ???????? switch ?(cell.getCellType())?{ ??
    4. ???????? case ?HSSFCell.CELL_TYPE_STRING: ??
    5. ????????????cellValue?=?cell.getStringCellValue(); ??
    6. ???????????? if (cellValue.trim().equals( "" )||cellValue.trim().length()<= 0 ) ??
    7. ????????????????cellValue= "?" ; ??
    8. ???????????? break ; ??
    9. ???????? case ?HSSFCell.CELL_TYPE_NUMERIC: ??
    10. ????????????cellValue?=?String.valueOf(cell.getNumericCellValue()); ??
    11. ???????????? break ; ??
    12. ???????? case ?HSSFCell.CELL_TYPE_FORMULA: ??
    13. ????????????cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC); ??
    14. ????????????cellValue?=?String.valueOf(cell.getNumericCellValue()); ??
    15. ???????????? break ; ??
    16. ???????? case ?HSSFCell.CELL_TYPE_BLANK: ??
    17. ????????????cellValue= "?" ; ??
    18. ???????????? break ; ??
    19. ???????? case ?HSSFCell.CELL_TYPE_BOOLEAN: ??
    20. ???????????? break ; ??
    21. ???????? case ?HSSFCell.CELL_TYPE_ERROR: ??
    22. ???????????? break ; ??
    23. ???????? default : ??
    24. ???????????? break ; ??
    25. ????????} ??
    26. ???????? return ?cellValue; ??
    27. ????}??


    8、常用單元格邊框格式

    虛線HSSFCellStyle.BORDER_DOTTED
    實線HSSFCellStyle.BORDER_THIN

    代碼
    1. public ? static ?HSSFCellStyle?getCellStyle( short ?type) ??
    2. ????{??? ??
    3. ???????HSSFWorkbook?wb?=? new ?HSSFWorkbook(); ??
    4. ???????HSSFCellStyle?style?=?wb.createCellStyle(); ??
    5. ???????style.setBorderBottom(type); //下邊框? ??
    6. ????????style.setBorderLeft(type); //左邊框? ??
    7. ????????style.setBorderRight(type); //右邊框? ??
    8. ????????style.setBorderTop(type); //上邊框? ??
    9. ??????? return ?style; ??
    10. ????}??


    9、設(shè)置字體和內(nèi)容位置

    代碼
    1. HSSFFont?f??=?wb.createFont(); ??
    2. f.setFontHeightInPoints(( short )? 11 ); //字號 ??
    3. f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL); //加粗 ??
    4. style.setFont(f); ??
    5. style.setAlignment(HSSFCellStyle.ALIGN_CENTER); //左右居中 ??
    6. style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); //上下居中 ??
    7. style.setRotation( short ?rotation); //單元格內(nèi)容的旋轉(zhuǎn)的角度 ??
    8. HSSFDataFormat?df?=?wb.createDataFormat(); ??
    9. style1.setDataFormat(df.getFormat( "0.00%" )); //設(shè)置單元格數(shù)據(jù)格式 ??
    10. cell.setCellFormula(string); //給單元格設(shè)公式 ??
    11. style.setRotation( short ?rotation); //單元格內(nèi)容的旋轉(zhuǎn)的角度 ??
    12. cell.setCellStyle(style); ??


    10、插入圖片

    論壇里看到的
    代碼
    1. //先把讀進(jìn)來的圖片放到一個ByteArrayOutputStream中,以便產(chǎn)生ByteArray ??
    2. ??????ByteArrayOutputStream?byteArrayOut?=?new?ByteArrayOutputStream(); ??
    3. ??????BufferedImage?bufferImg?=?ImageIO.read(new?File("ok.jpg")); ??
    4. ??????ImageIO.write(bufferImg,"jpg",byteArrayOut); ??
    5. //讀進(jìn)一個excel模版 ??
    6. FileInputStream?fos?=?new?FileInputStream(filePathName+"/stencil.xlt");? ??
    7. fs?=?new?POIFSFileSystem(fos); ??
    8. //創(chuàng)建一個工作薄 ??
    9. HSSFWorkbook?wb?=?new?HSSFWorkbook(fs); ??
    10. HSSFSheet?sheet?=?wb.getSheetAt(0); ??
    11. HSSFPatriarch?patriarch?=?sheet.createDrawingPatriarch(); ??
    12. HSSFClientAnchor?anchor?=?new?HSSFClientAnchor(0,0,1023,255,(short)?0,0,(short)10,10);????? ??
    13. patriarch.createPicture(anchor?,?wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));??

    最后更新:2006-10-30 20:12

    posted @ 2006-12-18 10:36 碼農(nóng)cz 閱讀(612) | 評論 (0)編輯 收藏

    一.POI簡介

    Jakarta POI 是apache的子項目,目標(biāo)是處理ole2對象。它提供了一組操縱Windows文檔的Java API

    目前比較成熟的是HSSF接口,處理MS Excel(97-2002)對象。它不象我們僅僅是用csv生成的沒有格式的可以由Excel轉(zhuǎn)換的東西,而是真正的Excel對象,你可以控制一些屬性如sheet,cell等等。

    二.HSSF概況

    HSSF 是Horrible SpreadSheet Format的縮寫,也即“討厭的電子表格格式”。也許HSSF的名字有點滑稽,就本質(zhì)而言它是一個非常嚴(yán)肅、正規(guī)的API。通過HSSF,你可以用純Java代碼來讀取、寫入、修改Excel文件。

    HSSF 為讀取操作提供了兩類API:usermodel和eventusermodel,即“用戶模型”和“事件-用戶模型”。前者很好理解,后者比較抽象,但操作效率要高得多。

    三.開始編碼

    1 . 準(zhǔn)備工作

    要求:JDK 1.4+POI開發(fā)包

    可以到 http://www.apache.org/dyn/closer.cgi/jakarta/poi/ 最新的POI工具包

    2 . EXCEL 結(jié)構(gòu)

    HSSFWorkbook excell 文檔對象介紹
    HSSFSheet excell的表單
    HSSFRow excell的行
    HSSFCell excell的格子單元
    HSSFFont excell字體
    HSSFName 名稱
    HSSFDataFormat 日期格式
    在poi1.7中才有以下2項:
    HSSFHeader sheet頭
    HSSFFooter sheet尾
    和這個樣式
    HSSFCellStyle cell樣式
    輔助操作包括
    HSSFDateUtil 日期
    HSSFPrintSetup 打印
    HSSFErrorConstants 錯誤信息表

    3 .具體用法實例 (采用 usermodel )

    如何讀Excel

    讀取Excel文件時,首先生成一個POIFSFileSystem對象,由POIFSFileSystem對象構(gòu)造一個HSSFWorkbook,該HSSFWorkbook對象就代表了Excel文檔。下面代碼讀取上面生成的Excel文件寫入的消息字串:
    try{
    ?? POIFSFileSystem fs=new POIFSFileSystem(new FileInputStream("d:/workbook.xls"));
    ?? HSSFWorkbook wb = new HSSFWorkbook(fs);
    ?? HSSFSheet sheet = wb.getSheetAt(0);
    ?? HSSFRow row = sheet.getRow(0);
    ?? HSSFCell cell = row.getCell((short) 0);
    ?? String msg = cell.getStringCellValue();
    ?? System.out.println(msg);
    ? }catch(Exception e){
    ?? e.printStackTrace();
    ? }

    如何寫excel,

    將excel的第一個表單第一行的第一個單元格的值寫成“a test”。

    POIFSFileSystem fs =new POIFSFileSystem(new FileInputStream("workbook.xls"));

    ??? HSSFWorkbook wb = new HSSFWorkbook(fs);

    ??? HSSFSheet sheet = wb.getSheetAt(0);

    ??? HSSFRow row = sheet.getRow(0);

    ??? HSSFCell cell = row.getCell((short)0);

    ??? cell.setCellValue("a test");

    ??? // Write the output to a file

    ??? FileOutputStream fileOut = new FileOutputStream("workbook.xls");

    ??? wb.write(fileOut);

    fileOut.close();

    4 . 可參考文檔

    POI 主頁: http://jakarta.apache.org/poi/

    初學(xué)者如何快速上手使用POI HSSF

    http://jakarta.apache.org/poi/hssf/quick-guide.html

    里面有很多例子代碼,可以很方便上手。

    四.使用心得

    POI HSSF 的usermodel包把Excel文件映射成我們熟悉的結(jié)構(gòu),諸如Workbook、Sheet、Row、Cell等,它把整個結(jié)構(gòu)以一組對象的形式保存在內(nèi)存之中,便于理解,操作方便,基本上能夠滿足我們的要求,所以說這個一個不錯的選擇。

    -------------------------------
    前面已經(jīng)講過利用POI讀寫Excel,下面是一個用POI向Excel中插入圖片的例子。

    官方文檔:
    Images are part of the drawing support. To add an image just call createPicture() on the drawing patriarch. At the time of writing the following types are supported:
    PNG
    JPG
    DIB
    It is not currently possible to read existing images and it should be noted that any existing drawings may be erased once you add a image to a sheet.

    // Create the drawing patriarch. This is the top level container for
    // all shapes. This will clear out any existing shapes for that sheet.


    通過HSSFPatriarch類createPicture方法的在指定的wb中的sheet創(chuàng)建圖片,它接受二個參數(shù),第一個是HSSFClientAnchor,設(shè)定圖片的大小。

    ?1 package ?com.poi.hssf.test;
    ?2
    ?3 import ?java.io.FileOutputStream;
    ?4 import ?java.io.File;
    ?5 import ?java.io.ByteArrayOutputStream;
    ?6 import ?java.io.IOException;
    ?7
    ?8 import ?java.awt.image.BufferedImage;
    ?9 import ?javax.imageio. * ;
    10
    11 import ?org.apache.poi.hssf.usermodel.HSSFWorkbook;
    12 import ?org.apache.poi.hssf.usermodel.HSSFSheet;
    13 import ?org.apache.poi.hssf.usermodel.HSSFPatriarch;
    14 import ?org.apache.poi.hssf.usermodel.HSSFClientAnchor;;
    15
    16 public ? class ?TestPOI? {
    17
    18 ???? public ? static ? void ?main(String[]?args)? {
    19 ????????????FileOutputStream?fileOut? = ? null ;
    20 ????????????BufferedImage?bufferImg? = null ;
    21 ????????????BufferedImage?bufferImg1? = ? null ;
    22 ???????????? try {
    23 ????????????????
    24 ?????????? // 先把讀進(jìn)來的圖片放到一個ByteArrayOutputStream中,以便產(chǎn)生ByteArray
    25 ??????????ByteArrayOutputStream?byteArrayOut? = ? new ?ByteArrayOutputStream();
    26 ??????????ByteArrayOutputStream?byteArrayOut1? = ? new ?ByteArrayOutputStream();
    27 ??????????bufferImg? = ?ImageIO.read( new ?File( " d:/PieChart.jpg " ));
    28 ??????????bufferImg1? = ?ImageIO.read( new ?File( " d:/fruitBarChart.jpg " ));
    29 ??????????ImageIO.write(bufferImg, " jpg " ,byteArrayOut);
    30 ??????????ImageIO.write(bufferImg1, " jpg " ,byteArrayOut1);
    31 ??????????
    32 ???????? // 創(chuàng)建一個工作薄
    33 ????????HSSFWorkbook?wb? = ? new ?HSSFWorkbook();
    34 ????????HSSFSheet?sheet1? = ?wb.createSheet( " new?sheet " );
    35 ???????? // HSSFRow?row?=?sheet1.createRow(2);
    36 ????????HSSFPatriarch?patriarch? = ?sheet1.createDrawingPatriarch();
    37 ????????HSSFClientAnchor?anchor? = ? new ?HSSFClientAnchor( 0 , 0 , 512 , 255 ,( short )? 1 , 1 ,( short ) 10 , 20 );
    38 ????????HSSFClientAnchor?anchor1? = ? new ?HSSFClientAnchor( 0 , 0 , 512 , 255 ,( short )? 2 , 30 ,( short ) 10 , 60 );
    39 ????????anchor1.setAnchorType( 2 );
    40 ???????? // 插入圖片
    41 ????????patriarch.createPicture(anchor?,?wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));
    42 ????????patriarch.createPicture(anchor1?,?wb.addPicture(byteArrayOut1.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));
    43 ????????
    44 ????????????fileOut? = ? new ?FileOutputStream( " d:/workbook.xls " );
    45 ???????????? // 寫入excel文件
    46 ????????????wb.write(fileOut);
    47 ????????????fileOut.close();
    48 ????????
    49 ????????????}
    catch (IOException?io) {
    50 ????????????????????io.printStackTrace();
    51 ????????????????????System.out.println( " io?erorr?:?? " + ?io.getMessage());
    52 ????????????}
    ? finally
    53 ???????????? {
    54 ???????????????? if ?(fileOut? != ? null )
    55 ???????????????? {
    56 ???????????????????????????
    57 ???????????????????? try ? {
    58 ??????????????????????????????fileOut.close();
    59 ?????????????????????????}

    60 ???????????????????? catch ?(IOException?e)
    61 ???????????????????? {
    62 ???????????????????????????? // ?TODO?Auto-generated?catch?block
    63 ????????????????????????????e.printStackTrace();
    64 ?????????????????????}

    65 ????????????????}

    66 ????????????}

    67 ????}

    68 }

    posted @ 2006-12-18 10:35 碼農(nóng)cz 閱讀(1865) | 評論 (2)編輯 收藏

    僅列出標(biāo)題
    共3頁: 上一頁 1 2 3 下一頁 
    主站蜘蛛池模板: 亚洲精品在线免费观看视频| 亚洲av无码乱码国产精品| 亚洲男人天堂2018av| 亚洲免费一级视频| 亚洲国产美女福利直播秀一区二区| 十八禁在线观看视频播放免费| 亚洲精品无码你懂的网站| 日韩毛片在线免费观看| 亚洲A∨精品一区二区三区| 日本高清不卡中文字幕免费| 亚洲免费日韩无码系列| 97无码人妻福利免费公开在线视频| 亚洲尤码不卡AV麻豆| 少妇无码一区二区三区免费| 久久久亚洲欧洲日产国码是AV| 91大神在线免费观看| 亚洲AV成人影视在线观看| 午夜寂寞在线一级观看免费| 疯狂做受xxxx高潮视频免费| 国产成人A亚洲精V品无码| 一级毛片免费播放| 亚洲短视频在线观看| 日韩免费视频一区| 国产精品偷伦视频免费观看了| 亚洲av永久无码精品漫画 | 国产日韩在线视频免费播放| 亚洲色WWW成人永久网址| 日韩插啊免费视频在线观看| 中文字幕乱码亚洲无线三区| 四虎影视免费永久在线观看| 97在线免费观看视频| 亚洲欧洲日韩综合| 可以免费观看一级毛片黄a| 在线免费播放一级毛片| 亚洲va精品中文字幕| 无码欧精品亚洲日韩一区夜夜嗨| 三年片免费观看大全国语| 亚洲精品美女久久久久9999| 亚洲AV无码乱码在线观看牲色| 日本一区二区免费看| 亚洲AV无码精品国产成人|