大家好:
我在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]
真是不好意思,我是刚刚开始学这个东西,能不能麻烦您说得详细一点,谢谢