熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

在SWT中使用OLE操縱Excel(二)

2022-06-13   來源: Java核心技術 

  為Excel的A單元格賦值

  代碼

   package comjrkuiexampleexcel;

import javaioFile;

import orgeclipseswtSWT;
import orgeclipseswtlayoutFillLayout;
import orgeclipseswtolewinOLE;
import orgeclipseswtolewinOleAutomation;
import orgeclipseswtolewinOleClientSite;
import orgeclipseswtolewinOleFrame;
import orgeclipseswtolewinVariant;
import orgeclipseswtprogramProgram;
import orgeclipseswtwidgetsDisplay;
import orgeclipseswtwidgetsMenu;
import orgeclipseswtwidgetsShell;

public class ExcelShell {
    public static void main(String[] args) {
        new ExcelShell()open();
    }
    
    public void open()
    {
        Display display = DisplaygetDefault();
        Shell shell = new Shell();
        shellsetSize();
        shellsetText(Excel Window);
        shellsetLayout(new FillLayout());
        //使Excel的菜單欄顯示
        shellsetMenuBar(new Menu(shellSWTBAR));
        
        createExcelPart(shell);
        
        shellopen();
        while(!shellisDisposed()){
            if(!displayreadAndDispatch())
                displaysleep();
        }
        displayclose();
    }
    
    /**
     * 使Excel嵌入到shell中
     * @param shell
     */
    private void createExcelPart(Shell shell)
    {
        //OleFrame實際上是一個Composite用於放置OLE控件
        OleFrame oleFrame = new OleFrame(shellSWTNONE);
        
        //OleClientSite提供一個場所用於把OLE對象嵌入到容器中在這裡ExcelSheet表示的OLE對象是Excel
        OleClientSite clientSite = new OleClientSite(oleFrameSWTNONEExcelSheet);
        
        setValueForACell(clientSite);
        
        //OleClientSite在顯示OLE對象時所做的動作這裡的動作是OLEIVERB_SHOW顯示
        clientSitedoVerb(OLEOLEIVERB_SHOW);
    }
    
    /**
     * Sheet的Id
     */
    private static final int SHEET_ID = xe;
    
    /**
     * 單元格的Id
     */
    private static final int CELL_ID =  xc;
        
    /**
     * 單元格值的Id
     */
    private static final int CELL_VALUE_ID = x;
    
