起步软件技术论坛-X3

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: roice

【结贴】[请求] 关于导入EXCEL 的2个问题**

[复制链接]
发表于 2008-12-23 16:56:34 | 显示全部楼层
unit MainForm;

interface

uses
  Business.System, Business.Forms,System;

type
  TMainForm = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    OpenDialog1: TOpenDialog;
    Button4: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    {private declarations}
  public
    {public declarations}
    Fxls , docsbject;
        FApp,FDocs ispatchHelper;
  end;

implementation


procedure TMainForm.Button1Click(Sender: TObject);
var
  lFileName: String;
begin
  if OpenDialog1.Execute then
  begin
    lFileName := OpenDialog1.FileName;
    fxls := ComObj.CreateOleObject('Excel.Application');
    FApp := DispatchHelper.Create(fxls);
    FApp.PropertyPut('Visible', [True]);

    docs := FApp.PropertyGet('Workbooks',  []);
    FDocs := DispatchHelper.Create(docs);

    FDocs.InvokeMethod('Open', [lFileName]);
    end;
end;

procedure TMainForm.Button2Click(Sender: TObject);
begin
//fapp.InvokeMethod('save', []);
  fapp.InvokeMethod('quit', []);
  (docs as System.IDisposable).Dispose;

  (fxls as System.IDisposable).Dispose;

end;


procedure TMainForm.Button4Click(Sender: TObject);
var
  sheets,sheet: DispatchHelper;
  tmp,tmp1:Object;
  i:integer;
begin
     {
     For i = 1 To Sheets.Count
           strSheetName = Sheets(i).Name
           Next i
     }
     memo1.Clear;
     sheets := DispatchHelper.Create(FApp.PropertyGet('Sheets', []));//属性和对象
     tmp:=sheets.PropertyGet('Count',[]);

     Memo1.Lines.Add(objecthelper.ToString(tmp));
     for i:=1 to  objecthelper.ToInt(tmp) do
     begin
       sheet:=DispatchHelper.Create(sheets.PropertyGet('item', ));//属性和对象
       tmp1:=sheet.PropertyGet('Name',[]);
       Memo1.Lines.Add(objecthelper.ToString(tmp1));
     end;
end;

end.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-12-24 09:46:30 | 显示全部楼层
非常感谢Lixy,不过上面代码有点问题,下面是修改后实现的代码:

procedure TFLXZ.btnSelectClick(Sender: TObject);
var
   oOpenDialog:TOpenDialog;
   i: integer;
   strSheetNames : TStringList;
   strTemp: string;

   sheets,sheet: System.DispatchHelper;
   tmp,tmp1:Object;
begin
   oOpenDialog:=TOpenDialog.Create(nil);
   oOpenDialog.Filter:='excel文件(*.xls)|*.xls|all Files (*.*)|*.*';
   oOpenDialog.FilterIndex:=0;
   if  oOpenDialog.Execute then
   begin
    FFileName:=oOpenDialog.FileName;
    edtFileName.Text:=FFileName;

    Fxls := ComObj.CreateOleObject('Excel.Application');
    FApp := System.DispatchHelper.Create(fxls);
    FApp.PropertyPut('Visible', [True]);

    docs := FApp.PropertyGet('Workbooks',[]);
    FDocs := System.DispatchHelper.Create(docs);
    FDocs.InvokeMethod('Open',[FFileName]);

    sheets := System.DispatchHelper.Create(FApp.PropertyGet('Sheets', []));//属性和对象
    tmp:=sheets.PropertyGet('Count',[]);
    strSheetNames := TStringList.Create; //初始化
    for i:=1 to  objecthelper.ToInt(tmp) do
    begin
      sheet:=System.DispatchHelper.Create(sheets.PropertyGet('item', ));//属性和对象
      tmp1:=sheet.PropertyGet('Name',[]);
      strTemp := objecthelper.ToString(tmp1);
      strSheetNames.Add(strTemp);
    end;

    //释放接口对象,这里有问题,始终无法终止进程
    Fapp.InvokeMethod('quit', []);
    (docs as System.IDisposable).Dispose;
    (fxls as System.IDisposable).Dispose;
    // 在下拉框中显示所有的SHEET表
    edtSheetName.Items := strSheetNames;
   end;
end;

遗留问题是无法终止进程,参考帖子 http://bbs.justep.com/forum.php?mod=viewthread&tid=26086 和这个帖子楼主一样现象。
回复 支持 反对

使用道具 举报

发表于 2008-12-24 10:09:17 | 显示全部楼层
(tmp as System.IDisposable).Dispose;
    (tmp1 as System.IDisposable).Dispose;
也要加上,我写的代码忘记了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-12-24 10:46:26 | 显示全部楼层
编译能通过,运行报错,不能将System.Int32转换成为System.IDisposable:

结束excel报错.jpg

