开发者社区> 问答> 正文

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

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只传入一个值,则四个单元格都能显示传入的值
求教:如何能正确给四个单元格都赋值?

展开
收起
蛮大人123 2016-05-27 15:49:37 4250 0
2 条回答
写回答
取消 提交回答
  • Sheet的Id你是怎么获取到的。dispIdMember这个值是怎么获取的老哥

    2021-11-18 16:06:24
    赞同 1 展开评论 打赏
  • 我说我不帅他们就打我,还说我虚伪
    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());
        }
    }
    2019-07-17 19:18:05
    赞同 1 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载