樂於JAVA
          幸福人生(J2EE)
          posts - 0,  comments - 5,  trackbacks - 0
          在利用網(wǎng)頁展示查詢結(jié)果時,經(jīng)常會遇到要求導(dǎo)出成Excel的需求。采用這種方法可以定制輸出的格式和內(nèi)容(還不支持合并單元格和公式),生成真正的Excel格式(不是csv)的Excel。
          一、struts.xml
          <? xml version="1.0" encoding="UTF-8" ?>
          <!DOCTYPE struts PUBLIC
              "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
              "http://struts.apache.org/dtds/struts-2.0.dtd">
            
          <struts>

              <constant name="struts.i18n.encoding" value="UTF-8"/>

              <package name="demo" extends="struts-default">
                  <action name="excel" method="execute" class="demo.ExcelAction">
                          <result name="excel" type="stream">
                              <param name="contentType">application/vnd.ms-excel</param>    <!-- 注意這里的ContentType -->
                              <param name="inputName">excelStream</param>                   <!-- 這里需要和Action里的變量名一致 -->
                              <param name="contentDisposition">filename="standard.xls"</param>
                              <param name="bufferSize">1024</param>
                          </result>
                  </action>
              </package>
          </struts>

          二、Struts2的 Action

          package demo;
          public class ExcelAction {
              private InputStream excelStream; // 需要生成getter和setter

              public String execute() throws Exception {
                  StringBuffer excelBuf = new StringBuffer();
                  excelBuf.append("BookName").append("\t").append("Year").append("\t").append("author").append("\n");
                  excelBuf.append("Thinking in Java").append("\t").append("2001").append("\t").append("Eckel").append("\n");
                  excelBuf.append("Spring in action").append("\t").append("2005").append("\t").append("Rod").append("\n");
                  String excelString = excelBuf.toString();
                  logger.debug("result excel String: " + excelString);
                  excelStream = new ByteArrayInputStream(excelString.getBytes(), 0, excelString.length());
                  return "excel";
              }

              // getter and setter
              ...
          }

          三、Jsp頁面

          <%@ taglib prefix="s" uri="/struts-tags"%>
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
           <head>
            <s:head />
           </head>

           <body>

              <s:form action="" method="post">
                 <s:submit key="button.submit"/>
              </s:form>
           </body>
          </html>

          posted @ 2008-09-19 09:57 李建軍 閱讀(412) | 評論 (0)編輯 收藏

          <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
          <%@ page import="java.io.*" %>
          <%
           String path = request.getContextPath();
           String basePath = request.getScheme() + "://"
             + request.getServerName() + ":" + request.getServerPort()
             + path + "/";
          %>

          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
            <head>
              <base href="<%=basePath%>">
             
              <title>My JSP 'createD.jsp' starting page</title>
             
           <meta http-equiv="pragma" content="no-cache">
           <meta http-equiv="cache-control" content="no-cache">
           <meta http-equiv="expires" content="0">   
           <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
           <meta http-equiv="description" content="This is my page">
           <!--
           <link rel="stylesheet" type="text/css" href="styles.css">
           -->

            </head>
           
            <body>
            <%
             String pathStr = request.getRealPath("/upload");
             pathStr = pathStr + "\\Sub";//將要建立的目錄路徑
             out.println(pathStr);
             //建立代表Sub目錄的File對象,并得到它的一個引用
             File d = new File(pathStr);
             if (d.exists()) {//檢查Sub目錄是否存在
              d.delete();
              out.println("Sub目錄存在,已刪除");
             } else {
              d.mkdir();//建立Sub目錄
              out.println("Sub目錄不存在,已建立");
             }
            %>

           </body>
          </html>

          posted @ 2008-09-19 09:49 李建軍 閱讀(165) | 評論 (0)編輯 收藏
          首先取得當(dāng)前的磁盤路徑,指定要建立的文件的路徑,再進(jìn)行檢查,假如文件不存在,則建立這個文件,假如文件存在,則刪除這個文件。
            
            CreateDelete.jsp
            
            <%@ page contentType="text/Html; charset=GB2312"%>
            <%@ page import="Java.io.*" %>
            <%@ page language="java" %>
            <HTML>
            <HEAD>
            <TITLE>文件的建立與刪除</TITLE>
            </HEAD>
            <BODY>
            <CENTER>
            <FONT SIZE = 5 COLOR = blue>文件的建立與刪除</FONT>
            </CENTER>
            <BR>
            <HR>
            <BR>
            <%
            //建立代表目前目錄位置中File.txt檔的File變量, 并由fileName變量變數(shù)引用
            String path = request.getRealPath("/jsphosting/wenjian");
            File fileName = new File(path, "File.txt");
            //檢查File.txt是否存在
            if(fileName.exists())
            {
            //刪除File.txt檔
            fileName.delete();
            //輸出目前所在的目錄路徑
            out.println(path + "\File.txt");
            %>
            <FONT SIZE = 4 COLOR = red>存在</FONT>, 已完成
            <FONT SIZE = 4 COLOR = red>刪除</FONT>
            <%
            }
            else
            {
            //在目前的目錄下建立一個名為File.txt的文字檔
            fileName.createNewFile();
            //輸出目前所在的目錄路徑
            out.println(path + "\File.txt");
            %>
            <FONT SIZE = 4 COLOR = red>不存在</FONT>, 已完成
            <FONT SIZE = 4 COLOR = red>建立</FONT>
            <%
            }
            %>
            </BODY>
            </HTML>
            
            顯示目錄中的文件
            
            首先建立要顯示的目錄的FILE對象,然后調(diào)用LISTFILES方法,該方法返回一個FILE對象數(shù)組,顯示數(shù)組中的所有元素即可。
            
            ListFile.jsp
            
            <%@ page contentType="text/html; charset=GB2312"%>
            <%@ page language="java" %>
            <%@ page import="java.io.*" %>
            <HTML>
            <HEAD>
            <TITLE>取得目錄中的文件</TITLE>
            </HEAD>
            <BODY>
            <CENTER>
            <FONT SIZE = 5 COLOR = blue>取得目錄中的文件</FONT>
            </CENTER>
            <BR>
            <HR>
            <BR>
            <%
            //取得目前目錄的磁盤目錄
            String path = request.getRealPath("/jsphosting/wenjian");
            //建立代表目前目錄位置的d變量
            File d = new File(path);
            //取得代表目錄中所有文件
            File list[] = d.listFiles();
            %>
            在<Font color = red><%= path%></Font>目錄下的文件有(每個文件有其相應(yīng)的功能)<BR>
            <Font color = blue>
            <ul>
            <%
            for(int i=0; i < list.length; i++)
            {
            %>
            <li><%= list[i].getName() %><BR>
            <%
            }
            %>
            </ul>
            </Font>
            </BODY>
            </HTML>
            
            讀取文件中的字符
            
            直接調(diào)用FILEREADER對象的READ()方法讀取所要顯示的字符
            
            ReadAll.jsp
            
            <%@ page contentType="text/html; charset=GB2312" %>
            <%@ page language="java" %>
            <%@ page import="java.io.*" %>
            <HTML>
            <HEAD>
            <TITLE>讀取文件內(nèi)容</TITLE>
            </HEAD>
            <BODY>
            <CENTER>
            <FONT SIZE = 5 COLOR = blue>讀取文件內(nèi)容</FONT>
            </CENTER>
            <BR>
            <HR>
            <BR>
            <%
            String path = request.getRealPath("/jsphosting/wenjian");
            //取得目前目錄在伺服端的實(shí)際位置
            FileReader fr = new FileReader(path + "\File.txt");
            //建立FileReader變量,并設(shè)定由fr變量變數(shù)引用
            int c = fr.read();
            //從文件中讀取一個字節(jié)
            while(c != -1)
            //判定是否已讀到文件的結(jié)尾
            {
            out.print((char)c);
            //輸出讀取到的數(shù)據(jù)
            c = fr.read();
            //從文件中讀取數(shù)據(jù)
            if(c == 13)
            //判定是否為斷行字節(jié)
            {
            out.print("<BR>");
            //輸出分行標(biāo)簽
            fr.skip(1);
            //略過一個字節(jié)
            c = fr.read();
            //讀取一個字節(jié)
            }
            }
            //關(guān)閉文件
            fr.close();
            %>
            </BODY>
            </HTML>
            
            將數(shù)據(jù)寫入文件
            
            通過調(diào)用FILEWRITER對象的WRITE()方法向文件中寫入數(shù)據(jù)
            
            Write.jsp
            
            <%@ page contentType="text/html; charset=GB2312"%>
            <%@ page language="java" %>
            <%@ page import="java.io.*" %>
            <HTML>
            <HEAD>
            <TITLE>將數(shù)據(jù)寫入文件</TITLE>
            </HEAD>
            <BODY>
            <CENTER>
            <FONT SIZE = 5 COLOR = blue>將數(shù)據(jù)寫入文件</FONT>
            </CENTER>
            <BR>
            <HR>
            <BR>
            <%
            String path = request.getRealPath("/jsphosting/wenjian");
            //取得目前目錄在伺服端的實(shí)際位置
            FileWriter fw = new FileWriter(path + "\File.txt");
            //建立FileWrite對象,并設(shè)定由fw對象變量引用
            //將字串寫入文件
            fw.write("大家好!");
            fw.write("祝大家學(xué)習(xí)jsp愉快!");
            fw.write("希望大家能夠深入了解jsp技術(shù)!");
            fw.close();
            //關(guān)閉文件
            %>
            <P>寫入文件內(nèi)容為</P>
            <FONT SIZE = 4 COLOR = red>
            <%
            FileReader fr = new FileReader(path + "\File.txt");
            //建立FileReader對象,并設(shè)定由fr對象變量引用
            BufferedReader br = new BufferedReader(fr);
            //建立BufferedReader對象,并設(shè)定由br對象變量引用
            String Line = br.readLine();
            //讀取一行數(shù)據(jù)
            out.println(Line + "<BR>");
            //輸出讀取得的數(shù)據(jù)
            br.close();
            //關(guān)閉BufferedReader對象
            fr.close();
            //關(guān)閉文件
            %>
            </FONT>
            </BODY>
            </HTML>
          資料引用:http://www.knowsky.com/367146.html
          posted @ 2008-09-19 09:47 李建軍 閱讀(123) | 評論 (0)編輯 收藏
          Windows > Preferences > MyEclipse > Community Essentials,
          把選項(xiàng) "Search for new features on startup"的前勾去掉即可.
          posted @ 2008-09-04 10:26 李建軍 閱讀(1410) | 評論 (0)編輯 收藏
          Eclipse3.2安裝完MyEclipse 在開發(fā)jsp時,只要一打“.”號彈出提示后MyEclipse就死了,沒有響應(yīng),最后只能整個關(guān)掉,重啟一下。問題還是存在。

          解決辦法:
          拔了網(wǎng)線就好了,具體什么原因正在查找.

          要想連接網(wǎng)線可以使用還有一個辦法就是修改一個打開的方式

          具體操作:

          在eclipse里選中jsp文件,右鍵,打開方式->會顯示有MyEclipse JSP Editor  選擇這項(xiàng)即可,如果選擇 MyEclipse Visual JSP Designer 這項(xiàng)就會有前面說的問題了。

          關(guān)閉myeclipse的Quick Update自動更新功能

          Windows > Preferences > MyEclipse > Community Essentials,
          把選項(xiàng) "Search for new features on startup"的前勾去掉即可.
          posted @ 2008-09-04 10:25 李建軍 閱讀(644) | 評論 (0)編輯 收藏
           
           

          Eclipse中默認(rèn)是輸入"."后出現(xiàn)自動提示,用于類成員的自動提示,可是有時候我們希望它能在我們輸入類的首字母后就出現(xiàn)自動提示,可以節(jié)省大量的輸入時間(雖然按alt + /會出現(xiàn)提示,但還是要多按一次按鍵,太麻煩了)。

              從Window -> preferences -> Java -> Editor -> Content assist -> Auto-Activation下,我們可以在"."號后面加入我們需要自動提示的首字幕,比如"ahiz"。

              然后我們回到Eclipse的開發(fā)環(huán)境,輸入"a",提示就出現(xiàn)了。

          但是我們可以發(fā)現(xiàn),這個Auto-Activation下的輸入框里最多只能輸入5個字母,也許是Eclipse的開發(fā)人員擔(dān)心我們輸入的太多會影響性能,但計(jì)算機(jī)的性能不用白不用,所以我們要打破這個限制。

          其實(shí)上面都是鋪墊,制造一下氣氛,以顯得我們下面要做的事情很牛似的,其實(shí)不然,一切都很簡單。嘿嘿 :)

          在"."后面隨便輸入幾個字符,比如"abij",然后回到開發(fā)環(huán)境,F(xiàn)ile -> export -> general -> preferences -> 選一個地方保存你的首選項(xiàng),比如C:\a.epf

          用任何文本編輯器打開a.epf,查找字符串“abij”,找到以后,替換成“abcdefghijklmnopqrstuvwxyz”,總之就是你想怎樣就怎樣!!然后回到Eclipse,F(xiàn)ile -> import -> general -> preferences -> 導(dǎo)入剛才的a.epf文件。此時你會發(fā)現(xiàn)輸入任何字幕都可以得到自動提示了。爽!!!

          最后:自動提示彈出的時間最好改成100毫秒以下,這樣會比較爽一點(diǎn),不然你都完事了,自動提示才彈出來:),不過也要看機(jī)器性能。

          posted @ 2008-09-04 10:05 李建軍 閱讀(654) | 評論 (0)編輯 收藏
           
          -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
          這里有幾個問題:
          1. 各個參數(shù)的含義什么?
          2. 為什么有的機(jī)器我將-Xmx和-XX:MaxPermSize都設(shè)置為512M之后Eclipse可以啟動,而有些機(jī)器無法啟動?
          3. 為何將上面的參數(shù)寫入到eclipse.ini文件Eclipse沒有執(zhí)行對應(yīng)的設(shè)置?

          下面我們一一進(jìn)行回答

          1. 各個參數(shù)的含義什么?

          參數(shù)中-vmargs的意思是設(shè)置JVM參數(shù),所以后面的其實(shí)都是JVM的參數(shù)了,我們首先了解一下JVM內(nèi)存管理的機(jī)制,然后再解釋每個參數(shù)代表的含義。

          堆(Heap)和非堆(Non-heap)內(nèi)存
          按 照官方的說法:“Java 虛擬機(jī)具有一個堆,堆是運(yùn)行時數(shù)據(jù)區(qū)域,所有類實(shí)例和數(shù)組的內(nèi)存均從此處分配。堆是在 Java 虛擬機(jī)啟動時創(chuàng)建的。”“在JVM中堆之外的內(nèi)存稱為非堆內(nèi)存(Non-heap memory)”。可以看出JVM主要管理兩種類型的內(nèi)存:堆和非堆。簡單來說堆就是Java代碼可及的內(nèi)存,是留給開發(fā)人員使用的;非堆就是JVM留給 自己用的,所以方法區(qū)、JVM內(nèi)部處理或優(yōu)化所需的內(nèi)存(如JIT編譯后的代碼緩存)、每個類結(jié)構(gòu)(如運(yùn)行時常數(shù)池、字段和方法數(shù)據(jù))以及方法和構(gòu)造方法 的代碼都在非堆內(nèi)存中。
          堆內(nèi)存分配
          JVM初始分配的內(nèi)存由-Xms指定,默認(rèn)是物理內(nèi)存的1/64;JVM最大分配的內(nèi)存由-Xmx 指定,默認(rèn)是物理內(nèi)存的1/4。默認(rèn)空余堆內(nèi)存小于40%時,JVM就會增大堆直到-Xmx的最大限制;空余堆內(nèi)存大于70%時,JVM會減少堆直到- Xms的最小限制。因此服務(wù)器一般設(shè)置-Xms、-Xmx相等以避免在每次GC 后調(diào)整堆的大小。
          非堆內(nèi)存分配
          JVM使用-XX:PermSize設(shè)置非堆內(nèi)存初始值,默認(rèn)是物理內(nèi)存的1/64;由XX:MaxPermSize設(shè)置最大非堆內(nèi)存的大小,默認(rèn)是物理內(nèi)存的1/4。
          JVM內(nèi)存限制(最大值)
          首 先JVM內(nèi)存限制于實(shí)際的最大物理內(nèi)存(廢話!呵呵),假設(shè)物理內(nèi)存無限大的話,JVM內(nèi)存的最大值跟操作系統(tǒng)有很大的關(guān)系。簡單的說就32位處理器雖然 可控內(nèi)存空間有4GB,但是具體的操作系統(tǒng)會給一個限制,這個限制一般是2GB-3GB(一般來說Windows系統(tǒng)下為1.5G-2G,Linux系統(tǒng) 下為2G-3G),而64bit以上的處理器就不會有限制了。
          2. 為什么有的機(jī)器我將-Xmx和-XX:MaxPermSize都設(shè)置為512M之后Eclipse可以啟動,而有些機(jī)器無法啟動?

          通過上面對JVM內(nèi)存管理的介紹我們已經(jīng)了解到JVM內(nèi)存包含兩種:堆內(nèi)存和非堆內(nèi)存,另外JVM最大內(nèi)存首先取決于實(shí)際的物理內(nèi)存和操作系統(tǒng)。所以說設(shè)置VM參數(shù)導(dǎo)致程序無法啟動主要有以下幾種原因:

          1) 參數(shù)中-Xms的值大于-Xmx,或者-XX:PermSize的值大于-XX:MaxPermSize;

          2) -Xmx的值和-XX:MaxPermSize的總和超過了JVM內(nèi)存的最大限制,比如當(dāng)前操作系統(tǒng)最大內(nèi)存限制,或者實(shí)際的物理內(nèi)存等等。說到實(shí)際物理 內(nèi)存這里需要說明一點(diǎn)的是,如果你的內(nèi)存是1024MB,但實(shí)際系統(tǒng)中用到的并不可能是1024MB,因?yàn)橛幸徊糠直挥布加昧恕?

          3. 為何將上面的參數(shù)寫入到eclipse.ini文件Eclipse沒有執(zhí)行對應(yīng)的設(shè)置?

          那為什么同樣的參數(shù)在快捷方式或者命令行中有效而在eclipse.ini文件中是無效的呢?這是因?yàn)槲覀儧]有遵守eclipse.ini文件的設(shè)置規(guī)則:

          參數(shù)形如“項(xiàng) 值”這種形式,中間有空格的需要換行書寫,如果值中有空格的需要用雙引號包括起來。比如我們使用-vm C:\Java\jre1.6.0\bin\javaw.exe參數(shù)設(shè)置虛擬機(jī),在eclipse.ini文件中要寫成這樣:

          -vm
          C:\Java\jre1.6.0\bin\javaw.exe
          按照上面所說的,最后參數(shù)在eclipse.ini中可以寫成這個樣子:

          -vmargs
          -Xms128M
          -Xmx512M
          -XX:PermSize=64M
          -XX:MaxPermSize=128M
          實(shí)際運(yùn)行的結(jié)果可以通過Eclipse中“Help”-“About Eclipse SDK”窗口里面的“Configuration Details”按鈕進(jìn)行查看。

          另外需要說明的是,Eclipse壓縮包中自帶的eclipse.ini文件內(nèi)容是這樣的:

          -showsplash
          org.eclipse.platform
          --launcher.XXMaxPermSize
          256m
          -vmargs
          -Xms40m
          -Xmx256m
          其 中–launcher.XXMaxPermSize(注意最前面是兩個連接線)跟-XX:MaxPermSize參數(shù)的含義基本是一樣的,我覺得唯一的區(qū) 別就是前者是eclipse.exe啟動的時候設(shè)置的參數(shù),而后者是eclipse所使用的JVM中的參數(shù)。其實(shí)二者設(shè)置一個就可以了,所以這里可以把 –launcher.XXMaxPermSize和下一行使用#注釋掉。

          3. 其他的啟動參數(shù)。 如果你有一個雙核的CPU,也許可以嘗試這個參數(shù):

          -XX:+UseParallelGC

          讓GC可以更快的執(zhí)行。(只是JDK 5里對GC新增加的參數(shù))

          posted @ 2008-09-02 14:41 李建軍 閱讀(173) | 評論 (0)編輯 收藏
          剛才安裝了swt Designer,發(fā)現(xiàn)提示公能沒有了。
          解決方法:

          windows->preferences->java->Editor->Code   Assist   中

          auto-activetion中的Enable auto-activetion選項(xiàng)要勾選上

          這里面有個時間的設(shè)定是為提示代碼設(shè)定的顯示時間。你可以根據(jù)自己的情況設(shè)定。

          但都不能自動提示,查了查以前eclipse 的設(shè)置才找到:window->Preferences->Java->Editor->Content Assist->Advanced   上面的選項(xiàng)卡Select the proposal kinds contained in the 'default' content assist list: 中把 Other Java Proposals 選項(xiàng)打上勾就可以了。

          另注:

          有些情況在eclipse中安裝插件時代碼自動功能失效,同樣可以用以上方式修改回來。

          posted @ 2008-09-02 14:20 李建軍 閱讀(1374) | 評論 (0)編輯 收藏

          .在程序用jnative調(diào)用windowdll

          1.   安裝

          http://sourceforge.net/projects/jnative

          解壓后得到3個文件:JNativeCpp.dlllibJNativeCpp.soJNative.jar,其中:

          JNativeCpp.dll     放在windows/system32目錄下

          libJNativeCpp.so    linux下使用

          JNative.jar          導(dǎo)入工程中

          2.   使用

          2.1.     加載dll文件

          JNative可使用兩種方式加載dll文件:

          a.使用System.loadLibrary加載,使用此方法可加載系統(tǒng)目錄中的dll文件。

          b.可以先把dll文件復(fù)制到system32目錄下,使用文件前綴名作為參數(shù)來加載dll文件。使用System.load加載,此方法參數(shù)為dll文件全路徑名。

          2.2.     調(diào)用函數(shù)

          a、首先創(chuàng)建JNative對象:

          JNative jnative = new JNative(dll文件名, 函數(shù)名);

          b、設(shè)置返回值類型:

          jnative.setRetVal(Type.INT);

          c、設(shè)置參數(shù)

          jnative.setParameter(0, Type.STRING, ); //設(shè)置第一個參數(shù)為字符串

          jnative.setParameter(1, Type.INT, String.valueof());       //設(shè)置第二個參數(shù)為整數(shù)

          d、執(zhí)行

          n.invoke();

          e、獲取返回值

          Integer.parseInt(jnative.getRetVal());

          3.實(shí)例

          import org.xvolks.jnative.JNative;

          import org.xvolks.jnative.Type;

          import org.xvolks.jnative.exceptions.NativeException;

          import org.xvolks.jnative.pointers.Pointer;

          import org.xvolks.jnative.pointers.memory.HeapMemoryBlock;

          public class Test {

                 public static void main(String[] args) throws NativeException, IllegalAccessException {

                 JNative v=new JNative("Kernel32.dll","GetModuleFileNameA");

                  int i = 0;

                  v.setRetVal(Type.INT);

                  Pointer pName = new Pointer(new HeapMemoryBlock(1024));

                 

                  v.setParameter(i++, 0);//module handle

                  v.setParameter(i++, pName);//pFileName

                  v.setParameter(i++, 1024);//nSize

                  v.setRetVal(Type.INT);

                  v.invoke();

                  int ret = Integer.parseInt(v.getRetVal());

                  if (ret == 0) {

                      // return "null";

                      System.err.println(

                              "GetModuleFileName failed!");

                  } else {

                     

                      String path = pName.getAsString().substring(0,

                              ret);

                      pName.dispose();

                      v.dispose();

                      System.out.println("current process's path is:"+path);

                  }

              }

           

          }

           

           

          4.注意:

          JNative中用了JDK1.5的一些特性,如枚舉、靜態(tài)引入等,所以在JDK1.4下是不能用的。

          .在程序用jawin調(diào)用windowdll

          jawin 可以對dll中的方法進(jìn)行調(diào)用,也可以調(diào)用com中的方法.內(nèi)部還提供了一個工具,直接對 com組件導(dǎo)出成 java的類,個人認(rèn)為很方便。

          下面是我們作的一個測試,很順利便通過了。

          1、下載jawinhttp://jawinproject.sourceforge.net/

          2、配置:

              a.jawin.jar放于%JAVA_HOME%"jre"lib"ext

              b.jawin.dll放于c:"winnt"system32下。否則將出現(xiàn)錯誤:COMException : no jawin in java.library.path

              也可將jawin.dll放于每個項(xiàng)目目錄下。

           

             c.至此在Editplus中調(diào)試Jawin/NJawin的例子,可以通過。而在Eclipse中有時還會出上面的錯誤:COMException : no jawin in java.library.path

             d.Eclipse中,菜單->window->preference->Java->installed JREs 將原來的remove,重新建一個指到你的java sdk目錄。 ok了。

           3、程序測試:

           

          import org.jawin.FuncPtr;

           

          import org.jawin.ReturnFlags;

           

          public class GfJawinTest {

           

                 public static void main(String[] args) {

           

                        try {

           

                               FuncPtr msgBox = new FuncPtr("USER32.DLL", "MessageBoxW");

                               msgBox.invoke_I(0, "Hello From a DLL", "From Jawin", 0, ReturnFlags.CHECK_NONE);

                        } catch (Exception e) {

           

                               e.printStackTrace();

           

                        }

           

                 }

           

          }

           

           

          4.利用jawin調(diào)用com組件, word:

          //創(chuàng)建word

          import org.jawin.DispatchPtr;

          import org.jawin.win32.Ole32;

          public class CreateWord {

           

                 public static void main(String[] args) {

                        try {

                               Ole32.CoInitialize();//                   初始化

                               DispatchPtr app = new DispatchPtr("Word.Application");//               創(chuàng)建word對象

                               app.put("Visible",true); //                     使word可見

                               DispatchPtr docs=(DispatchPtr)app.get("Documents"); //                 獲得document對象集合

                               DispatchPtr doc=(DispatchPtr)docs.invoke("Add"); //                    新增一個文檔

                               app.invoke("Activate"); //                    激活當(dāng)前文檔

                              

                               DispatchPtr objTextFont=(DispatchPtr)((DispatchPtr)doc.get("Content")).get("Font");

          //                   取得Font對象

                               objTextFont.put("Name","黑體");

          //                   設(shè)置字體

                               objTextFont.put("Size","48");

          //                   設(shè)置字號

                               DispatchPtr docSelection=(DispatchPtr)app.get("Selection");

          //                   取得Selection對象

                               docSelection.invoke("TypeText","Jawwintesttext!"nJawin測試文本。");

          //                   使用TypeText方法添加文本

                               doc.invoke("SaveAs","d:""jawintest.doc");

          //                   保存文檔(保存在C盤根目錄下)

                               doc.invoke("Close");

          //                   關(guān)閉當(dāng)前文檔,去掉前面的注釋符并重新編譯后可生效

                               app.invoke("Quit");

          //                   退出Word,去掉前面的注釋符并重新編譯后可生效

           

                              

                               Ole32.CoUninitialize(); //                     釋放對象

                        } catch (Exception e) {

                               e.printStackTrace();

                        }

                 }

           

          }

           

          //打開word

          import org.jawin.DispatchPtr;

          import org.jawin.win32.Ole32;

           

          public class OpenWord {

                 public static void main(String[] args) {

                        try {

                               Ole32.CoInitialize();

                               DispatchPtr app = new DispatchPtr("Word.Application");

                               app.put("Visible", true);

                               DispatchPtr docs = (DispatchPtr) app.get("Documents");

                               DispatchPtr doc = (DispatchPtr) docs.invoke("Open", "d:""word.doc");

                               Ole32.CoUninitialize();

                        } catch (Exception e) {

                               e.printStackTrace();

                        }

                 }

          }

           

          //調(diào)用word中的另存為,保存為.html

          import org.jawin.DispatchPtr;

          import org.jawin.win32.Ole32;

           

          public class Word2Html {

                 public static void main(String[] args) {

           

                        String path = "e://17001939578.doc";

                        int iPos = path.lastIndexOf(".");

                        String fileExtName = path.substring(iPos + 1);

                        String fileMainName = path.substring(0, iPos);

                        fileExtName = fileExtName.toLowerCase();

                        try {

                               Ole32.CoInitialize();

                               // 初始化

                               DispatchPtr app = new DispatchPtr("Word.Application");

                               // 創(chuàng)建word對象

                               app.put("Visible", false);

                               // 設(shè)置word不可見

                               DispatchPtr docs = (DispatchPtr) app.get("Documents");

                               // 取得Documents對象

                               DispatchPtr doc = (DispatchPtr) docs.invoke("Open", path);

                               // 打開指定的word文件

                               doc.invoke("SaveAs", fileMainName + ".html");

                               // 另存為HTML文件

                               app.invoke("quit");

                               // 關(guān)閉word

                               Ole32.CoUninitialize();

                               // 釋放對象

                               System.out.println(""n轉(zhuǎn)換完成!");

                               System.out.println(""n文件名:" + fileMainName + ".html");

                        } catch (Exception e) {

                               System.out.println(""n該文件不存在!或者其他錯誤(如:運(yùn)行環(huán)境問題)");

                        }

                 }

          }

          posted @ 2008-08-04 10:47 李建軍 閱讀(1052) | 評論 (0)編輯 收藏
           
          Day 開頭的函數(shù)

          Unit

          DateUtils

          function DateOf(const Avalue: TDateTime): TDateTime;

          描述
          使用 DateOf 函數(shù)用來把一個 TDateTime 類型的變量轉(zhuǎn)變成一個
          只帶有日期的 TDateTime 類型變量。
          例如:
          showmessage(DateTimetostr(dateof(now())));
          你得到的是 2003/03/19
          而 showmessage(DateTimetostr((now())));
          得到的是 2003/03/19 10:50:49

          ●function DateTimeToStr(DateTime: TDateTime): string;

          描述
          DateTimeToString 函數(shù)將 TDateTime 類型的參數(shù) DateTime 轉(zhuǎn)換成一個
          字符串,使用給定的全局變量 ShortDateFormat 的格式,時間部分按照
          給定的全局變量 LongTimeFormat 的格式。
          其中 DateTime 為零的部分將不會顯示出來。

          例如:
          ShortDateFormat:=’yyyy mm dd’;
          showmessage(DateTimetostr((now())));
          你將得到:2003 03 19 10:50:49


          ●procedure DateTimeToString(var Result: string; const Format: string; DateTime: TDateTime);

          描述:
          DateTimeToString 方法將TDateTime類型的參數(shù)DateTime 按照由參數(shù)Format提供的格式
          轉(zhuǎn)化成字符串,并保存在Result中。
          對于Format的格式類型,請看 Date-Time format strings 的幫助。

          例如:
          DateTimeToString(result,’yyyy mm dd’,now());
          那么 result的結(jié)果為:2003 03 19 10:50:49

          ●procedure DateTimeToSystemTime(DateTime: TDateTime; var SystemTime: TSystemTime);

          描述:
          有時為了調(diào)用API函數(shù)來使用系統(tǒng)時間,你可以使用 DateTimeToSystemTime 方法,來將一個
          TDateTime 類型的時間變量轉(zhuǎn)換成一個 TSystemTime 類型的 系統(tǒng)時間。

          ●function DateTimeToUnix(const Avalue: TDateTime ): Int64;

          描述:
          使用 DateTimeToUnix 函數(shù)來將一個 TDateTime 型時間變量轉(zhuǎn)換成一個相應(yīng)的 Unix 格式
          的日期和時間。
          Unix date-and-time values are encoded as the number of seconds that have elapsed
          since midnight at the start of January 1, 1970.


          ●function DateToStr(Date: TDateTime): string;

          描述:
          使用 DateToStr 函數(shù)能得到 TDateTime 日期時間類型的日期部分。日期的轉(zhuǎn)換格式依賴于
          全局變量 ShortDateFormat。

          ●function DayOf(const Avalue: TDateTime): Word;

          描述:
          對于給定的TDateTime類型的日期時間,使用 DayOf 函數(shù)能得到該日期是該月份的第幾天。
          該函數(shù)的返回?cái)?shù)值在 1 到 31 之間
          注意:DayOf 函數(shù)得到的結(jié)果與 DayOfTheMonth 相同。

          例如:
          showmessage(inttostr(dayof(now)));
          得到的是:19 (今天是 某月19日)

          ●function DayOfTheMonth(const Avalue: TDateTime): Word;

          與 DayOf 相同。

          ●function DayOfTheWeek(const Avalue: TDateTime): Word;

          描述:
          對于給定的TDateTime類型的日期時間,使用 DayOfTheWeek 函數(shù)能得到該日期是該星期的
          第幾天。DayOfTheWeek 函數(shù)的返回?cái)?shù)值為 1 到 7,其中 1 表示星期一,而 7 表示星期日。
          注意:DayOfTheWeek 是 ISO 8601 標(biāo)準(zhǔn)的(此標(biāo)準(zhǔn)為 星期一是一周的第一天)。對于一周
          的第一天是星期日的標(biāo)準(zhǔn),如果想獲得星期數(shù),請使用 DayOfWeek 函數(shù)。
          Tip: To make the return value more readable, use the Day of week constants.

          ●function DayOfTheYear(const Avalue: TDateTime): Word;

          描述:
          根據(jù)給定的日期時間參數(shù)Avalue,使用 DayOfTheYear 函數(shù)能得到在該日期所在的年份中,該
          日期按照順序所計(jì)算的天數(shù)。因此,作為TDateTime類型的變量 “1月1日”在該函數(shù)所得到的
          結(jié)果為 1 ,“1月2日”所得到的結(jié)果為 2,“2月1日”所得到的結(jié)果就為 32,依次類推。

          ●function DayOfWeek(Date: TDateTime): Integer;

          Description

          DayOfWeek returns the day of the week of the specified date as an integer between
          1 and 7, where Sunday is the first day of the week and Saturday is the seventh.

          Note: DayOfWeek is not compliant with the ISO 8601 standard, which defines Monday
          as the first day of the week. For an ISO 8601 compliant version, use the DayOfTheWeek
          function instead.

          描述:
          按照給定的TDateTime類型的參數(shù)Date,DayOfWeek 函數(shù)得到一周中的第幾天,從1到7。
          這里 星期日 是一周的第一天,而 星期六 是第七天。

          ●function DaysBetween(const ANow, AThen: TDateTime): Integer;

          描述:
          根據(jù)兩個TDateTime類型的日期時間變量 ANow 和 AThen,DaysBetween函數(shù)能得到兩者之間的
          天數(shù)的差距。
          DaysBetween 僅僅根據(jù)天數(shù)的不同來計(jì)算。因此,對于 1999年12月31日 下午11點(diǎn)59分 到
          2000年1月1日 11點(diǎn)58分,該函數(shù)得到的結(jié)果是 0,因?yàn)閮烧咧g的時間差別還差 1 分鐘才到
          1 天。

          ●function DaysInAMonth(const AYear, AMonth: Word): Word;

          描述:
          對于各定的 年份和月份,DaysInAMonth 函數(shù)能得到 該月份的總天數(shù)。
          年份應(yīng)該為 從 1 到 9999
          月份應(yīng)該為 從 1 到 12

          ●function DaysInAYear(const AYear: Word): Word;

          描述:
          對于給定的年份,DaysInAYear函數(shù)能得到該年份的總天數(shù)。
          年份應(yīng)該為 1 到 9999。

          ●function DaysInMonth(const Avalue: TDateTime): Word;

          描述:
          根據(jù)給定的TDateTime類型的時間日期參數(shù)Avalue,DaysInMonth函數(shù)能得到該月份的總天數(shù)。

          ●function DaysInYear(const Avalue: TDateTime): Word;

          描述:
          根據(jù)給定的TDateTime類型的時間日期參數(shù)Avalue,DaysInYear函數(shù)能得到該年份的總天數(shù)。

          ●function DaySpan(const ANow, AThen: TDateTime): Double;

          描述:
          根據(jù)兩個TDateTime類型的日期時間參數(shù)ANow和AThen,DaySpan能得到在天數(shù)上的差距。
          與 DaysBetween 函數(shù)不同,DaysBetween 函數(shù) 只是計(jì)算 整的天數(shù),而 DaySpan函數(shù)會
          將不足一天的數(shù)也得到。
          注意:此函數(shù)返回的數(shù)值為 Double 型。

          ☆ Month 開頭的函數(shù)

          ●function MonthOf(const Avalue: TDateTime): Word;

          描述:
          根據(jù)給定的TDateTime類型的時間日期參數(shù)Avalue,MonthOf函數(shù)能得到該年份的該月份數(shù)。
          MonthOf返回?cái)?shù)值為 1 到 12。
          注意:MonthOf函數(shù)得到的數(shù)值與MonthOfTheYear函數(shù)相同

          ●function MonthOfTheYear(const Avalue: TDateTime): Word;

          與MonthOf函數(shù)相同。

          ●function MonthsBetween(const ANow, AThen: TDateTime): Integer;

          描述:
          根據(jù)兩個給定的TDateTime類型的參數(shù)ANow和AThen,MonthsBetween函數(shù)能得到兩個日期在月份
          上差距數(shù)。因?yàn)樵路莸奶鞌?shù)是不同的,所以 MonthsBetween 函數(shù)返回的是一個近似值,該近似
          值基于每個月份為 30.4375 天。不足一個月的數(shù)字將不被計(jì)算。
          因此,例如,對于 2月1日 到 2月28日,MonthsBetween 返回的數(shù)值為 0。
          同樣,對于 2月1日 到 3月1日,MonthsBetween 返回的數(shù)值也是 0。

          ●function MonthSpan(const ANow, AThen: TDateTime): Double;

          描述:
          根據(jù)兩個給定的TDateTime類型的參數(shù)ANow和AThen,MonthsBetween函數(shù)能得到兩個日期在月份
          上差距數(shù)。因?yàn)樵路莸奶鞌?shù)是不同的,所以 MonthsBetween 函數(shù)返回的是一個近似值,該近似
          值基于每個月份為 30.4375 天。與 MonthsBetween 函數(shù)不同,MonthsBetween函數(shù)不計(jì)算不足
          一個月的數(shù)字,MonthSpan函數(shù)將會得到不足一個月的數(shù)字。
          注意:此函數(shù)返回的類型為 Double

          ●function MonthStr(DateTime: TDateTime): string;

          Description

          HTTP message headers permit several formats for the representation of date and time
          values. MonthStr converts a TDateTime value into a string representing the month.
          MonthStr allows server applications to work with date values taken from HTTP request
          messages, without worrying about the details of how they are formatted.

          ☆ Week 開頭的函數(shù)

          ●function WeekOf(const Avalue: TDateTime): Word;

          描述:
          根據(jù)TDateTime類型的日期時間參數(shù)AValu,WeekOf函數(shù)會得到該星期為一年的第幾個
          星期。

          ●function WeeksInAYear(const AYear: Word): Word;

          描述:
          WeeksInAYear 函數(shù)根據(jù)年份得到在該年份中共包含多少個星期。

          ●function WeeksBetween(const ANow, AThen: TDateTime): Integer;

          描述:
          根據(jù)兩個TDateTime類型的日期時間參數(shù)ANow和AThen,WeeksBetween函數(shù)將得到這兩個時間在
          星期上的差數(shù)。如果差數(shù)不足一個星期,則忽略掉。

          ●function WeekSpan(const ANow, AThen: TDateTime): Double;

          描述:
          根據(jù)兩個TDateTime類型的日期時間參數(shù)ANow和AThen,WeeksBetween函數(shù)將得到這兩個時間在
          星期上的差數(shù)。如果差數(shù)不足一個星期,則WeekSpan函數(shù)不會忽略掉。
          注意:此函數(shù)的返回類型為 Double

          ☆ Year 開頭的函數(shù)

          ●function YearOf(const Avalue: TDateTime): Word;

          描述:
          根據(jù)給定的TDateTime類型的日期時間參數(shù)Avalue,YearOf函數(shù)能得到該日期的年份數(shù)字。
          YearOf函數(shù)返回的數(shù)值為從 1 到 9999

          ●function YearsBetween(const ANow, AThen: TDateTime): Integer;

          描述:
          根據(jù)兩個給定的TDateTime類型的參數(shù)ANow和AThen,YearsBetween函數(shù)能得到兩個日期在年份
          上差距數(shù)。因?yàn)槟攴莸奶鞌?shù)是不同的,所以 YearsBetween 函數(shù)返回的是一個近似值,該近似
          值基于每年的天數(shù)為 365.25 天。不足的一年的差距將不會被計(jì)算。
          因此例如:對于 1月1日和12月31日,如果這兩個日期在同一年,則 YearsBetween 返回?cái)?shù)值
          為 0;如果這兩個日期在臨近的年份,則 YearsBetween 函數(shù)返回?cái)?shù)值為 1。

          ●function YearSpan(const ANow, AThen: TDateTime): Double;

          描述:
          根據(jù)兩個給定的TDateTime類型的參數(shù)ANow和AThen,YearsBetween函數(shù)能得到兩個日期在年份
          上差距數(shù)。因?yàn)槟攴莸奶鞌?shù)是不同的,所以 YearsBetween 函數(shù)返回的是一個近似值,該近似
          值基于每年的天數(shù)為 365.25 天。與 YearsBetween 函數(shù)不同,YearsBetween函數(shù)將忽略掉不
          足一年的數(shù)字,而 YearSpan 將計(jì)算不足一年的數(shù)字。
          注意:該函數(shù)返回類型為Double


          ●function Yesterday: TDateTime;

          描述:
          Yesterday函數(shù)能得到當(dāng)前日期的前一天的日期,返回?cái)?shù)值中不包括時間部分。
          例如:
          當(dāng)前日期是 2003/3/19
          則 showmessage(datetimetostr(Yesterday));
          將得到 2003/3/18

          ☆日期的合成
          ●function EncodeDate(Year, Month, Day: Word): TDateTime;

          描述:
          EncodeDate函數(shù)將根據(jù)參數(shù) 年份、月份、日子 而得到一個TDateTime類型的時間變量。

          ●function EncodeDateDay(const AYear, ADayOfYear: Word): TDateTime;

          描述:
          EncodeDateDay將根據(jù)參數(shù)年份和天數(shù),而得到一個TDateTime類型的時間變量。
          其中AYear 為 1 到 9999。
          ADayOfYear 為日子在該年份順序排列的天數(shù),例如,1月1日時,ADayOfYear為1,
          2月2日時,ADayOfYear為2,3月1日時,ADayOfYear為32。

          ●function EncodeDateMonthWeek(const AYear, AMonth, AWeekOfMonth: Word; const ADayOfWeek: Word =

          1): TDateTime;

          描述:
          EncodeDateMonthWeek 函數(shù)將根據(jù)參數(shù) 年份、月份、星期數(shù),星期幾,來得到一個TDateTime類型
          的時間變量。
          其中AYear 為 1 到 9999。
          其中AMonth 為 1 到 12。
          AWeekOfMonth是在該月份的星期數(shù),1 表示第一個星期,可能包含4天或更多的天數(shù)。
          注意,一個月的第一天如果是 星期5,星期6或星期日,用表示這三天的AMonth數(shù)值必須設(shè)定
          為上一個月份的數(shù)字,同時 AWeekOfMonth 要設(shè)為在上一個月所在的星期數(shù)。
          同樣,如果一個月的最后一天是 星期1,星期2,或星期3,那么用表示這三天的AMonth數(shù)值
          必須設(shè)定為下一個月份的數(shù)字,同時 AWeekOfMonth 為 1。
          ADayOfWeek表示星期幾,星期一為1,星期二為2。

          ●function EncodeDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond:

          Word):TDateTime;

          描述:
          EncodeDateTime 根據(jù)參數(shù) 年份、月份、日子、小時、分、秒、毫秒 來得到一個TDateTime類型
          日期時間。

          ●function EncodeDateWeek(const AYear, AWeekOfYear: Word; const ADayOfWeek: Word = 1): TDateTime;

          描述:

          EncodeDateWeek 根據(jù)參數(shù) 年份、星期數(shù)、星期幾 來得到一個TDateTime類型日期時間。

          AWeekOfYear是在該年份的星期數(shù),1 表示第一個星期,可能包含4天或更多的天數(shù)。
          注意,一年的第一天如果是 星期5,星期6或星期日,用表示這三天的AYear數(shù)值必須設(shè)定
          為上一個年份的數(shù)字,同時 AWeekOfYear 要設(shè)為在上一個年所在的星期數(shù)。
          同樣,如果一年的最后一天是 星期1,星期2,或星期3,那么用表示這三天的AYear數(shù)值
          必須設(shè)定為下一個年份的數(shù)字,同時 AWeekOfYear 為 1。
          ADayOfWeek表示星期幾,星期一為1,星期二為2。

          ●function EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime;

          描述:
          EncodeTime函數(shù)根據(jù)參數(shù) 小時、分、秒、毫秒 得到個一個TDateTime數(shù)值。

          ☆日期的分解

          ●procedure DecodeDate(Date: TDateTime; var Year, Month, Day: Word);

          描述:
          DecodeDate從一個TDateTime類型參數(shù)Date中分解出得到年份、月份、日子。

          ●procedure DecodeDateDay(const Avalue: TDateTime; out AYear, ADayOfYear: Word);

          描述:
          DecodeDateDay 方法會根據(jù)TDateTime類型參數(shù)Avalue 得到相應(yīng)的年份和日期總數(shù)。
          ADayOfYear:1月1日,此數(shù)值為1;1月2日,此數(shù)值為2。

          ●procedure DecodeDateMonthWeek(const Avalue: TDateTime; out AYear, AMonth, AWeekOfMonth,

          ADayOfWeek: Word);

          描述:
          DecodeDateMonthWeek方法根據(jù)TDateTime類型參數(shù)Avalue 得到相應(yīng)的年份、月份、月份中的第幾個
          星期、星期幾
          AYear:年份
          AMonth:月份,1 到 12
          AWeekOfMonth:在該月份中的第幾個星期
          ADayOfWeek:星期幾。星期一為1。

          ●procedure DecodeDateTime(const Avalue: TDateTime; out AYear, AMonth, ADay, AHour, AMinute,

          ASecond, AMilliSecond: Word);

          描述:
          DecodeDateTime 方法根據(jù)TDateTime類型參數(shù)Avalue 得到相應(yīng)的年份、月份、日子、小時、分、秒、
          毫秒。

          ●procedure DecodeDateWeek(const Avalue: TDateTime; out AYear, AWeekOfYear, ADayOfWeek: Word);

          描述:
          DecodeDateWeek方法根據(jù)TDateTime類型參數(shù)Avalue 得到相應(yīng)的年份、在該年中的第幾個星期、星期幾。
          posted @ 2008-07-22 15:14 李建軍 閱讀(165) | 評論 (0)編輯 收藏
          僅列出標(biāo)題  

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          留言簿(1)

          文章分類

          文章檔案

          搜索

          •  

          最新評論

          主站蜘蛛池模板: 米脂县| 定日县| 辽中县| 临夏县| 涟水县| 时尚| 嘉祥县| 延寿县| 罗山县| 来凤县| 壤塘县| 施甸县| 彭阳县| 阿坝| 大安市| 永嘉县| 阿拉善右旗| 黔西县| 丰都县| 江阴市| 和平区| 旅游| 双牌县| 湖南省| 邵武市| 香港 | 荣成市| 彭阳县| 营山县| 克什克腾旗| 石林| 福清市| 岫岩| 阜宁县| 象州县| 南宫市| 宣化县| 济阳县| 湘潭市| 义马市| 开远市|