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();
shell.dispose();
display.dispose();
}
/**
* 使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
File file01=new File("D:"+File.separator+"ABC.xlsx");
OleClientSite clientSite = new OleClientSite(oleFrame, SWT.NONE, file01);
setValueForA1Cell(clientSite);
//OleClientSite在显示OLE对象时所做的动作,这里的动作是OLEIVERB_SHOW,显示
clientSite.doVerb(OLE.OLEIVERB_SHOW);
}
/**
* Sheet的Id
*/
private static final int SHEET_ID = 0x000001e5;
/**
* 单元格的Id(Range)
*/
private static final int CELL_ID = 0x000000c5;
/**
* 单元格值的Id
*/
private static final int CELL_VALUE_ID = 0x00000006;
/**
* 为第一个Sheet页的A1单元格赋值
* @param clientSite
*/
/*
* 原理:
使用SWT进行OLE操作时,所有的对OLE对象的引用都是通过OLE定义的Id获得,
所有的动作都通过OleAutomation对象进行,OleAutomation可以代表任一OLE对象,如Workbook、Worksheet、Range。
可以通过getProperty()方法获得它的属性,也可以用setProperty()方法为它的属性赋值
Variant对象一般是封装了OLE对象的值,可以通过它进行值传入及获得相应的值,也可以通过它获得OleAutomation对象
/
private void setValueForA1Cell(OleClientSite clientSite)
{
//获得Excel的workbook对象,
//在这里OleClientSite对象就代表着Workbook对象,需要把OleClientSite转换成OleAutomation对象以便进行下一步动作
OleAutomation workbook = new OleAutomation(clientSite);
/*
* 获得workbook的第一个Sheet页,
*需要知道Worksheet的Id(0x000001e5),因为在OLE中获得Worksheet的方法是的返回值是一个数组,
*所以需要传入一个参数“1”,表示数组的第一个元素,在这里参数“1”是通 过new Variant[]{new Variant(1)}传入的
*/
OleAutomation sheet = workbook.getProperty(SHEET_ID,new Variant[]{new Variant(1)}).getAutomation();
/**
* 获得Sheet页的A1单元格
*在OLE中代表单元格的是Range,可以表示一个单元格也可以表示一个单元格区域。实际上一个单元格就是一个特殊的Range,
*Range的Id是0x000000c5。Range是通过Worksheet 获得的,需要传入的参数为字符串(用Variant进行包装),
*可以为一个(代表一个单元格,如new Variant[]{new Variant("A1")}),
*也可以为两个(代表一个单元格区域,如new Variant[]{new Variant("A1"), new Variant("B2")}),
*因为我们要对单元格进行赋值,所以需要获得Range的OleAutomation对象
*/
Variant cellA1Variant = sheet.getProperty(CELL_ID ,new Variant[]{new Variant("A1"), new Variant("B2")});
OleAutomation cellA1_B2= cellA1Variant.getAutomation();
/**
* 为A1单元格赋值,Range的值(Value)的属性的Id是0x00000006,在这里传入一个字符串作为单元格的值
*/
cellA1_B2.setProperty(CELL_VALUE_ID , new Variant[] {new Variant("Heo"),new Variant("GGH"),,new Variant("OOP"),new Variant("COM")});
}
}
注:采用cellA1_B2.setProperty赋4个值则不能成功,显示空白,也不报错
若cellA1_B2.setProperty只传入一个值,则四个单元格都能显示传入的值
求教:如何能正确给四个单元格都赋值?
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());
}
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。