office

位置:IT落伍者 >> office >> 浏览文章

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


发布日期:2019年03月31日
 
在SWT中使用OLE操纵Excel(二)

为Excel的A单元格赋值

代码

packagecomjrkuiexampleexcel;

importjavaioFile;

importorgeclipseswtSWT;

importorgeclipseswtlayoutFillLayout;

importorgeclipseswtolewinOLE;

importorgeclipseswtolewinOleAutomation;

importorgeclipseswtolewinOleClientSite;

importorgeclipseswtolewinOleFrame;

importorgeclipseswtolewinVariant;

importorgeclipseswtprogramProgram;

importorgeclipseswtwidgetsDisplay;

importorgeclipseswtwidgetsMenu;

importorgeclipseswtwidgetsShell;

publicclassExcelShell{

publicstaticvoidmain(String[]args){

newExcelShell()open();

}

publicvoidopen()

{

Displaydisplay=DisplaygetDefault();

Shellshell=newShell();

shellsetSize();

shellsetText(ExcelWindow);

shellsetLayout(newFillLayout());

//使Excel的菜单栏显示

shellsetMenuBar(newMenu(shellSWTBAR));

createExcelPart(shell);

shellopen();

while(!shellisDisposed()){

if(!displayreadAndDispatch())

displaysleep();

}

displayclose();

}

/**

*使Excel嵌入到shell中

*@paramshell

*/

privatevoidcreateExcelPart(Shellshell)

{

//OleFrame实际上是一个Composite用于放置OLE控件

OleFrameoleFrame=newOleFrame(shellSWTNONE);

//OleClientSite提供一个场所用于把OLE对象嵌入到容器中在这里ExcelSheet表示的OLE对象是Excel

OleClientSiteclientSite=newOleClientSite(oleFrameSWTNONEExcelSheet);

setValueForACell(clientSite);

//OleClientSite在显示OLE对象时所做的动作这里的动作是OLEIVERB_SHOW显示

clientSitedoVerb(OLEOLEIVERB_SHOW);

}

/**

*Sheet的Id

*/

privatestaticfinalintSHEET_ID=xe;

/**

*单元格的Id

*/

privatestaticfinalintCELL_ID=xc;

/**

*单元格值的Id

*/

privatestaticfinalintCELL_VALUE_ID=x;

/**

*为第一个Sheet页的A单元格赋值

*@paramclientSite

*/

privatevoidsetValueForACell(OleClientSiteclientSite)

{

//获得Excel的workbook对象

OleAutomationworkbook=newOleAutomation(clientSite);

//获得workbook的第一个Sheet页

OleAutomationsheet=workbookgetProperty(SHEET_IDnewVariant[]{newVariant()})getAutomation();

//获得Sheet页的A单元格

VariantcellAVariant=sheetgetProperty(CELL_IDnewVariant[]{newVariant(A)});

OleAutomationcellA=cellAVariantgetAutomation();

//为A单元格赋值

cellAsetProperty(CELL_VALUE_IDnewVariant(HelloOLE!));

//获得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)

               

上一篇:在SWT中使用OLE操纵Excel(四)

下一篇:如何实现将统计表格保存成excel文件