我使用OleAutomation与 Excel:= CreateOleObject('Excel.Application'); 使用 Excel.Replace 和 Excel.SaveAs 功能。这些功能在我的问题中至关重要,我不能将它们排除在外。另一方面,我必须使用 OleVariant 类型,它具有 no OnCloseEvent 。现在我的问题开始了:
首先是一个小概述:
**procedure OpenExcel begins**
Excel := CreateOleObject('Excel.Application');
//Excel opens a template and replaces placeholders
**procedure OpenExcel end**;
现在Excel已打开,所有占位符都已替换。在这个程序之后,客户可以改变他的表,纠正错误,....正在进行中他想要关闭Excel或保存工作簿。
这里开始我的问题:当客户关闭Excel 时,我想抓住时机。如果他的文档被保存,所有数据(一些字符串,如路径或颜色和整数,如id放在一个对象中)将在OleObject被销毁之前调用另一个名为ELO(文档存档)的程序。但OleObjects无法识别近距离或其他任何东西。
如果有\ Ocx \ Servers \ excel200.pas提供的方法,我查了一下,但我没有找到任何东西。我的同事建议我应该查看office文件夹并搜索excel .tlb文件,但它不存在。
如果上述问题无法解决
如果不可能,有人知道我如何使用 Excel.Replace 和 Excel.SaveAs 与一个具有OnClose事件的对象?
替换的当前代码如下:
//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本身可以处理的命令,如 Excel.Cells.Replace 。
我希望对我的问题的描述足够清楚,我的英语不如我想要的那么好......
提前致谢!
答案 0 :(得分:0)
我只是想告诉你,我没有用后期绑定来解决这个问题,而是用早期绑定来解决这个问题。
对于遇到同样问题的每个人,这是一个可能的解决方案:
uses excel97, excel2000 //order is important
..
var
ExcelApp : TExcelApplication;
ExcelWb: _WorkBook;
ExcelSt: _WorkSheet;
iLCID: Integer;
// 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
);
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;