pppqqq000 2009-08-04 15:32
浏览 484
已采纳

用OLE调用WORD、PowerPoint后,如何向其中插入图片?

大家好:

我在windows下用swt的OLE包调用WORD和POWERPOINT(代码如下),现在想在打开的文档中插入一幅本地图像文件,请问用OLE该怎样实现,谢谢!

//编程环境 Windows XP SP2 + MyEclipse 7.5
//Decorator.java

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.ole.win32.OleClientSite;
import org.eclipse.swt.ole.win32.OleFrame;
import org.eclipse.swt.widgets.*;

public class Decorator extends Composite {

private OleFrame oleFrame; 
private OleClientSite site; 

public Decorator(Composite parent, int style) { 
    super(parent, style);
    try { 
        FillLayout thisLayout = new FillLayout(SWT.HORIZONTAL);  
        this.setLayout(thisLayout); 
        this.setSize(600, 400);  
        oleFrame = new OleFrame(this, SWT.NONE);            
        this.layout();  
    } catch (Exception e) { 
        e.printStackTrace(); 
    }  
} 

/** * @param FileType  Word.Document  PowerPoint.Show.8      */
public boolean create(String FileType)  {
    try { 
        site = new OleClientSite( oleFrame, SWT.NONE, FileType);
        site.doVerb(org.eclipse.swt.ole.win32.OLE.OLEIVERB_SHOW);           
        return true;            
    } catch (org.eclipse.swt.SWTException e) {
        String str = "创建OleClientSite发送错误,原因:" + e.toString(); 
        System.out.println(str); 
        return false; 
    }  
}

public static void main(String[] args){
    Display display = Display.getDefault();
    Shell shell = new Shell();
    shell.setLayout(new FillLayout());      
    shell.setMenuBar(new Menu(shell,SWT.BAR));

    //使用堆栈布局,可以根据需要显示word或powerpoint
    Composite baseComposite = new Composite(shell, SWT.NONE);           
    StackLayout stacklayout = new StackLayout();        
    baseComposite.setLayout(stacklayout);

    //设置承载word和powerpoint的composite的布局
    GridData gridDecorator = new GridData(GridData.FILL_BOTH);
    gridDecorator.heightHint = 600;
    gridDecorator.widthHint = 600;

    //创建powerpoint文档
    Composite powerpointComposite = new Composite(baseComposite, SWT.BORDER);               
    powerpointComposite.setLayout(new GridLayout()); 
    Decorator powerpointdecorator = new Decorator(powerpointComposite, SWT.NONE); 
    powerpointdecorator.setLayoutData(gridDecorator);       
    powerpointdecorator.create("PowerPoint.Show.8");
    powerpointComposite.layout();

    //创建word文档
    Composite wordComposite = new Composite(baseComposite, SWT.BORDER);                     
    wordComposite.setLayout(new GridLayout());  
    Decorator worddecorator = new Decorator(wordComposite, SWT.NONE); 
    worddecorator.setLayoutData(gridDecorator);
    worddecorator.create("Word.Document");
    wordComposite.layout();

    //设置当前显示word文档
    stacklayout.topControl = wordComposite;
    //设置当前显示powerpoint文档,每次只能显示一个
    //stacklayout.topControl = powerpointComposite;

    baseComposite.layout();
    shell.layout();     
    shell.open();
    while(!shell.isDisposed()){
        if(!display.readAndDispatch())
            display.sleep();
        }
    display.close();
}

}

我原来打算用系统剪贴板作中介,先把图像写入进去,然后按Ctrl-v粘贴,实现代码如下:
Transferable trans = new Transferable(){
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[] { DataFlavor.imageFlavor };
}

public boolean isDataFlavorSupported(DataFlavor flavor) {
    return DataFlavor.imageFlavor.equals(flavor);
}

public Object getTransferData(DataFlavor flavor) 
    throws UnsupportedFlavorException, IOException {
    if(isDataFlavorSupported(flavor))
        return Toolkit.getDefaultToolkit().getImage(imagename);
    throw new UnsupportedFlavorException(flavor);
}

};
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans, null);
但是这样只能插入.jpg、.png和.gif格式的图像,别的图像就无能为力了,而且如果图像较大,还会提示java堆栈溢出,无法复制,摆脱各位帮忙,给出个解决方法,不胜感激!!!
[b]问题补充:[/b]
真是不好意思,我是刚刚开始学这个东西,能不能麻烦您说得详细一点,谢谢

  • 写回答

3条回答 默认 最新

  • kimmking 博客专家认证 2009-08-05 12:23
    关注

    可以直接调用word ppt插入图片
    不需要剪贴板


    例如word:
    加载文档后,通过几次
    getIDsOfNames
    getProperty getAutomation()等操作拿到Application,document、range等对象。
    然后通过find或是书签,文本域之类的标记确定要插入的位置Range,
    然后使用InsertAfter等插入文本,
    Range.InlineShapes.AddPicture( im, false,true );命令插入图片。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题