在程序处理中打开一个指定的excel文件(ExcelApp := CreateOleObject('Excel.Application');),用户可以对其编辑,希望在用户关闭excel文件前程序处理sleep,用户关闭excel后再继续后面的程序处理。问题的关键是:1、怎样使程序sleep(暂停);2、怎么知道excel文件关闭了。

解决方案 »

  1.   

    1.功能函数function WinExecAndWait32(FileName:String; Visibility : integer): DWORD;
    var
    zAppName:array[0..512] of char;
    zCurDir:array[0..255] of char;
    WorkDir:String;
    StartupInfo:TStartupInfo;
    ProcessInfo:TProcessInformation;
    begin
    StrPCopy(zAppName,FileName);
    GetDir(0,WorkDir);
    StrPCopy(zCurDir,WorkDir);
    FillChar(StartupInfo,Sizeof(StartupInfo),#0);
    StartupInfo.cb := Sizeof(StartupInfo);
    StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
    StartupInfo.wShowWindow := Visibility;
    if not CreateProcess(
    nil,
    zAppName, { pointer to command line string }
    nil, { pointer to process security attributes }
    nil, { pointer to thread security attributes }
    false, { handle inheritance flag }
    CREATE_NEW_CONSOLE or { creation flags }
    NORMAL_PRIORITY_CLASS,
    nil, { pointer to new environment block }
    nil, { pointer to current directory name }
    StartupInfo, { pointer to STARTUPINFO }
    ProcessInfo { pointer to PROCESS_INF }
    )
    then Result := $FFFFFFFF else begin
    WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
    GetExitCodeProcess(ProcessInfo.hProcess,Result);
    end;
    end;2.使用例程
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     WinExecAndWait32('COMMAND.COM /C COPY C:\AUTOEXEC.BAT D:\',SW_NORMAL);
     showmessage('ok');
    end;3.下载例程4. 补充说明 没翻译完在win32.hlp中输入StartupInfo,CreateProcess自己查看吧.  翻译的Win32API帮助, E文很臭,有误人子弟的地方请参考帮助.
    TStartupInfo一些说明: StartupInfo结构被CreateProcess函数用来指定一个新建立的线程主
    窗口的属性,对于GUI(Graphics User Interface)线程来说,这些信息
    影响CreateWindow函数建立和ShowWindow函数显示的第一个窗口.而对
    控制台程序,这些信息影响线程建立的新的控制台程序.当一个线程建
    立后,能够利用GetStartupInfo函数获取一些StartupInfo的信息.typedef struct _STARTUPINFO { // si 
      DWORD cb;          //指定该结构的大小(字节数)
      LPTSTR lpReserved; //保留.在该结构通过CreateProcess之前,
                         //设置该成员为NULL.
      LPTSTR lpDesktop;  //仅仅Windows NT支持.
      LPTSTR lpTitle;    //对控制台程序来说,lpTitle在新建的控制台程序
                      //窗口标题栏中显示.如果lpTitle=NULL,可执行文
                      //件的名字显示在标题栏中.如果为GUI程序或不建立
                      //新窗口控制台程序,lpTitlel的值一定要设置为Null   DWORD dwX;              //当dwFlags为STARTF_USEPOSITION才起作用.控制窗口
                      //左上角相对屏幕的位置.单位是像素.对GUI程序来说,
                      //新程序调用CreateWindow(参数x=CW_USEDEFAULT)建
                      //立一个OverLap窗口时,首先使用指定的位置.
      DWORD dwY;              //见上.
      DWORD dwXSize;      //当dwFlags为STARTF_USESIZE才起作用.指定窗口的长宽
                      //单位是像素.对GUI程序来说,新程序调用CreateWindow
                      //(参数nWidth=CW_USEDEFAULT)建立一个OverLap窗口时,首先使
                      //用指定的长宽.           
      DWORD dwYSize;     //见上.
      DWORD dwXCountChars; 
      DWORD dwYCountChars; 
      DWORD dwFillAttribute; 
      DWORD dwFlags;  
      WORD wShowWindow; 
      WORD cbReserved2; 
      LPBYTE lpReserved2; 
      HANDLE hStdInput; 
      HANDLE hStdOutput; 
      HANDLE hStdError;  } STARTUPINFO, *LPSTARTUPINFO; /////////////////////////////////////
    TStartupInfo 这个结构中有一个 sShowWindow 栏位, 将之设为 SW_HIDE即可,
    同时, dwFlags 标志中至少需含有 STARTF_USESHOWWINDOW, 否则CreateProcess
    时, sShowWindow 栏位的设定会无效, 以下是修改过的程式:var
       sCommandLine: string;
       bCreateProcess: boolean;
       lpStartupInfo: TStartupInfo;
       lpProcessInformation: TProcessInformation;
    begin
       // sCommandLine 的内容请视您的情况修改
       sCommandLine :='Xcopy d:\temp\temp1\*.* d:\temp\temp2 /v/y';
       lpStartupInfo.dwFlags := STARTF_USESHOWWINDOW;
       lpStartupInfo.wShowWindow := SW_HIDE;
       bCreateProcess := CreateProcess(nil, PChar(sCommandLine),nil,nil,True,
                    HIGH_PRIORITY_CLASS, nil, nil,lpStartupInfo, lpProcessInformation);
       if bCreateProcess then
            WaitForSingleObject(lpProcessInformation.hProcess, INFINITE);
    end;
      

  2.   

    兄弟石菜鸟,还是不明白啊!还是不知道怎样实现:程序打开Excel文件,希望在用户编辑excel文件时程序处理sleep,用户关闭excel后再继续后面的程序处理。Excel文件打开后就不受程序控制了,程序处理没法知道Excel文件的状态了。
      

  3.   

    慢慢看吧
    很久以前别人总结的一篇文章
    DELPHI中EXCEL组件的使用方法:
    一) 使用动态创建的方法
    首先创建 Excel 对象,使用ComObj:
    var ExcelApp: Variant;
    ExcelApp := CreateOleObject( 'Excel.Application' );
    1) 显示当前窗口:
    ExcelApp.Visible := True;
    2) 更改 Excel 标题栏:
    ExcelApp.Caption := '应用程序调用 Microsoft Excel';
    3) 添加新工作簿:
    ExcelApp.WorkBooks.Add;
    4) 打开已存在的工作簿:
    ExcelApp.WorkBooks.Open( 'C:\Excel\Demo.xls' );
    5) 设置第2个工作表为活动工作表:
    ExcelApp.WorkSheets[2].Activate;

    ExcelApp.WorksSheets[ 'Sheet2' ].Activate;
    6) 给单元格赋值:
    ExcelApp.Cells[1,4].Value := '第一行第四列';
    7) 设置指定列的宽度(单位:字符个数),以第一列为例:
    ExcelApp.ActiveSheet.Columns[1].ColumnsWidth := 5;
    8) 设置指定行的高度(单位:磅)(1磅=0.035厘米),以第二行为例:
    ExcelApp.ActiveSheet.Rows[2].RowHeight := 1/0.035; // 1厘米
    9) 在第8行之前插入分页符:
    ExcelApp.WorkSheets[1].Rows.PageBreak := 1;
    10) 在第8列之前删除分页符:
    ExcelApp.ActiveSheet.Columns[4].PageBreak := 0;
    11) 指定边框线宽度:
    ExcelApp.ActiveSheet.Range[ 'B3:D4' ].Borders[2].Weight := 3;
    1-左    2-右   3-顶    4-底   5-斜( \ )     6-斜( / )
    12) 清除第一行第四列单元格公式:
    ExcelApp.ActiveSheet.Cells[1,4].ClearContents;
    13) 设置第一行字体属性:
    ExcelApp.ActiveSheet.Rows[1].Font.Name := '隶书';
    ExcelApp.ActiveSheet.Rows[1].Font.Color  := clBlue;
    ExcelApp.ActiveSheet.Rows[1].Font.Bold   := True;
    ExcelApp.ActiveSheet.Rows[1].Font.UnderLine := True;
    14) 进行页面设置:
    a.页眉:
       ExcelApp.ActiveSheet.PageSetup.CenterHeader := '报表演示';
    b.页脚:
       ExcelApp.ActiveSheet.PageSetup.CenterFooter := '第&P页';
    c.页眉到顶端边距2cm:
       ExcelApp.ActiveSheet.PageSetup.HeaderMargin := 2/0.035;
    d.页脚到底端边距3cm:
       ExcelApp.ActiveSheet.PageSetup.HeaderMargin := 3/0.035;
    e.顶边距2cm:
       ExcelApp.ActiveSheet.PageSetup.TopMargin := 2/0.035;
    f.底边距2cm:
       ExcelApp.ActiveSheet.PageSetup.BottomMargin := 2/0.035;
    g.左边距2cm:
       ExcelApp.ActiveSheet.PageSetup.LeftMargin := 2/0.035;
    h.右边距2cm:
       ExcelApp.ActiveSheet.PageSetup.RightMargin := 2/0.035;
    i.页面水平居中:
       ExcelApp.ActiveSheet.PageSetup.CenterHorizontally := 2/0.035;
    j.页面垂直居中:
       ExcelApp.ActiveSheet.PageSetup.CenterVertically := 2/0.035;
    k.打印单元格网线:
       ExcelApp.ActiveSheet.PageSetup.PrintGridLines := True;
    15) 拷贝操作:
    a.拷贝整个工作表:
       ExcelApp.ActiveSheet.Used.Range.Copy;
    b.拷贝指定区域:
       ExcelApp.ActiveSheet.Range[ 'A1:E2' ].Copy;
    c.从A1位置开始粘贴:
       ExcelApp.ActiveSheet.Range.[ 'A1' ].PasteSpecial;
    d.从文件尾部开始粘贴:
       ExcelApp.ActiveSheet.Range.PasteSpecial;
    16) 插入一行或一列:
    a. ExcelApp.ActiveSheet.Rows[2].Insert;
    b. ExcelApp.ActiveSheet.Columns[1].Insert;
    17) 删除一行或一列:
    a. ExcelApp.ActiveSheet.Rows[2].Delete;
    b. ExcelApp.ActiveSheet.Columns[1].Delete;
    18) 打印预览工作表:
    ExcelApp.ActiveSheet.PrintPreview;
    19) 打印输出工作表:
    ExcelApp.ActiveSheet.PrintOut;
    20) 工作表保存:
    if not ExcelApp.ActiveWorkBook.Saved then
      ExcelApp.ActiveSheet.PrintPreview;
    21) 工作表另存为:
    ExcelApp.SaveAs( 'C:\Excel\Demo1.xls' );
    22) 放弃存盘:
    ExcelApp.ActiveWorkBook.Saved := True;
    23) 关闭工作簿:
    ExcelApp.WorkBooks.Close;
    24) 退出 Excel:
    ExcelApp.Quit;
    (二) 使用Delphi 控件方法
    在Form中分别放入ExcelApplication, ExcelWorkbook和ExcelWorksheet。
    1)  打开Excel
    ExcelApplication1.Connect;
    2) 显示当前窗口:
    ExcelApplication1.Visible[0]:=True;
    3) 更改 Excel 标题栏:
    ExcelApplication1.Caption := '应用程序调用 Microsoft Excel';
    4) 添加新工作簿:
    ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.Add(EmptyParam,0));5) 添加新工作表:
    var Temp_Worksheet: _WorkSheet;
    begin
    Temp_Worksheet:=ExcelWorkbook1.
    WorkSheets.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam,0) as _WorkSheet;
    ExcelWorkSheet1.ConnectTo(Temp_WorkSheet);
    End;6) 打开已存在的工作簿:
    ExcelApplication1.Workbooks.Open (c:\a.xls
    EmptyParam,EmptyParam,EmptyParam,EmptyParam,
    EmptyParam,EmptyParam,EmptyParam,EmptyParam,
       EmptyParam,EmptyParam,EmptyParam,EmptyParam,0)
    7) 设置第2个工作表为活动工作表:
    ExcelApplication1.WorkSheets[2].Activate;  或
    ExcelApplication1.WorksSheets[ 'Sheet2' ].Activate;
    8) 给单元格赋值:
    ExcelApplication1.Cells[1,4].Value := '第一行第四列';
    9) 设置指定列的宽度(单位:字符个数),以第一列为例:
    ExcelApplication1.ActiveSheet.Columns[1].ColumnsWidth := 5;
    10) 设置指定行的高度(单位:磅)(1磅=0.035厘米),以第二行为例:
    ExcelApplication1.ActiveSheet.Rows[2].RowHeight := 1/0.035; // 1厘米
    11) 在第8行之前插入分页符:
    ExcelApplication1.WorkSheets[1].Rows.PageBreak := 1;
    12) 在第8列之前删除分页符:
    ExcelApplication1.ActiveSheet.Columns[4].PageBreak := 0;
    13) 指定边框线宽度:
    ExcelApplication1.ActiveSheet.Range[ 'B3:D4' ].Borders[2].Weight := 3;
    1-左    2-右   3-顶    4-底   5-斜( \ )     6-斜( / )
    14) 清除第一行第四列单元格公式:
    ExcelApplication1.ActiveSheet.Cells[1,4].ClearContents;
    15) 设置第一行字体属性:
    ExcelApplication1.ActiveSheet.Rows[1].Font.Name := '隶书';
    ExcelApplication1.ActiveSheet.Rows[1].Font.Color  := clBlue;
    ExcelApplication1.ActiveSheet.Rows[1].Font.Bold   := True;
    ExcelApplication1.ActiveSheet.Rows[1].Font.UnderLine := True;
    16) 进行页面设置:
    a.页眉:
       ExcelApplication1.ActiveSheet.PageSetup.CenterHeader := '报表演示';
    b.页脚:
       ExcelApplication1.ActiveSheet.PageSetup.CenterFooter := '第&P页';
    c.页眉到顶端边距2cm:
       ExcelApplication1.ActiveSheet.PageSetup.HeaderMargin := 2/0.035;
    d.页脚到底端边距3cm:
       ExcelApplication1.ActiveSheet.PageSetup.HeaderMargin := 3/0.035;
    e.顶边距2cm:
       ExcelApplication1.ActiveSheet.PageSetup.TopMargin := 2/0.035;
    f.底边距2cm:
       ExcelApplication1.ActiveSheet.PageSetup.BottomMargin := 2/0.035;
    g.左边距2cm:
       ExcelApplication1.ActiveSheet.PageSetup.LeftMargin := 2/0.035;
    h.右边距2cm:
       ExcelApplication1.ActiveSheet.PageSetup.RightMargin := 2/0.035;
    i.页面水平居中:
       ExcelApplication1.ActiveSheet.PageSetup.CenterHorizontally := 2/0.035;
    j.页面垂直居中:
       ExcelApplication1.ActiveSheet.PageSetup.CenterVertically := 2/0.035;
    k.打印单元格网线:
       ExcelApplication1.ActiveSheet.PageSetup.PrintGridLines := True;
    17) 拷贝操作:
    a.拷贝整个工作表:
       ExcelApplication1.ActiveSheet.Used.Range.Copy;
    b.拷贝指定区域:
       ExcelApplication1.ActiveSheet.Range[ 'A1:E2' ].Copy;
    c.从A1位置开始粘贴:
       ExcelApplication1.ActiveSheet.Range.[ 'A1' ].PasteSpecial;
    d.从文件尾部开始粘贴:
       ExcelApplication1.ActiveSheet.Range.PasteSpecial;
    18) 插入一行或一列:
    a. ExcelApplication1.ActiveSheet.Rows[2].Insert;
    b. ExcelApplication1.ActiveSheet.Columns[1].Insert;
    19) 删除一行或一列:
    a. ExcelApplication1.ActiveSheet.Rows[2].Delete;
    b. ExcelApplication1.ActiveSheet.Columns[1].Delete;
    20) 打印预览工作表:
    ExcelApplication1.ActiveSheet.PrintPreview;
    21) 打印输出工作表:
    ExcelApplication1.ActiveSheet.PrintOut;
    22) 工作表保存:
    if not ExcelApplication1.ActiveWorkBook.Saved then
      ExcelApplication1.ActiveSheet.PrintPreview;
    23) 工作表另存为:
    ExcelApplication1.SaveAs( 'C:\Excel\Demo1.xls' );
    24) 放弃存盘:
    ExcelApplication1.ActiveWorkBook.Saved := True;
    25) 关闭工作簿:
    ExcelApplication1.WorkBooks.Close;
    26) 退出 Excel:
    ExcelApplication1.Quit;
    ExcelApplication1.Disconnect;
    (三) 使用Delphi 控制Excle二维图
    在Form中分别放入ExcelApplication, ExcelWorkbook和ExcelWorksheet
    var asheet1,achart, range:variant;
    1)选择当第一个工作薄第一个工作表
    asheet1:=ExcelApplication1.Workbooks[1].Worksheets[1];
    2)增加一个二维图
    achart:=asheet1.chartobjects.add(100,100,200,200);
    3)选择二维图的形态
    achart.chart.charttype:=4;
    4)给二维图赋值
    series:=achart.chart.seriescollection;
    range:=sheet1!r2c3:r3c9;
    series.add(range,true);5)加上二维图的标题
    achart.Chart.HasTitle:=True;
    achart.Chart.ChartTitle.Characters.Text:=' Excle二维图'