java 通过delphi dll操作excel 无法执行CreateOleObject('Excel.Application')

pricks 2013-06-05 03:00:37
问题描述:
由于excel文档内容非常复杂,通过java 的poi或jxl组件无法成功向excel中插入图片,因此只能考虑通过delphi操作,将其编译成DLL,在使用java调dll完成对excel的操作。
delphi代码如下:

procedure opExcel();
var
vXLS :Variant;
WorkSheet :variant;
begin
vXLS := CreateOleObject('Excel.Application');
Try
vXLS.DisplayAlerts :=false;

vXLS.WorKBooks.Close;
vXLS.WorkBooks.Open( 'd:\123.xls' );

WorkSheet := vXLS.WorKBooks[1].Sheets[1];
WorkSheet.Cells[28,3].Select;
WorkSheet.Pictures.Insert ('D:\1.png');
vXLS.WorKBooks[1].Save;
vXLS.WorKBooks[1].Close;
Finally
if Not Varisempty(vXLS) then vXLS.Quit;
end;
end;


这段代码在delphi中运行毫无问题,但是一旦在java中调用,却发现每次运行到CreateOleObject('Excel.Application')时程序就抛错。
不知这是为何。
注:已经排除java的问题,例如JVM内存不足啥的,都调的很大。
请做过这方面的朋友不吝赐教,不胜感激!
...全文
681 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
pricks 2013-06-05
  • 打赏
  • 举报
回复 1
问题已解决。 为了让以后碰到我这个问题的朋友不至于陷入麻烦,特将解决方案贴出来,大家共勉之: 问题产生的主要原因: 是因为delphi中通过com组件或者delphi自身的servers中的ExcelApplication组件来操作EXCEL文档时,涉及到所谓共享内存,而JAVA调用这个dll时又会自动使用到多线程,如此dll便会在多线程下被调用,导致内存映射出错(这里面的本质原因尚未来得及详细研究,比较复杂,望有高人指点)。 解决方案 在dll中操作com组件的前面加上CoInitialize(nil);,在最后加上CoUninitialize();,更改之后的代码如下:

procedure opExcel();
var
    vXLS :Variant;
    WorkSheet :variant;
begin
    CoInitialize(nil);
    Writeln('come in ');
    vXLS := CreateOleObject('Excel.Application');
    Writeln('come in 1===');
    //vXLS := getactiveoleobject('Excel.Application');
    Try
      vXLS.DisplayAlerts :=false;

      vXLS.WorKBooks.Close;
      vXLS.WorkBooks.Open( 'd:\123.xls' );

      WorkSheet := vXLS.WorKBooks[1].Sheets[1];
      WorkSheet.Cells[28,3].Select;
      WorkSheet.Pictures.Insert ('D:\1.png');
      vXLS.WorKBooks[1].Save;
      vXLS.WorKBooks[1].Close;
    Finally
      if Not Varisempty(vXLS) then vXLS.Quit;
    end;
    CoUninitialize();
end;
另外,若在dll中涉及到ADOQuery等数据库操作,由于这些控件也都属于com组件,因此都需要在程序前后加上一句代码。关于这两句代码的含义究竟如何,大家自己去调研吧,相信你会收获很多
pricks 2013-06-05
  • 打赏
  • 举报
回复
引用 1 楼 xhz8000 的回复:
http://www.linuxidc.com/Linux/2010-10/29454.htm 建议楼主看这篇文章吧!如果你有jni.pas 支持jdk1.7版本的 发一份给我也可以。我也在学习JAVA调用DELPHI的DLL。
谢谢你,不过java与delphi互调的问题我早已研究透了,所以这篇文章不是我想要的。问题重点是为什么delphi通过com组建创建excel对象时,在delphi中能够成功运行,但是被JAVA调用时却报错? 另外,我的JNI.PAS也是1.6的,没有1.7的呵呵
xhz8000 2013-06-05
  • 打赏
  • 举报
回复
要不然楼主用C编写DLL吧,JAVA对C的dll支持的比较好!
xhz8000 2013-06-05
  • 打赏
  • 举报
回复
http://www.linuxidc.com/Linux/2010-10/29454.htm 建议楼主看这篇文章吧!如果你有jni.pas 支持jdk1.7版本的 发一份给我也可以。我也在学习JAVA调用DELPHI的DLL。

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