求助,TWebBrowser 如何实现Excel文件的自动保存

lf 2011-08-10 02:25:20
各位大侠,本人做java的,对Delphi一知半解。

事情是这样的,A项目 要用到B项目的数据,但是B项目不提供任何接口。所以只能想其他办法解决。

我们的思路是:
1,用DELPHI作一采集程序,里边包含TWebBrowser组件。
2,这个程序定时打开 B项目,并且自动登录(已经实现)
3,自动点击B项目的查询功能查询结果(已经实现)
4,自动点击“导出”按钮,实现Excel文件的下载。

如果能下载到Excel格式的文件,后边的事情就简单了。

现在的问题是,点击了“导出”按钮后,TWebBrowser会弹出文件保存对话框。。。

请教各位大侠,这个问题怎么解决。


我们现在有以下两种思路
第一种方式:TWebBrowser 检测到资源类型是Excel后自动保存,从而跳过文件保存对话框。
第二种方式:当文件保存对话框出现后,模拟点击保存按钮。


不知可行不可行,还望各位大大指正。

...全文
142 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hzakao 2011-08-15
  • 打赏
  • 举报
回复
前两天刚做过这个,实际上是要截取哪个对话框,然后取得那个execl文件地址。
我的解决方法是另外做一个下载管理程序(com)。
com代码贴给你;

unit CIEDownload;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
Windows, ActiveX, Classes, ComObj, IEDown_TLB, StdVcl,SysUtils,Dialogs;

type
PBindInfo = ^TBindInfo;
_tagBINDINFO = packed record
cbSize: ULONG;
szExtraInfo: LPWSTR;
stgmedData: TStgMedium;
grfBindInfoF: DWORD;
dwBindVerb: DWORD;
szCustomVerb: LPWSTR;
cbstgmedData: DWORD;
dwOptions: DWORD;
dwOptionsFlags: DWORD;
dwCodePage: DWORD;
securityAttributes: TSecurityAttributes;
iid: TGUID;
pUnk: IUnknown;
dwReserved: DWORD;
end;

TBindInfo = _tagBINDINFO;
BINDINFO = _tagBINDINFO;
IDownloadManager = interface(IUnknown)
['{988934A4-064B-11D3-BB80-00104B35E7F9}']
function Download(pmk: IMoniker;
pbc: IBindCtx;
dwBindVerb: DWORD;
grfBINDF: DWORD;
pBindInfo: PBindInfo;
pszHeaders: PWidechar;
pszRedir: PWidechar;
uiCP: UINT): HRESULT; stdcall;
end;

TIEDownload = class(TComObject, IDownloadManager, ITIEDownload)
protected function Download(pmk: IMoniker;
pbc: IBindCtx;
dwBindVerb: DWORD;
grfBINDF: DWORD;
pBindInfo: PBindInfo;
pszHeaders: PWidechar;
pszRedir: PWidechar;
uiCP: UINT): HRESULT; stdcall;
end;

type
TIEDownloadFactory = class(TComObjectFactory)
public
procedure UpdateRegistry(Register: Boolean); override;
end;

implementation

uses ComServ;

function TIEDownload.Download(pmk: IMoniker;
pbc: IBindCtx;
dwBindVerb,grfBINDF: DWORD;
pBindInfo: PBindInfo;
pszHeaders, pszRedir: PWidechar;
uiCP: UINT): HRESULT;
var
PUrl: PWidechar;
Url:string;
sHeader:string;
begin
pmk.GetDisplayName(pbc, nil, PUrl);
Url:=Trim(LowerCase(WideCharToString(PUrl)));
sHeader:=Trim(LowerCase(WideCharToString(pszHeaders)));
//禁止下载avi和mpg文件
//查找采集进程,获得句柄,然后发消息给它,查找不到就不处理;

// if (Pos('.avi', Url)=(Length(Url)-3)) or (Pos('.mpg', Url)=(Length(Url)-3))then
// begin
ShowMessage(sHeader+#13#10+url);
// Result:=S_OK;
// end else Result := E_NOTIMPL;
end;

procedure DeleteRegKeyValue(Root: DWORD; Key: string; ValueName: string = '');
var
KeyHandle: HKEY;
begin
if ValueName = '' then
RegDeleteKey(Root, PChar(Key));
if RegOpenKey(Root, PChar(Key), KeyHandle) = ERROR_SUCCESS then
try
RegDeleteValue(KeyHandle, PChar(ValueName));
finally
RegCloseKey(KeyHandle);
end;
end;

procedure CreateRegKeyValue(Root: DWORD; const Key, ValueName, Value: string);
var
Handle: HKey;
Status, Disposition: Integer;
begin
Status := RegCreateKeyEx(ROOT, PChar(Key), 0, '',
REG_OPTION_NON_VOLATILE, KEY_READ or KEY_WRITE, nil, Handle,
@Disposition);
if Status = 0 then
begin
Status := RegSetValueEx(Handle, PChar(ValueName), 0, REG_SZ,
PChar(Value), Length(Value) + 1);
RegCloseKey(Handle);
end;
// if Status <> 0 then
// raise EOleRegistrationError.CreateRes(@SCreateRegKeyError);
end;



procedure TIEDownloadFactory.UpdateRegistry(Register: Boolean);
begin
inherited;
if Register then
CreateRegKeyValue(HKEY_CURRENT_USER, 'Software\Microsoft\Internet Explorer','DownloadUI', GuidToString(ClassId))
else
DeleteRegKeyValue(HKEY_CURRENT_USER, 'Software\Microsoft\Internet Explorer','DownloadUI');
end;

initialization
TIEDownloadFactory.Create(ComServer, TIEDownload, Class_TIEDownload,
'TIEDownload', '', ciMultiInstance, tmApartment);

end.
lf 2011-08-10
  • 打赏
  • 举报
回复
现在是用Delphi已经把这个采集程序的框架做好了,能实现自动登录和自动点击网页上的“导出按钮”。

主要是下边两种方式的实现公司没人能写。。。
第一种方式:TWebBrowser 检测到资源类型是Excel后自动保存,从而跳过文件保存对话框。
第二种方式:当文件保存对话框出现后,模拟点击保存按钮。

还望各位大大指点一二,最好能给出一点示例代码。小弟不胜感激~
lf 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 shijies 的回复:]
感觉可行,试一试吧。
[/Quote]

主要是用代码怎么实现呢,我们公司都是做JAVA的,对Delphi都不太懂。
shijies 2011-08-10
  • 打赏
  • 举报
回复
感觉可行,试一试吧。

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