Java SWT操作Excel(OLE),如何给单元格区域赋值?-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

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

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

取消 提交回答
全部回答(2)
  • 游客xtojcgr6iyfpq
    2021-11-18 16:06:24

    Sheet的Id你是怎么获取到的。dispIdMember这个值是怎么获取的老哥

    1 0
  • 蛮大人123
    2019-07-17 19:18:05
    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());
        }
    }
    1 0
添加回答
相关问答

42

回答

[@徐雷frank][¥20]什么是JAVA的平台无关性

大河人家 2018-10-29 23:55:20 147399浏览量 回答数 42

170

回答

惊喜翻倍:免费ECS+免费环境配置~!(ECS免费体验6个月活动3月31日结束)

豆妹 2014-10-29 17:52:21 233732浏览量 回答数 170

8

回答

OceanBase 使用动画(持续更新)

mq4096 2019-02-20 17:16:36 341316浏览量 回答数 8

13

回答

[@饭娱咖啡][¥20]我想知道 Java 关于引用那一块的知识

心意乱 2018-10-31 18:44:12 143630浏览量 回答数 13

119

回答

OSS存储服务-客户端工具

newegg11 2012-05-17 15:37:18 302538浏览量 回答数 119

22

回答

爬虫数据管理【问答合集】

我是管理员 2018-08-10 16:37:41 148934浏览量 回答数 22

24

回答

阿里云开放端口权限

xcxx 2016-07-20 15:03:33 660263浏览量 回答数 24

31

回答

[@倚贤][¥20]刚学完html/css/js的新手学习servlet、jsp需要注意哪些问题?

弗洛伊德6 2018-10-27 21:52:43 148001浏览量 回答数 31

43

回答

【精品问答集锦】Python热门问题

小六码奴 2019-05-30 15:27:34 144284浏览量 回答数 43

295

回答

Linux Bash严重漏洞修复紧急通知(已全部给出最终修复方案)

qilu 2014-09-25 13:26:50 438411浏览量 回答数 295
+关注
蛮大人123
我说我不帅他们就打我,还说我虚伪
0
文章
7733
问答
问答排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载