2

私はExcelでOleAutomationを使用しています:= CreateOleObject('Excel.Application'); 関数Excel.ReplaceおよびExcel.SaveAsを使用します。これらの関数は私の問題に不可欠であり、除外することはできません。一方、OnCloseEvent を持たないOleVariant型を使用する必要があります。今私の問題が始まります:


最初に簡単な概要:

**procedure OpenExcel begins**

Excel := CreateOleObject('Excel.Application'); 
//Excel opens a template and replaces placeholders 

**procedure OpenExcel end**;

これで、すべてのプレースホルダーが置き換えられた状態で Excel が開きます。この手順の後、クライアントは自分のシートを変更したり、間違いを修正したりできます.. 進行中、彼は Excel を閉じるか、ワークブックを保存したいと考えています。


そして、ここから私の問題が始まります。クライアントが Excel を閉じる瞬間を捉えたいのです。彼のドキュメントが保存されると、OleObject が破棄される前に、すべてのデータ (オブジェクトに配置されたパスや色などの文字列や ID などの整数) が ELO (ドキュメント アーカイブ) という名前の別のプログラムにコミットされます。しかし、OleObjects は終了などを認識できません。


この問題を解決する回避策はありますか? おそらく、オブジェクトを OleObject またはプロセス自体にリンクして、Excel がクライアントによって閉じられたタイミングを判断しますか?

\Ocx\Servers\excel200.pas によって提供される方法があるかどうか調べましたが、何も見つかりませんでした。私の同僚は、オフィス フォルダを調べて、Excel の .tlb ファイルを検索するように勧めましたが、存在しません。


上記の問題が解決できない場合


これが不可能な場合、OnClose イベントを持つオブジェクトでExcel.ReplaceExcel.SaveAsを使用する方法を知っている人はいますか?

交換用の私の現在のコードは次のとおりです。

//for all sheets in the workbook
for iSheet := 1 to Excel.Worksheets.Count do
begin

  //activate the sheet
  Excel.Worksheets[iSheet].Activate;

  // this will be..
  sWhat := %First String%;  
  //..replaced by..
  sReplacement := %Second String%;

  // warnings off (override message or if excel didn't find a sWhat)
  Excel.Application.DisplayAlerts := False;

  Excel.Cells.Replace(
    What          := sWhat,
    Replacement   := sReplacement,
    LookAt        := xlWhole,
    SearchOrder   := xlByRows,
    MatchCase     := False,
    SearchFormat  := False,
    ReplaceFormat := False
  );

  //warnings on
  Excel.Application.DisplayAlerts := True;
end;

SaveAs メソッドも同様です。Excel.Cells.Replaceのように、Excel 自体が処理できるコマンドを送信するだけです。

私の問題の説明が十分に明確であることを願っています.私の英語は私が望むほど上手ではありません..

前もって感謝します!

4

1 に答える 1

0

この問題を遅延バインディングではなく、早期バインディングで解決したことを伝えたかっただけです。

同じ問題を抱えているすべての人にとって、可能な解決策は次のとおりです。

uses excel97, excel2000 //order is important
..
var
  ExcelApp : TExcelApplication;
  ExcelWb: _WorkBook;
  ExcelSt: _WorkSheet;
  iLCID: Integer;

Excel を開き、ファイルを読み込み、シートをアクティブにして、OnWorkbookBeforeClose メソッドに接続します。

  // open excel
  iLCID := GetUserDefaultLCID;

  // create and connect excelapplication
  ExcelApp := TExcelApplication.Create(self);
  ExcelApp.Connect;

  // load file
  ExcelWb := ExcelApp.Workbooks.Open(
    ExtractFilePath(ParamStr(0))+'test.xlsx',
    emptyParam, emptyParam, emptyParam, emptyParam,
    emptyParam, emptyParam, emptyParam, emptyParam,
    emptyParam, emptyParam, emptyParam, emptyParam,
    iLCID
  );

  // Visible - off
  ExcelApp.Application.Visible[0] := false;

  // Starts excel on the first sheet
  ExcelSt := ExcelWb.Sheets[1] as _WorkSheet;
  ExcelSt.Activate(iLCID);

  // Visible - on
  ExcelApp.Application.Visible[0] := true;

  // Connect to the closemethod
  ExcelApp.OnWorkbookBeforeClose := WorkbookBeforeClose;

何かを置き換える

var
  sWhat, sReplacement : String;
  iSheets : Integer;
begin

  // basic data
  sWhat := **STRING 1**;
  sReplacement := **STRING 2**;

  // Warnings off (Overridewarning)
  ExcelApp.Application.DisplayAlerts[iLCID] := False;

  // Replace for all sheets in a workbook
  for iSheets := 1 to ExcelApp.Application.Sheets.Get_Count do
  begin
    ExcelSt := ExcelWb.Sheets[iSheets] as _WorkSheet;
    ExcelSt.Activate(iLCID);

    ExcelApp.Application.ActiveWorkbook.Application.Cells.Replace(
      {What} sWhat,
      {Replacement} sReplacement,
      {LookAt} xlWhole,
      {SearchOrder} xlByRows,
      {MatchCase} False,
      {MatchByte} False
      );

   end;

  // warnings on
  ExcelApp.Application.DisplayAlerts[iLCID] := True;

作業を保存する

var
  oFileName, oFileFormat : OleVariant;
begin

  {
  Value = Constant in excel (Description)
  ------------------------------------------------------------------------------
  50   = xlExcel12 (Excel Binary Workbook 2007+ with or without macros, xlsb)
  51   = xlOpenXMLWorkbook (without macros Excel 2007+, xlsx)
  52   = xlOpenXMLWorkbookMacroEnabled (with or without macros Excel 2007+, xlsm)
  56   = xlExcel8 (97-2003 Format in Excel 2007-2010, xls)
         !!! in 2003 = xlNormal !!! 
  ------------------------------------------------------------------------------
  }

  oFileName   := 'Filename';
  oFileFormat := 50;
  iLCID       := GetUserDefaultLCID;

  ExcelApp.Application.ActiveWorkbook.SaveAs(
    {Filename} oFileName,
    {FileFormat} oFileFormat,
    {Password} emptyParam,
    {WriteResPassword} emptyParam,
    {ReadOnlyRecommended} false,
    {CreateBackup} false,
    {AccessMode} 0,
    {ConflictResolution} false,
    {AddToMru} false,
    {TextCodepage} false,
    {TextVisualLayout} false,
    {LCID} iLCID
    );

BeforeClose メソッド

 procedure WorkbookBeforeClose(Sender: TObject;
   var Wb, Cancel: OleVariant);
 var
   oTrue :OleVariant;
 begin

   ExcelApp.Application.Visible[0] := false;

   //Here comes your stuff when the user wants to quit excel

   oTrue := true;
   Cancel := oTrue;

   ExcelApp.Quit;
 end;

これが、同様の問題に遭遇した一部の人々に役立つことを願っています:)

于 2012-11-13T13:00:13.590 に答える