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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
基于.NET的Excel开发:单元格区域的操作(读取、赋值、边框和格式)
引用 using Excel = Microsoft.Office.Interop.Excel;   定义 1 Excel.ApplicationClass app; 2 Excel.Workbooks books; 3 Excel.Workbook book; 4 Excel.Sheets sheets; 5 Excel.Worksheet sheet; 6
c# 操作Excel单元格属性
range.NumberFormatLocal = "@";     //设置单元格格式为文本 range = (Range)worksheet.get_Range("A1", "E1");     //获取Excel多个单元格区域:本例做为Excel表头 range.Merge(0);     //单元格合并动作 worksheet.Cells[1, 1] = "Excel单元格赋值"; 
最全的OLE操作Excel的完整代码(2)
/*------------------------------------------------- //目前真正最全的OLE操作Excel的完整代码 //版本:2007.01.15.01 //C++Builder专家组www.3322ee.com原创文章 //转载请保留本版权信息,谢谢合作 -----------------------------------------------
【VBA研究】如何将单元格数据赋给数组
作者:iamlaosong 将工作表中的数据赋给数组或者将数组的数据赋给工作表,一般有两种,一种是循环的方法,一个一个的传,这种方法一般用于需要对每个数据特别处理的场合,另一种是一次性用赋值语句传,就速度来说,第二种方法要快得多。看下面例程: Sub tt()     Dim arr1(240000, 4)     Dim arr2()          lineno = [A1048
/*------------------------------------------------- //目前真正最全的OLE操作Excel的完整代码 //版本:2007.01.15.01 //C+
/*------------------------------------------------- //目前真正最全的OLE操作Excel的完整代码 //版本:2007.01.15.01 //C++Builder专家组www.3322ee.com原创文章 //转载请保留本版权信息,谢谢合作 -----------------------------------------------
一步一步地教你实现OLE读取EXCEL(一)
OLE实现EXCEL读取的动态链接库的具体步骤 1.环境搭建: 我们需要什么环境背景呢?我用的是VS2015 + Microsoft Excel 2015,这里强调一下OLE不能在WPS上进行,因为OLE需要调用微软的基础类库(MFC),所以我们需要用到Excel软件,如果您用的是WPS,请出门右转! 2.具体步骤: 2.1创建工程: 我们要实现一个可以实现excel读取的动态链接库,当
VB 给Excel中的checkbox 所在单元格赋值
需求: Excel 中有多组checkbox复选框,需要把选中的复选框和未选中的复选框标记入库。 如果选中则给1没有选中给所在单元格赋0 先上图: VB : Set myDocument = Worksheets(1) ' 即 Worksheets("Sheet1") Dim i As Integer Debug.Print "co
C# 给Excel快速赋值
如果一个单元格一个单元格的给Excel赋值  速度很慢,可以考虑将值先存在二维数组中 ,然后给Excel的一个区域(Range)赋值,特别是在有很多个Sheet的Excel表格中作用更明显。       object[,] Values = new object[22, 2];     向Values添入所需的值;     worksheet1.get_Range("I4", "J25")
java向Excel固定单元格写入值
package com.test;import java.io.FileInputStream;import java.io.FileOutputStream;import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.usermodel.HSSFRow;import org.apache.poi.hssf.us
使用win32ole操作Excel-2
require 'win32ole' class Engines def time_now initialize @t =Time.now a = @t.to_s.split(" ") s = a[-1].to_s+'-'+"#{@t.mon}"+'-'+a[2].to_s @time_now= s+' '+a[3].to_s #@time_