当前位置导航:炫浪网>>网络学院>>编程开发>>JAVA教程>>Java进阶

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

    为Excel的A1单元格赋值

    代码:

package  com.jrkui.example.excel;

import  java.io.File;

import  org.eclipse.swt.SWT;
import  org.eclipse.swt.layout.FillLayout;
import  org.eclipse.swt.ole.win32.OLE;
import  org.eclipse.swt.ole.win32.OleAutomation;
import  org.eclipse.swt.ole.win32.OleClientSite;
import  org.eclipse.swt.ole.win32.OleFrame;
import  org.eclipse.swt.ole.win32.Variant;
import  org.eclipse.swt.program.Program;
import  org.eclipse.swt.widgets.Display;
import  org.eclipse.swt.widgets.Menu;
import  org.eclipse.swt.widgets.Shell;

public   class  ExcelShell {
    
public   static   void  main(String[] args) {
        
new  ExcelShell().open();
    }
    
    
public   void  open()
    {
        Display display 
=  Display.getDefault();
        Shell shell 
=   new  Shell();
        shell.setSize(
600 , 400 );
        shell.setText(
" Excel Window " );
        shell.setLayout(
new  FillLayout());
        
// 使Excel的菜单栏显示
        shell.setMenuBar( new  Menu(shell,SWT.BAR));
        
        createExcelPart(shell);
        
        shell.open();
        
while ( ! shell.isDisposed()){
            
if ( ! display.readAndDispatch())
                display.sleep();
        }
        display.close();
    }
    
    
/**
     * 使Excel嵌入到shell中
     * 
@param  shell
     
*/
    
private   void  createExcelPart(Shell shell)
    {
        
// OleFrame实际上是一个Composite,用于放置OLE控件
        OleFrame oleFrame  =   new  OleFrame(shell,SWT.NONE);
        
        
// OleClientSite提供一个场所用于把OLE对象嵌入到容器中,在这里“Excel.Sheet”表示的OLE对象是Excel
        OleClientSite clientSite  =   new  OleClientSite(oleFrame,SWT.NONE, " Excel.Sheet " );
        
        setValueForA1Cell(clientSite);
        
        
// OleClientSite在显示OLE对象时所做的动作,这里的动作是OLEIVERB_SHOW,显示
        clientSite.doVerb(OLE.OLEIVERB_SHOW);
    }
    
    
/**
     * Sheet的Id
     
*/
    
private   static   final   int  SHEET_ID  =   0x000001e5 ;
    
    
/**
     * 单元格的Id
     
*/
    
private   static   final   int  CELL_ID  =    0x000000c5 ;
        
    
/**
     * 单元格值的Id
     
*/
    
private   static   final   int  CELL_VALUE_ID  =   0x00000006 ;
    
    
/**
     * 为第一个Sheet页的A1单元格赋值
     * 
@param  clientSite
     
*/
    
private   void  setValueForA1Cell(OleClientSite clientSite)
    {
        
// 获得Excel的workbook对象
        OleAutomation workbook  =   new  OleAutomation(clientSite);
        
        
// 获得workbook的第一个Sheet页
        OleAutomation sheet  =  workbook.getProperty(SHEET_ID, new  Variant[]{ new  Variant( 1 )}).getAutomation();
        
        
// 获得Sheet页的A1单元格
        Variant cellA1Variant  =  sheet.getProperty(CELL_ID,  new  Variant[]{ new  Variant( " A1 " )});
        OleAutomation cellA1 
=  cellA1Variant.getAutomation();
        
        
// 为A1单元格赋值
        cellA1.setProperty(CELL_VALUE_ID,  new  Variant( " Hello OLE! " ));
        
        
// 获得A1单元格的值并输出到控制台上
        System.out.println(cellA1Variant.getString());
    }
}

    显示效果:

    控制台输出: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 = workbook.getProperty(SHEET_ID,new Variant[]{new Variant(1)}).getAutomation();

              需要知道 Worksheet Id 0x000001e5 ),因为在 OLE 中获得 Worksheet 的方法是的返回值是一个数组,所以需要传入一个参数“ 1 ”,表示数组的第一个元素,在这里参数“ 1 ”是通   new Variant[]{new Variant(1)} 传入的

<!--[if !supportLists]-->ü         <!--[endif]-->获得A1单元格的引用:

              Variant cellA1Variant = sheet.getProperty(CELL_ID, new Variant[]{new Variant("A1")});OleAutomation cellA1 = cellA1Variant.getAutomation();

              OLE 中代表单元格的是 Range :范围,可以表示一个单元格也可以表示一个单元格区域。实际上一个单元格就是一个特殊的 Range Range Id 0x000000c5 Range 是通过 Worksheet     获得的,需要传入的参数为字符串(用 Variant 进行包装),可以为一个(代表一个单元格,如 new Variant[]{new Variant("A1")} ),也可以为两个(代表一个单元格区域,如 new Variant[]{new       Variant("A1"), new Variant("D4")} ),因为我们要对单元格进行赋值,所以需要获得 Range OleAutomation 对象

<!--[if !supportLists]-->ü         <!--[endif]-->A1单元格赋值:

                   cellA1.setProperty(CELL_VALUE_ID, new Variant("Hello OLE!"));

                   Range 的值( Value )的属性的 Id 0x00000006 ,在这里传入一个字符串作为单元格的值

<!--[if !supportLists]-->ü         <!--[endif]-->获得A1单元格的值:

                   System.out.println(cellA1Variant.getString());

       取值的动作需要通过 Variant 对象进行,所以获得 A1 单元格的值就需要通过 cellA1Variant 对象

<!--[if !supportLists]-->l         <!--[endif]-->获得OLE对象的Id

<!--[if !supportLists]-->Ø         <!--[endif]-->微软提供一个工具OleView.exe,可列出当前机器上的所有类别信息,以及每一种类别下的组件对象列表,这个工具貌似可以从VSVC上获得,如果没有这个工具的话也可以上网下,我下的版本在使用的时候少了一个dll库,这个也可以上网去下

共2页 首页 上一页 1 2 下一页 尾页 跳转到
相关内容
赞助商链接