问题如下:
1.win-form 程序访问一个网页(别人网站上的网页)
2.网页上有个按钮名称为(点击下载excel)
3.程序模拟点击事件
4.页面会弹出excel
5.保存此excel到本地文件夹中
或者说是 我访问一个url 这个页面会直接弹出一个excel 我怎样把这个excel存到本地的文件夹中
用模拟软件
看一下页面的源代码,应该是可以直接找到excel的具体地址的,然后直接去下载那个文件
excel是从页面输出来的 并不是已经保存在服务器上的 是临时生成的
@lbaichun: 那几用模拟表单提交的方式
http://www.cnblogs.com/changyou/archive/2010/01/09/1643166.html
如果已经知道URL了,直接下载不就可以了
new System.Net.WebClient().DownloadFile(url, file);
直接下载到本地文件夹不就行了
如果有很多像这样,页面上带excel下载地址的网页,最好按照如下步骤进行;
1.弄清楚带excel下载地址的网页的url有什么规则,或则你怎样才能得到这些链接。
2.得到这些链接后,用c#里的 HttpWebRequest模拟发送GET或则POST请求,得到这些包含excel下载地址的页面的内容(即html源码)
3.针对这些源码,书写正则表达式,使程序能自动才从html源码中匹配出excel的下载地址。
4.得到下载地址之后,再用DownloadFile下载文件。
如果在第3步时,不能顺利得到excel下载地址,则极有可能是点击按钮后网页向后台发送了Ajax请求,由Ajax请求返回下载地址,那么这时候,你最好有个http请求的分析工具,chrome里自带了(ctrl+shift+J),我更喜欢用firefox中的一个插件叫 Live Http Headers(https://addons.mozilla.org/zh-cn/firefox/addon/live-http-headers/),可以很方便分析出点击按钮后都像后台发送了哪些请求,这些请求都携带了什么参数回去,返回了什么内容。这样你便能确定哪些请求是用来获得excel地址的,用c#里的HttpWebRequest模拟发送这些请求,并且参数和Cookie也和你在Live Http headers里看到的一样就行了。通过这种方式获得excel下载地址,再进行第四步。
这有一篇httpWebRequest的代码示例(http://www.cnblogs.com/QQ544952425/archive/2012/07/09/2582309.html),想了解更多就在园子里搜索吧,“网络爬虫”,“WebRequest”,"正则表达式"。
要是有个带excel的网页示例最好了,可以看看你遇到的是哪部分的问题,一块帮你解决了你就明白这个过程了。
把地址贴上来看看
有两种方法,我只介绍一种兼容所有浏览器的方法!看源码你就懂:
string fileName = string.Format("temp\\{0}.doc", Session.SessionID); if (System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(Server.MapPath(fileName))) == false) { System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(Server.MapPath(fileName))); } foreach (string s in System.IO.Directory.GetFiles(System.IO.Path.GetDirectoryName(Server.MapPath(fileName)))) { System.IO.FileInfo fi = new FileInfo(s); if (( DateTime.Now- fi.CreationTime).TotalMinutes > 10) { try { fi.Delete(); } catch { } } System.IO.File.Delete(s); } System.IO.FileStream fs = new System.IO.FileStream(Server.MapPath(fileName), System.IO.FileMode.CreateNew, System.IO.FileAccess.Write); fs.Write(System.Text.ASCIIEncoding.UTF8.GetBytes(strMain), 0, System.Text.ASCIIEncoding.UTF8.GetByteCount(strMain)); fs.Close(); Response.Redirect(fileName); Response.End();
string fileName = string.Format("temp\\{0}.doc", Session.SessionID);
if (System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(Server.MapPath(fileName))) == false)
{
System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(Server.MapPath(fileName)));
}
foreach (string s in System.IO.Directory.GetFiles(System.IO.Path.GetDirectoryName(Server.MapPath(fileName))))
{
System.IO.FileInfo fi = new FileInfo(s);
if (( DateTime.Now- fi.CreationTime).TotalMinutes > 10)
{
try
{
fi.Delete();
}
catch
{
}
}
System.IO.File.Delete(s);
}
System.IO.FileStream fs = new System.IO.FileStream(Server.MapPath(fileName), System.IO.FileMode.CreateNew, System.IO.FileAccess.Write);
fs.Write(System.Text.ASCIIEncoding.UTF8.GetBytes(strMain), 0, System.Text.ASCIIEncoding.UTF8.GetByteCount(strMain));
fs.Close();
Response.Redirect(fileName);
Response.End();