2 service96 service96 于 2016.01.30 13:43 提问

Java SWT操作Excel(OLE),如何给单元格区域赋值?

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();
    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只传入一个值,则四个单元格都能显示传入的值

        **求教:如何能正确给四个单元格都赋值?**

附上所用SWT的OLE包 API地址:
http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fswt%2Fole%2Fwin32%2Fpackage-summary.html&cp=2_1_0_182

所采用getProperty、setProperty方法在OleAutomation类里

1个回答

devmiao
devmiao   Ds   Rxr 2016.01.31 07:07
service96
service96 你发这个连接 好像本来就是这个例子,没解决单元格区域赋值的问题!
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!