快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

188金宝搏亚洲体育娱乐真人网_酒文化网进入



为Excel的A1单元格赋值

代码:

package com.jrkui.example.excel;

import java.io.File;

import org.eclipse.swt.SWT;

import org.eclipse.swt.layout.FillLayout188金宝搏亚洲体育娱乐真人网;

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.widgets188金宝搏亚洲体育娱乐真人网.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单元格赋值

* @188金宝搏亚洲体育娱乐真人网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!

解释:

l道理:

Ø应用SWT进行OLE操作时,所有的对OLE工具的引用都是经由过程OlE定义的Id得到,得到各个工具的Id措施稍后会进行阐明

Ø所有的动作都经由过程OleAutomation工具进行,OleAutomation可以代表任一OLE工具,如Workbook、Worksheet、Range。可以经由过程getProperty()措施得到它的属性,也可以用setProperty()措施为它的属性赋值

ØVariant工具一样平常是封装了OLE工具的值,可以经由过程它进行值传入及得到响应的值,也可以经由过程它得到OleAutomation工具

Ø假如想对单元格进行操作(如:赋值、取值),则:

ü首先要取得Workbook的引用:

OleAutomation workbook = new OleAutomation(clientSite);

在这里OleClientSite工具就代表着Workbook工具,必要把OleClientSite转换成OleAutomation工具以便进行下一步动作

ü然后必要得到第一个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)}传入的

ü得到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[]{newVariant("A1"), new Variant("D4")}),由于我们要对单元格进行赋值,以是必要得到Range的OleAutomation工具

ü为A1单元格赋值:

cellA1.setProperty188金宝搏亚洲体育娱乐真人网(CE188金宝搏亚洲体育娱乐真人网LL_VALUE_ID, new Variant("Hello OLE!"));

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

ü得到A1单元格的值:

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

取值的动作必要经由过程Variant工具进行,以是得到A1单元格的值就必要经由过程cellA1Variant工具

l得到OLE工具的Id

Ø微软供给一个对象OleView.exe,可列出当前机械上的所有种别信息,以及每一各种别下的组件工具列表,这个对象貌似可以从VS或VC上得到,假如没有这个对象的话也可以上网下,我下的版本在应用的时刻少了一个dll库,这个也可以上网去下

Ø查找Excel的Id:

Excel的Id在Document ObjectsàMicrosoft Excel WorkSheet项里,选中这一项可以看到有一些tab页,此中在Registry tab页中记录了该项的具体苏息,一项项找,可以发明Excel在我的机子上的Id是Excel.Sheet (VersionIndependentProgID = Excel.Sheet),经由过程这个Id就可以应用new OleClientSite(oleFrame,SWT.NONE,"Excel.Sheet")这个措施得到Excel的引用了

Ø查找Excel组件下的工具(如,WorkSheet、Range)必要打开另一个窗口ITypeLib Viewer:

右键点击Microsoft Excel WorkSheetà选择View Type Information…

Ø得到WorkSheet(由于这个对象没有查找的功能,以是找起来有点费劲,点击Toolbar上的第二个按钮可以进行分类):

由于WorkSheet是经由过程Workbook得到的(是它的一个属性),而Workbook已经经由过程OleAutomation workbook = new OleAutomation(clientSite)措施得到了,以是这时刻我们查找WorkSheet要在Workbook中找

ü找到dispinterface _Workbooks (留意:有下划线。假如应用了分类功能,在Dispinterfaces节点下)

ü打开Methods节点(Methods:顾名思义,表示该工具的所有措施的聚拢)

ü在浩繁Method中找到Sheets

可以在右边的信息框中知道,这个措施是得到一组Sheets(WorkSheet),其id是0x000001e5,是一个proget类型的措施(get类型),赞助文档的id是0x000101e5(一样平常用不上),措施描述是Sheets* Sheets();,没有参数

Ø得到单元格也是同样的事理

ü找到dispinterface _Worksheet

ü找到MethodsàRange,得知:这个措施是得到一组Range工具,是一个是一个proget类型的措施(get类型),措施描述是Range* Range([in] VARIANT Cell1, [in, optional] VARIANT Cell2),这里的“in”表示传入的参数,“optional”表示这个参数是可选的,即可要可不要。

ü传入的参数以单元格的location表示(如:A1,D2,E5),一个参数表示一个单元格,两个参数表示两个参数代表的单元格区域(如:A1 * D5)

Ø查找单元格的Value的属性

ü找到dispinterface Range

ü找到MethodsàValue,这里会发明有两个Value,实际上它们的Id都是一样,然则代表不合的意思,一个是得到Range的Value属性(proget),一个是为Range的Value属性赋值(propput)

ü为Value属性赋值,措施描述是void Value([in, optional] VARIANT RangeValueDataType, [in] VARIANT rhs)

ü得到Value属性的值,措施描述是VARIANT Value([in, optional] VARIANT RangeValueDataType)

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: