2010-11-22 85 views
0

我想嵌入一个Excel文件到我的Delphi 5应用程序,所以我可以避免我的用户只是意外删除文件。在Delphi 5中嵌入Excel文件

使用嵌入文件,我使用保存对话框在磁盘上创建它,然后用Excel := CreateOleObject('Excel.Application');方法打开它。我见过如何使用THandles加载资源的例子,但我似乎没有得到它与Excel.WorkBooks.Open(EmbeddedExcelFile);的工作。

你有没有做过这样的事情?你会怎么做?

谢谢!

+1

我不确定你在问什么。你能澄清你的问题吗?现在通过从.exe中提取资源,然后使用CreateOleObject和Open调用在Excel中打开它,它现在能够工作吗?如果是这样,你为什么想要改变。 – RobertFrank 2010-11-22 13:41:11

+0

我从程序中添加数据,据说在用户与表单交互之前,我并不知道如何将资源传递给其他对象。谢谢! – 2010-11-22 15:02:36

回答

5

您必须将该文件包含为资源。假设你有一个blah.xls

与以下内容创建blah.rc文件

blah RCDATA blah.xls 

与资源编译器编译成blah.res

嵌入可执行

{$R 'blah.res'} 

内的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; 

你就必须添加在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'); 
+0

非常感谢!我也在考虑先保存它,但我想不出一种办法,尽管我已经看到了使用Streams的例子。无论如何,谢谢! – 2010-11-22 15:01:13

1

我很确定它不会工作。你必须将文件保存在一个临时文件夹中,修改它,然后做任何你想要的。