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

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

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

    kapok

    垃圾桶,嘿嘿,我藏的這么深你們還能找到啊,真牛!

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      455 隨筆 :: 0 文章 :: 76 評(píng)論 :: 0 Trackbacks

      你只能去找一個(gè)符合當(dāng)前需求的工具了,但是接著收到更多的要求了。"這能在Word中做到嗎?Powerpoint能做到嗎?能不能用調(diào)制解調(diào)器撥號(hào)到遠(yuǎn)程服務(wù)器上并發(fā)布數(shù)據(jù)?Java無(wú)法實(shí)現(xiàn)這些功能是什么意思?。縅ava可以實(shí)現(xiàn)任何功能。"

      感謝作為Java和COM橋梁的框架組件,它使你在遇到這些情況的時(shí)候都可以回答"Yes"。Java-COM橋梁使你能夠根據(jù)自己的需要操作Windows組件--以前這是VB、C++和.NET開發(fā)人員的領(lǐng)地。你通過(guò)實(shí)現(xiàn)一個(gè)與DCOM后端(back end)對(duì)話的Java前端(front end),可以遠(yuǎn)離端對(duì)端(end-to-end)的COM系統(tǒng)。在本文的末尾,你可以使用其中一個(gè)Java-to-COM橋:它可以被命名為JCom。

      Excel基礎(chǔ)知識(shí)

      開始之前,你需要首先從Sourceforge網(wǎng)站下載API。它包含了JCom所使用的Java類的所有源代碼、C++代碼和JCom用于配置Java和COM的編譯好的DLL。把這個(gè)DLL放到你的Java主目錄的/bin/目錄下面,否則會(huì)出現(xiàn)問(wèn)題。同時(shí),為了不出現(xiàn)問(wèn)題,還要正確地設(shè)置JAVA_HOME環(huán)境變量。JCom的大多數(shù)文檔目前都是用日語(yǔ)寫的,但是翻譯工作正在進(jìn)行中,因此以后會(huì)有些改進(jìn)的。

      下載和安裝過(guò)程完成以后,用列表1中的代碼試一試。這段代碼會(huì)建立到Excel的JCom接口,并把"Hello World"寫入第一個(gè)單元格中。你可以看到如圖1所示的結(jié)果。盡管JCom是一個(gè)通用的COM類庫(kù),但是還是帶有很多用于Excel的輔助類,這是因?yàn)镋xcel可能是最常用的自動(dòng)化COM應(yīng)用程序。這些輔助類可以為我們節(jié)省很多時(shí)間,它們使JCOM成為一個(gè)更好的類庫(kù)了。

      列表1:開始使用JCOM和Excel

    import jp.ne.so_net.ga2.no_ji.jcom.excel8.*;
    import jp.ne.so_net.ga2.no_ji.jcom.*;

    public class testSimple
    {
    public static void main(String[] args) throws Exception {
    ReleaseManager rm = new ReleaseManager();
    try {
    System.out.println("EXCEL is Starting...");
    ExcelApplication excel = new ExcelApplication(rm);
    excel.Visible(true);
    ExcelWorkbooks xlBooks = excel.Workbooks();
    ExcelWorkbook xlBook = xlBooks.Add();
    ExcelWorksheets xlSheets = xlBook.Worksheets();
    ExcelWorksheet xlSheet = xlSheets.Item(1);
    ExcelRange xlRange = xlSheet.Cells();
    xlRange.Item(1,1).Value("Hello, World!" );
    }
    catch(Exception e) { e.printStackTrace(); }
    finally { rm.release(); }
    }
    }


    圖1:Java中使用Excel的第一個(gè)COM自動(dòng)化


      如果曾經(jīng)使用VB或VBA來(lái)自動(dòng)化Excel,那么你應(yīng)該很熟悉列表1中的代碼了。ExcelApplication類暴露了Workbooks()屬性,它列舉出Excel中當(dāng)前打開的工作薄(workbook),并允許你向運(yùn)行的Excel副本增加或刪除工作薄。使用.Add()方法增加工作薄,這個(gè)方法會(huì)返回一個(gè)工作薄的引用。

      在Excel中工作薄用于保存輸入的數(shù)據(jù)。工作薄是XLS文件的基礎(chǔ)。一個(gè)工作薄由多個(gè)工作表(worksheet,在圖1中有三個(gè)工作表,分別叫做Sheet1、Sheet2和Sheet3)。工作表通過(guò)Item屬性來(lái)枚舉。你可以使用這個(gè)屬性訪問(wèn)特定的工作表。在圖1中,Sheet 1是第一個(gè)工作表,因此你可以使用xlSheets.Item(1)來(lái)獲取對(duì)它的引用。

      有了工作表之后,你就可以使用range(范圍)來(lái)操作它上面的數(shù)據(jù)。Range是一個(gè)單元格或多個(gè)單元格。例如,單元格A1可以使用range (1,1)來(lái)引用,接著可以使用Value屬性把數(shù)據(jù)載入單元格中。

    更有意義的例子

      假設(shè)你希望把Excel作為數(shù)據(jù)庫(kù)中某些數(shù)據(jù)的表現(xiàn)層。在Java中你希望通過(guò)JDBC獲取數(shù)據(jù),并把數(shù)據(jù)顯示在Excel前端。這種假設(shè)是很好的,因?yàn)閺?fù)雜業(yè)務(wù)邏輯中的用例(use case)已經(jīng)用Excel前端顯示了,更不用說(shuō)工作流中的其它的數(shù)據(jù)項(xiàng)的顯示和交互操作了?,F(xiàn)在你不需要了解業(yè)務(wù)邏輯或分析,就可以使用原始的電子表格,并使用Java中的自動(dòng)化來(lái)"填充它們之間的裂痕"。

      我將給出一個(gè)演示這種操作的簡(jiǎn)單示例:本文下載中所包含的內(nèi)容是建立比較銷售行為的一個(gè)簡(jiǎn)單的MySQL數(shù)據(jù)庫(kù)的。它有三個(gè)表:

      · Sales是銷售的細(xì)節(jié)信息,包括銷售項(xiàng)、數(shù)量、銷售價(jià)格、是誰(shuí)銷售的以及銷售地區(qū)。

      · People包含銷售人員的姓名和傭金。

      · Districts包含了銷售地區(qū)的名稱和稅率。

      生成報(bào)表的時(shí)候,你需要使用下面的業(yè)務(wù)邏輯來(lái)算出真正的數(shù)值:

      · 毛銷售額等于銷售項(xiàng)乘以銷售價(jià)格加上地稅金額。

      · 純銷售額等于毛銷售額減去銷售人員提取的稅前傭金。

      這都是一些在Java中可以實(shí)現(xiàn)的簡(jiǎn)單直接的計(jì)算過(guò)程,但是我在本文中使用它們的目的是演示如何把這些數(shù)據(jù)寫入Excel電子表格并讓Excel自動(dòng)計(jì)算。對(duì)于更復(fù)雜的情況(使用了更復(fù)雜的Excel公式),原理也是一樣的。

      此外,下載的內(nèi)容中還包含了如圖2所示的電子表格。它是作為"模板"供你填充適當(dāng)?shù)臄?shù)據(jù)的電子表格。


    圖2:用于前端填充數(shù)據(jù)的Excel模板

      使用JCOM的時(shí)候,查詢數(shù)據(jù)庫(kù)中所有銷售數(shù)據(jù)需要使用下面的SQL:

    SELECT sales.id, sales.description, sales.quantity, sales.price, districts.districtname,districts.salestax,people.name,people.commission
    FROM 'sales','districts','people'
    WHERE (sales.district = districts.id) AND (sales.salesperson = people.id)

    接著使用自動(dòng)化(automation)把每條記錄都寫入Excel電子表格的適當(dāng)?shù)牧兄?。下載的內(nèi)容中包含了完整的代碼(列表2所示)。在下面的部分,我將為你解釋代碼中使用JCOM的自動(dòng)化部分。

      列表2:從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)并載入Excel中的代碼

    // 首先建立Excel的引用
    ExcelApplication excel = new ExcelApplication(rm);
    // 使它可視
    excel.Visible(true);
    // 接著打開我們將使用的模板工作薄
    ExcelWorkbooks xlBooks = excel.Workbooks();
    ExcelWorkbook xlBook = xlBooks.Open("c:\\sales.xls");
    // 接著獲取我們將修改的范圍的引用
    ExcelWorksheets xlSheets = xlBook.Worksheets();
    ExcelWorksheet xlSheet = xlSheets.Item(1);
    ExcelRange xlRange = xlSheet.Cells();


    // 此處放置數(shù)據(jù)庫(kù)鏈接和查詢建立代碼


    if (stmt.execute(strSql))
    {
     rs = stmt.getResultSet();
    }
    int nColCount = rs.getMetaData().getColumnCount();
    int nRow=1;
    int nCol=0;
    // 在記錄集中循環(huán)
    while(rs.next())
    {
     // 記錄集中的每行都是電子表格中的一行
     nRow++;
     for(int i=1;i<=nColCount;i++)
     {
      // 匹配DB列和電子表格列
      nCol = getExcelColumn(i);
      // 查找于行和列對(duì)應(yīng)的單元格,并把它設(shè)置為適當(dāng)?shù)挠涗浖侄?BR>  xlRange.Item(nRow,nCol).Value(rs.getObject(i).toString());
     }
     // 填入公式
     xlRange.Item(nRow,7).Value("=RC[-2]*RC[-1]");
     xlRange.Item(nRow,9).Value("=RC[-2]*RC[-1]/100");
     xlRange.Item(nRow,10).Value("=RC[-3]+RC[-1]");
     xlRange.Item(nRow,11).Value("=RC[-4]*((100-RC[2])/100)");
    }

      在列表2的第一部分中,其目標(biāo)是獲取希望修改的單元格的控制權(quán)。這會(huì)花費(fèi)了一定的開銷。

      · 首先你必須獲取表現(xiàn)Excel本身的對(duì)象,有了JCOM輔助類的幫助以后,這一步操作相當(dāng)直接。

    ExcelApplication excel = new ExcelApplication(rm);
      
      · 下一步,你希望獲取對(duì)工作薄集合的訪問(wèn)權(quán)。你希望打開自己的模板工作?。ū臼纠羞@個(gè)模板在C:\sales.xls中),在工作薄集合中打開它。

    ExcelWorkbooks xlBooks = excel.Workbooks();

      · 下一步,你希望打開自己的工作薄并獲取該工作薄集合的引用。

    ExcelWorkbook xlBook = xlBooks.Open("c:\\sales.xls");
    ExcelWorksheets xlSheets = xlBook.Worksheets();

      · 最后,你希望獲取集合中的第一個(gè)工作表,并把工作范圍定義為整個(gè)工作表。

    ExcelWorksheet xlSheet = xlSheets.Item(1);
    ExcelRange xlRange = xlSheet.Cells();

      完成這些工作以后,你的xlRange對(duì)象將允許你在單元中放入值和公式了。通過(guò)在前面的記錄集(從提交給數(shù)據(jù)庫(kù)的SQL命令中返回的)中循環(huán),使用xlRange.Item(nRow,nCol).Value("whatever")語(yǔ)法,逐行逐列地把記錄集中的值插入到電子表格中(語(yǔ)法中的whatever來(lái)自于記錄集)。通過(guò)使用rs.getObject(i).toString可以得到當(dāng)前行中I列的值。通過(guò)使用rs.movenext(),當(dāng)前行一直向后移動(dòng),直到記錄集的末尾。

      你在列表2中可能會(huì)注意到一個(gè)奇怪的函數(shù)調(diào)用:

    nCol = getExcelColumn(i);

      這是一個(gè)簡(jiǎn)單的輔助函數(shù),它把記錄集中的列編號(hào)與Excel中存放數(shù)據(jù)的位置進(jìn)行匹配。例如,如果你再次查看上面的SQL語(yǔ)句,傭金費(fèi)率將返回到第8列。在電子表格中,存放它的列是第13列。這個(gè)函數(shù)用于處理兩者之間的轉(zhuǎn)換。更復(fù)雜的應(yīng)用程序可以使用Excel中的命名(named)范圍來(lái)匹配列,但是這超出了本文的范圍。

    最后,應(yīng)用程序把公式輸入適當(dāng)?shù)膯卧小K鞘褂肊xcel的R1C1符號(hào)來(lái)實(shí)現(xiàn)的,因此相應(yīng)的字符串是用于描述公式的。在Excel中,假設(shè)你希望把第1行中A列的值與B列的值相加,然后放到C列中,那么你就需要在C列中輸入公式"=A1+B1"。如果在第二行你也希望這樣操作,那么可以復(fù)制和粘貼這個(gè)公式,它會(huì)自動(dòng)地更新為"=A2+B2"。

      從示例程序中得到這些值需要一些字符串操作,但是如果使用"R1C1"相關(guān)的轉(zhuǎn)換就非常直接了。在本文的例子中,你在C1中輸入公式的時(shí)候,不需要給出"=A1+B1"引用,而是給出"=RC[-2]+RC[-1]"引用,它的意思是把向前兩列的值與向前一列的值相加。

      當(dāng)你移動(dòng)了其它行的時(shí)候,這個(gè)公式的值不會(huì)發(fā)生改變,因此它使我們生成程序所需要的值非常簡(jiǎn)單了。這也是我用于計(jì)算總銷售額、銷售稅金、毛銷售額和純銷售額的方法,如下所示:

    xlRange.Item(nRow,7).Value("=RC[-2]*RC[-1]");
    xlRange.Item(nRow,9).Value("=RC[-2]*RC[-1]/100");
    xlRange.Item(nRow,10).Value("=RC[-3]+RC[-1]");
    xlRange.Item(nRow,11).Value("=RC[-4]*((100-RC[2])/100)");

      運(yùn)行這段代碼將得到圖3所示的電子表格。


    圖3:公式:Excel顯示了數(shù)據(jù)庫(kù)查詢的輸出信息

      請(qǐng)注意,這是一種比較好的工程學(xué)經(jīng)驗(yàn),即不要在應(yīng)用程序中包含公式,因?yàn)楣娇赡茈S時(shí)改變,而你肯定不希望在改變公式的時(shí)候就去改變自己的代碼。這種辦法使每個(gè)新數(shù)據(jù)行成為包含公式的已有數(shù)據(jù)行的副本。模板電子表格(sales.xls)包含了假數(shù)據(jù),并在第二列中包含了公式(第一列包含了列標(biāo)題)。因此,當(dāng)你填充每行的時(shí)候,在你填入數(shù)據(jù)庫(kù)值的之前線復(fù)制這一行的內(nèi)容。通過(guò)這種辦法,公式通過(guò)復(fù)制進(jìn)入了新數(shù)據(jù)行,并且你不需要在Java代碼中包含任何業(yè)務(wù)邏輯。

      我們看一看salesReport2.java文件(也在下載內(nèi)容中)中的內(nèi)容,你可以發(fā)現(xiàn),我們并沒(méi)有使用前面所說(shuō)的公式,而是在While循環(huán)頂部使用了下面的代碼:

    if(nRow>1)
    {
     String strDest="A"+(nRow+1);
     ExcelRange xlRange2Copy = xlSheet.Range("A2:M2");
     xlRange2Copy.Copy(xlSheet.Range(strDest));
    }

      除了第一行之外(第一行不需要處理,這樣的信息已經(jīng)包含在sales.xls中了),這段代碼將處理A2到M2之間的單元,并把它們復(fù)制到nRow+1標(biāo)識(shí)的數(shù)據(jù)行中(nRow是當(dāng)前行的編號(hào))。加上1的原因是計(jì)算了列標(biāo)題(列標(biāo)題在第一行)。

      超越Excel

      請(qǐng)記住JCOM是用于COM的而不僅僅是用于Excel的。你可以使用這種工具在Java中控制幾乎所有的COM對(duì)象。Excel是最常見的被控制對(duì)象,因?yàn)橛泻芏嗪芎玫妮o助類可以讓它更簡(jiǎn)單,但是所有的COM組件都是可以使用的。因此控制其它的應(yīng)用程序(例如Word和Powerpoint)也是直接的。

      下面是使用Word的一個(gè)例子:

    IDispatch wdApp = new IDispatch(rm, "Word.Application");
    wdApp.put("Visible", new Boolean(true));

      由于沒(méi)有用于Word的直接的輔助類,每個(gè)部分都必須通過(guò)使用IDispatch對(duì)象來(lái)實(shí)現(xiàn)(用于Excel的下層輔助類也是這樣實(shí)現(xiàn)的)。上面的代碼將載入微軟Word副本,并通過(guò)wdApp對(duì)象使它可以自動(dòng)化操作。接著你可以使用類似"put"(設(shè)置屬性)或"method"(調(diào)用方法)等方法來(lái)使用Word。例如,上面的代碼把Visible屬性設(shè)置為true,使得該Word應(yīng)用程序可視。

      如果你一定要使用Windows,那么有大量的COM組件可以擴(kuò)充你的視野,它的數(shù)量比Java目前提供的多很多。通過(guò)串行和并行口進(jìn)行硬件控制也可以在Java中實(shí)現(xiàn)了,而這僅僅是個(gè)開始。在你的工具包中有了JCOM之后,就不受任何限制了。

    主站蜘蛛池模板: 思思久久99热免费精品6| 亚洲婷婷在线视频| 美女被爆羞羞网站在免费观看| 国产精品色拉拉免费看| 亚洲久本草在线中文字幕| 中文字幕久精品免费视频| 国产aⅴ无码专区亚洲av| 手机看片国产免费永久| 亚洲精品二区国产综合野狼| 99久久精品毛片免费播放| 久久亚洲伊人中字综合精品| 国产精成人品日日拍夜夜免费| 国产成人无码综合亚洲日韩| 2015日韩永久免费视频播放| 亚洲国产中文在线视频| 免费看的成人yellow视频| 苍井空亚洲精品AA片在线播放| 亚洲高清免费视频| 91在线免费观看| 亚洲欧洲日本天天堂在线观看| 日韩一区二区a片免费观看| 亚洲偷自拍另类图片二区| 亚洲精品视频免费| 精品一区二区三区免费| 亚洲综合精品一二三区在线 | 亚洲成色在线综合网站| 国产精品免费福利久久| 亚洲成年网站在线观看| 免费少妇a级毛片人成网| 免费无码一区二区三区蜜桃| 亚洲毛片免费观看| 亚洲成人高清在线| 国产精品免费福利久久| 亚洲日本在线电影| 亚洲中文字幕无码不卡电影| 在线永久免费的视频草莓| 国产亚洲视频在线观看网址| 亚洲AV福利天堂一区二区三| 成人au免费视频影院| 免费无码H肉动漫在线观看麻豆| 在线aⅴ亚洲中文字幕|