<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 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

         摘要:   閱讀全文

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

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

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

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

         摘要:   閱讀全文

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

    自從用上了tomcat5.5,發現日志信息沒了,出錯了也找不著有用的信息,上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

    習慣用log4j來配置log信息的輸出。

    新建log4j.properties,內容為

    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 碼農cz 閱讀(1409) | 評論 (0)編輯 收藏

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

    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.處理數據

    < 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 碼農cz 閱讀(1434) | 評論 (1)編輯 收藏

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

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

    ?????

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

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

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

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

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

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

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

    ??? 二,url-pattern詳解

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

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

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

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

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

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

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

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

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

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

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

    希望對剛開始學Hibernate的同學有所幫助

    一、saveorUpdate與unsaved-value
    到底是sava還是update
    Hibernate需要判斷被操作的對象究竟是一個已經持久化過的持久對象還是臨時對象。
    1).主鍵Hibernate的id generator產生
    <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、默認unsaved-value="null"
    主鍵是對象類型,hebernate判斷project的主鍵是否位null,來判斷project是否已被持久化
    是的話,對project對象發送save(project),
    若自己設置了主鍵則直接生成update的sql,發送update(project),即便數據庫里沒有那條記錄。
    主鍵是基本類型如int/long/double/
    自己設置unsaved-null="0"。
    所以這樣的話save和update操作肯定不會報錯。

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

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

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

    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、默認unsaved-value="null"
    這時有所不同,hibernate會根據主鍵產生一個select,來判斷此對象是否已被持久化
    已被持久化則update,未被持久化則save。
    2、unsaved-value="none",update對象,同上

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

    二、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();
    不用調用s.update(p);hibernate能察覺到它的變化,會自動更新。當然顯示調用的話也不會錯

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

    三、delete操作
    刪除時直接自己構造一個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).

    如果有級聯關系,需要把級聯的子類也構造出來add進去,同樣可以刪除。

    好了,羅嗦的夠多了。

    posted @ 2006-12-18 10:40 碼農cz 閱讀(510) | 評論 (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. //?目標文件 ??
    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、設置sheet名稱和單元格內容為中文

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

    4、單元格內容未公式或數值,可以這樣讀寫

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


    5、設置列寬、行高

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


    6、添加區域,合并單元格

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

    7、常用方法
    根據單元格不同屬性返回字符串數值

    代碼
    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、設置字體和內容位置

    代碼
    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); //單元格內容的旋轉的角度 ??
    8. HSSFDataFormat?df?=?wb.createDataFormat(); ??
    9. style1.setDataFormat(df.getFormat( "0.00%" )); //設置單元格數據格式 ??
    10. cell.setCellFormula(string); //給單元格設公式 ??
    11. style.setRotation( short ?rotation); //單元格內容的旋轉的角度 ??
    12. cell.setCellStyle(style); ??


    10、插入圖片

    論壇里看到的
    代碼
    1. //先把讀進來的圖片放到一個ByteArrayOutputStream中,以便產生ByteArray ??
    2. ??????ByteArrayOutputStream?byteArrayOut?=?new?ByteArrayOutputStream(); ??
    3. ??????BufferedImage?bufferImg?=?ImageIO.read(new?File("ok.jpg")); ??
    4. ??????ImageIO.write(bufferImg,"jpg",byteArrayOut); ??
    5. //讀進一個excel模版 ??
    6. FileInputStream?fos?=?new?FileInputStream(filePathName+"/stencil.xlt");? ??
    7. fs?=?new?POIFSFileSystem(fos); ??
    8. //創建一個工作薄 ??
    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 碼農cz 閱讀(618) | 評論 (0)編輯 收藏

    一.POI簡介

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

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

    二.HSSF概況

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

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

    三.開始編碼

    1 . 準備工作

    要求:JDK 1.4+POI開發包

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

    2 . EXCEL 結構

    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對象構造一個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/

    初學者如何快速上手使用POI HSSF

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

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

    四.使用心得

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

    -------------------------------
    前面已經講過利用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創建圖片,它接受二個參數,第一個是HSSFClientAnchor,設定圖片的大小。

    ?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 ?????????? // 先把讀進來的圖片放到一個ByteArrayOutputStream中,以便產生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 ???????? // 創建一個工作薄
    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 碼農cz 閱讀(1878) | 評論 (2)編輯 收藏

    僅列出標題
    共3頁: 上一頁 1 2 3 下一頁 
    主站蜘蛛池模板: 国产精品福利片免费看| 亚洲av日韩专区在线观看| 国产一级a毛一级a看免费视频| 国产免费小视频在线观看| 午夜亚洲WWW湿好爽| 黄网址在线永久免费观看 | 三上悠亚亚洲一区高清| kk4kk免费视频毛片| 亚洲欧洲日产国码av系列天堂 | 久久久久免费视频| 亚洲中文字幕无码中文字在线| jizz日本免费| 午夜亚洲AV日韩AV无码大全| 久久99精品免费视频| 91亚洲国产成人久久精品网址| 黄瓜视频影院在线观看免费| 亚洲欧美国产精品专区久久| 又黄又大又爽免费视频| 亚洲视频在线观看| 可以免费看的卡一卡二| 亚洲欧美成人av在线观看| 国产成人在线免费观看| 久久久久久噜噜精品免费直播 | 亚洲乱码中文字幕小综合| 成全影视免费观看大全二| 免费播放美女一级毛片| 16女性下面扒开无遮挡免费| 亚洲啪AV永久无码精品放毛片 | 亚洲AV日韩精品久久久久| 免费人成视频在线| 一级毛片免费一级直接观看| 亚洲国产另类久久久精品| 欧美在线看片A免费观看| 成人免费夜片在线观看| 免费a级毛片18以上观看精品| 国产视频精品免费视频| 亚洲区视频在线观看| 亚洲欧洲日本在线| 黄在线观看www免费看| 免费一级毛片在线播放视频免费观看永久| 亚洲开心婷婷中文字幕|