45.87 KB, 下载次数: 164

回复 支持 反对

使用道具 举报

发表于 2008-12-24 10:59:36 | 显示全部楼层
我是按照我的例子写的,我的tmp,tmp1:Object;是这样定义的。
也就是所有的object的对象都必须释放。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-12-24 11:04:25 | 显示全部楼层
12楼代码的tmp 和tmp1 定义和11楼是一样的:

procedure TFLXZ.btnSelectClick(Sender: TObject);
var
   oOpenDialog:TOpenDialog;
   i: integer;
   strSheetNames : TStringList;
   strTemp: string;

   sheets,sheet: System.DispatchHelper;
  tmp,tmp1:Object;

按CREATE 的顺序,是不是释放也需要按顺序释放?
先 释放 sheets,sheet:
   sheets.InvokeMethod('quit', []);  // 有报错
   sheet.InvokeMethod('quit', []);   // 报错
然后释放FApp,FDocs:
   FApp.InvokeMethod('quit', []);
   FDocs.InvokeMethod('quit', []);  // 报错
最后释放 Object:
   (tmp as System.IDisposable).Dispose;  // 报错
   (tmp1 as System.IDisposable).Dispose; // 报错
   (docs as System.IDisposable).Dispose;
   (fxls as System.IDisposable).Dispose;
回复 支持 反对

使用道具 举报

发表于 2008-12-24 11:28:42 | 显示全部楼层
unit MainForm;

interface

uses
  Business.System, Business.Forms,System;

type
  TMainForm = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    OpenDialog1: TOpenDialog;
    GroupBox1: TGroupBox;
    Button4: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    {private declarations}
  public
    {public declarations}
    Fxls , docsbject;
        FApp,FDocs ispatchHelper;
  end;

implementation


procedure TMainForm.Button1Click(Sender: TObject);
var
  lFileName: String;
begin
  if OpenDialog1.Execute then
  begin
    lFileName := OpenDialog1.FileName;
    fxls := ComObj.CreateOleObject('Excel.Application');
    FApp := DispatchHelper.Create(fxls);
    FApp.PropertyPut('Visible', [True]);

    docs := FApp.PropertyGet('Workbooks',  []);
    FDocs := DispatchHelper.Create(docs);

    FDocs.InvokeMethod('Open', [lFileName]);
    end;
end;

procedure TMainForm.Button2Click(Sender: TObject);
begin
//fapp.InvokeMethod('save', []);
  fapp.InvokeMethod('quit', []);
  (docs as System.IDisposable).Dispose;

  (fxls as System.IDisposable).Dispose;

end;

procedure TMainForm.Button3Click(Sender: TObject);
var
Range,aw: DispatchHelper;
o1,o2bject;
begin
//Range("A3:F3").Select
//ActiveWindow.FreezePanes = True
o1:= FApp.PropertyGet('Range', ['A3:F3']);
  Range := DispatchHelper.Create(o1);//属性和对象
  Range.InvokeMethod('Select',[]);   //事件
o2:= FApp.PropertyGet('ActiveWindow', []);
  aw:=DispatchHelper.Create(o2);//属性和对象
  aw.PropertyPut('FreezePanes',[true]);
  (o1 as System.IDisposable).Dispose;
  (o2 as System.IDisposable).Dispose;
end;


procedure TMainForm.Button4Click(Sender: TObject);
var
  sheets,sheet: DispatchHelper;
  o1, o2, tmp,tmp1:Object;
  i:integer;
begin
     {
     For i = 1 To Sheets.Count
           strSheetName = Sheets(i).Name
           Next i
     }
     memo1.Clear;
     o1 := FApp.PropertyGet('Sheets', []);
     sheets := DispatchHelper.Create(o1);//属性和对象
     tmp:=sheets.PropertyGet('Count',[]);

     Memo1.Lines.Add(objecthelper.ToString(tmp));
     for i:=1 to  objecthelper.ToInt(tmp) do
     begin
       o2 := sheets.PropertyGet('item', );
       sheet:=DispatchHelper.Create(o2);//属性和对象
       tmp1:=sheet.PropertyGet('Name',[]);
       Memo1.Lines.Add(objecthelper.ToString(tmp1));
       (o2 as System.IDisposable).Dispose;
     end;
    (o1 as System.IDisposable).Dispose;
end;
回复 支持 反对

使用道具 举报

发表于 2008-12-24 13:40:51 | 显示全部楼层
为什么不用我原来上传的ExcelApp控件呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-12-24 13:49:00 | 显示全部楼层
最初由 amao800613 发布
[B]为什么不用我原来上传的ExcelApp控件呢? [/B]


没有找到可下载的ExcelApp控件,另外现在的版本是3012。

17楼 Lixy 提供的代码解决问题了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-28 20:19 , Processed in 0.042261 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表