在delphi5中嵌入Excel文件
我正在尝试将一个Excel文件嵌入到我的Delphi5应用程序中,这样我就可以避免我的用户只是意外删除该文件 使用嵌入的文件,我用一个保存对话框在磁盘上创建它,然后用在delphi5中嵌入Excel文件,delphi,excel,embed,Delphi,Excel,Embed,我正在尝试将一个Excel文件嵌入到我的Delphi5应用程序中,这样我就可以避免我的用户只是意外删除该文件 使用嵌入的文件,我用一个保存对话框在磁盘上创建它,然后用Excel:=CreateOleObject('Excel.Application')打开它方法。我已经看到了关于如何使用THandles加载资源的示例,但我似乎没有让它与Excel.WorkBooks.Open(EmbeddedExcelFile)一起工作 你以前做过这样的事吗?你会怎么做 谢谢 我很肯定它不会起作用。你必须将文件
Excel:=CreateOleObject('Excel.Application')打开它代码>方法。我已经看到了关于如何使用THandles加载资源的示例,但我似乎没有让它与Excel.WorkBooks.Open(EmbeddedExcelFile)一起工作代码>
你以前做过这样的事吗?你会怎么做
谢谢 我很肯定它不会起作用。你必须将文件保存在临时文件夹中,修改它,然后做任何你想做的事情。我确信它不会工作。您必须将文件保存在临时文件夹中,对其进行更改,然后执行任何您想执行的操作。您必须将该文件作为资源包含在内。假设你有一个blah.xls
创建一个包含以下内容的blah.rc
文件
blah RCDATA blah.xls
使用资源编译器将其编译为blah.res
将RES文件嵌入到可执行文件中
{$R 'blah.res'}
在应用程序代码中,提取文件并使用此代码运行它
procedure ExtractAndRun(resourceID:string; resourceFn:string);
var
resourceStream: TResourceStream;
fileStream: TFileStream;
tempPath: string;
fullFileName: string;
begin
tempPath:=GetTempDir;
FullFilename:=TempPath+'\'+resourceFN;
if not FileExists(FullFilename) then
begin
resourceStream := TResourceStream.Create(hInstance, resourceID, RT_RCDATA);
try
fileStream := TFileStream.Create(FullFilename, fmCreate);
try
fileStream.CopyFrom(resourceStream, 0);
finally
fileStream.Free;
end;
finally
resourceStream.Free;
end;
end;
ShellExecute(0,'open', pchar(FullFilename), nil, nil, SW_SHOWNORMAL);
end;
您必须在uses子句中添加ShellApi
也许您需要这个GetTempDir函数
function GetTempDir: string;
var
Buffer: array[0..MAX_PATH] of char;
begin
GetTempPath(SizeOf(Buffer) - 1, Buffer);
result := StrPas(Buffer);
end;
像这样调用函数
extractAndRun('blah','blah.xls');
您必须将该文件作为资源包含在内。假设你有一个blah.xls
创建一个包含以下内容的blah.rc
文件
blah RCDATA blah.xls
使用资源编译器将其编译为blah.res
将RES文件嵌入到可执行文件中
{$R 'blah.res'}
在应用程序代码中,提取文件并使用此代码运行它
procedure ExtractAndRun(resourceID:string; resourceFn:string);
var
resourceStream: TResourceStream;
fileStream: TFileStream;
tempPath: string;
fullFileName: string;
begin
tempPath:=GetTempDir;
FullFilename:=TempPath+'\'+resourceFN;
if not FileExists(FullFilename) then
begin
resourceStream := TResourceStream.Create(hInstance, resourceID, RT_RCDATA);
try
fileStream := TFileStream.Create(FullFilename, fmCreate);
try
fileStream.CopyFrom(resourceStream, 0);
finally
fileStream.Free;
end;
finally
resourceStream.Free;
end;
end;
ShellExecute(0,'open', pchar(FullFilename), nil, nil, SW_SHOWNORMAL);
end;
您必须在uses子句中添加ShellApi
也许您需要这个GetTempDir函数
function GetTempDir: string;
var
Buffer: array[0..MAX_PATH] of char;
begin
GetTempPath(SizeOf(Buffer) - 1, Buffer);
result := StrPas(Buffer);
end;
像这样调用函数
extractAndRun('blah','blah.xls');
我不知道你在问什么。你能澄清你的问题吗?通过从.exe中提取资源,然后使用CreateOleObject和Open调用在Excel中打开它,现在是否可以正常工作?如果是这样,为什么要进行更改。我从程序中添加数据,假设是在用户与工作表交互之前,但我真的不知道如何将资源传递给其他对象。谢谢我不知道你在问什么。你能澄清你的问题吗?通过从.exe中提取资源,然后使用CreateOleObject和Open调用在Excel中打开它,现在是否可以正常工作?如果是这样,为什么要进行更改。我从程序中添加数据,假设是在用户与工作表交互之前,但我真的不知道如何将资源传递给其他对象。谢谢非常感谢你!我也在考虑先保存它,但我想不出一种方法来实现它,尽管我已经看到了使用流的例子。无论如何,谢谢!非常感谢你!我也在考虑先保存它,但我想不出一种方法来实现它,尽管我已经看到了使用流的例子。无论如何,谢谢!