    /**
     * 為第一個Sheet頁的A單元格賦值
     * @param clientSite
     */
    private void setValueForACell(OleClientSite clientSite)
    {
        //獲得Excel的workbook對象
        OleAutomation workbook = new OleAutomation(clientSite);
        
        //獲得workbook的第一個Sheet頁
        OleAutomation sheet = workbookgetProperty(SHEET_IDnew Variant[]{new Variant()})getAutomation();
        
        //獲得Sheet頁的A單元格
        Variant cellAVariant = sheetgetProperty(CELL_ID new Variant[]{new Variant(A)});
        OleAutomation cellA = cellAVariantgetAutomation();
        
        //為A單元格賦值
        cellAsetProperty(CELL_VALUE_ID new Variant(Hello OLE!));
        
        //獲得A單元格的值並輸出到控制台上
        Systemoutprintln(cellAVariantgetString());
    }
}

  顯示效果

  

  控制台輸出Hello OLE!

  解釋

  

  <![if !supportLists]>l         <![endif]>原理

  <![if !supportLists]>Ø         <![endif]>使用SWT進行OLE操作時所有的對OLE對象的引用都是通過OlE定義的Id獲得獲得各個對象的Id方法稍後會進行說明

  <![if !supportLists]>Ø         <![endif]>所有的動作都通過OleAutomation對象進行OleAutomation可以代表任一OLE對象如WorkbookWorksheetRange可以通過getProperty()方法獲得它的屬性也可以用setProperty()方法為它的屬性賦值

  <![if !supportLists]>Ø         <![endif]>Variant對象一般是封裝了OLE對象的值可以通過它進行值傳入及獲得相應的值也可以通過它獲得OleAutomation對象

  <![if !supportLists]>Ø         <![endif]>如果想對單元格進行操作(如賦值取值)

  <![if !supportLists]>ü         <![endif]>首先要取得Workbook的引用

  OleAutomation workbook = new OleAutomation(clientSite);

  在這裡OleClientSite對象就代表著Workbook對象需要把OleClientSite轉換成OleAutomation對象以便進行下一步動作

  <![if !supportLists]>ü         <![endif]>然後需要獲得第一個Sheet頁的引用

  OleAutomation sheet = workbookgetProperty(SHEET_IDnew Variant[]{new Variant()})getAutomation();

  需要知道Worksheet的Id(xe因為在OLE中獲得Worksheet的方法是的返回值是一個數組所以需要傳入一個參數表示數組的第一個元素在這裡參數是通  過new Variant[]{new Variant()}傳入的

  <![if !supportLists]>ü         <![endif]>獲得A單元格的引用

  Variant cellAVariant = sheetgetProperty(CELL_ID new Variant[]{new Variant(A)});OleAutomation cellA = cellAVariantgetAutomation();

  在OLE中代表單元格的是Range范圍可以表示一個單元格也可以表示一個單元格區域實際上一個單元格就是一個特殊的Range Range的Id是xcRange是通過Worksheet     獲得的需要傳入的參數為字符串(用Variant進行包裝)可以為一個(代表一個單元格如new Variant[]{new Variant(A)})也可以為兩個(代表一個單元格區域如new Variant[]{new       Variant(A) new Variant(D)})因為我們要對單元格進行賦值所以需要獲得Range的OleAutomation對象

  <![if !supportLists]>ü         <![endif]>為A單元格賦值

  cellAsetProperty(CELL_VALUE_ID new Variant(Hello OLE!));

  Range的值(Value)的屬性的Id是x在這裡傳入一個字符串作為單元格的值

  <![if !supportLists]>ü         <![endif]>獲得A單元格的值

  Systemoutprintln(cellAVariantgetString());

  取值的動作需要通過Variant對象進行所以獲得A單元格的值就需要通過cellAVariant對象

  <![if !supportLists]>l         <![endif]>獲得OLE對象的Id

  <![if !supportLists]>Ø         <![endif]>微軟提供一個工具OleViewexe可列出當前機器上的所有類別信息以及每一種類別下的組件對象列表這個工具貌似可以從VS或VC上獲得如果沒有這個工具的話也可以上網下我下的版本在使用的時候少了一個dll庫這個也可以上網去下

  

  

  <![if !supportLists]>Ø        <![endif]>查找Excel的Id

  Excel的Id在Document ObjectsàMicrosoft Excel WorkSheet項裡選中這一項可以看到有一些tab頁其中在Registry tab頁中記錄了該項的詳細休息一項項找可以發現Excel在我的機子上的Id是ExcelSheet (VersionIndependentProgID = ExcelSheet)通過這個Id就可以使用new OleClientSite(oleFrameSWTNONEExcelSheet)這個方法獲得Excel的引用了

  <![if !supportLists]>Ø         <![endif]>查找Excel組件下的對象(如WorkSheetRange)需要打開另一個窗口ITypeLib Viewer

  右鍵點擊Microsoft Excel WorkSheetà選擇View Type Information…

  

  

  <![if !supportLists]>Ø        <![endif]>獲得WorkSheet(因為這個工具沒有查找的功能所以找起來有點費勁點擊Toolbar上的第二個按鈕可以進行分類)

  因為WorkSheet是通過Workbook獲得的(是它的一個屬性)而Workbook已經通過OleAutomation workbook = new OleAutomation(clientSite)方法獲得了所以這時候我們查找WorkSheet要在Workbook中找

  <![if !supportLists]>ü         <![endif]>找到dispinterface _Workbooks (注意有下劃線如果使用了分類功能在Dispinterfaces節點下)

  <![if !supportLists]>ü         <![endif]>打開Methods節點(Methods顧名思義表示該對象的所有方法的集合)

  <![if !supportLists]>ü         <![endif]>在眾多Method中找到Sheets

  

  

  可以在右邊的信息框中知道這個方法是獲得一組Sheets(WorkSheet)其id是xe是一個proget類型的方法(get類型)幫助文檔的id是xe(一般用不上)方法描述是Sheets* Sheets();沒有參數

  <![if !supportLists]>Ø          <![endif]>獲得單元格也是同樣的道理

  <![if !supportLists]>ü         <![endif]>找到dispinterface _Worksheet

  <![if !supportLists]>ü         <![endif]>找到MethodsàRange得知這個方法是獲得一組Range對象是一個是一個proget類型的方法(get類型)方法描述是Range* Range([in] VARIANT Cell [in optional] VARIANT Cell)這裡的in表示傳入的參數optional表示這個參數是可選的即可要可不要

  <![if !supportLists]>ü        <![endif]>傳入的參數以單元格的location表示(如ADE一個參數表示一個單元格兩個參數表示兩個參數代表的單元格區域(如A * D

  <![if !supportLists]>Ø          <![endif]>查找單元格的Value的屬性

  <![if !supportLists]>ü         <![endif]>找到dispinterface Range

  <![if !supportLists]>ü         <![endif]>找到MethodsàValue這裡會發現有兩個Value實際上它們的Id都是一樣但是代表不同的意思一個是獲得Range的Value屬性(proget)一個是為Range的Value屬性賦值(propput)

  <![if !supportLists]>ü         <![endif]>為Value屬性賦值方法描述是void Value([in optional] VARIANT RangeValueDataType [in] VARIANT rhs)

  <![if !supportLists]>ü         <![endif]>獲得Value屬性的值方法描述是VARIANT Value([in optional] VARIANT RangeValueDataType)


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26720.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.