首页 新闻 赞助 找找看

C#模拟点击网页按钮且获取页面弹出的excel并保存

0
悬赏园豆:100 [待解决问题]

问题如下:

1.win-form 程序访问一个网页(别人网站上的网页)

2.网页上有个按钮名称为(点击下载excel)

3.程序模拟点击事件

4.页面会弹出excel

5.保存此excel到本地文件夹中

问题补充:

或者说是 我访问一个url 这个页面会直接弹出一个excel 我怎样把这个excel存到本地的文件夹中

lbaichun的主页 lbaichun | 初学一级 | 园豆:12
提问于:2012-12-29 09:22
< >
分享
所有回答(7)
0

用模拟软件

Alvin | 园豆:828 (小虾三级) | 2012-12-29 11:52
0

看一下页面的源代码,应该是可以直接找到excel的具体地址的,然后直接去下载那个文件

psforever | 园豆:461 (菜鸟二级) | 2012-12-29 14:12

excel是从页面输出来的 并不是已经保存在服务器上的 是临时生成的

支持(0) 反对(0) lbaichun | 园豆:12 (初学一级) | 2012-12-29 14:38

@lbaichun: 那几用模拟表单提交的方式

http://www.cnblogs.com/changyou/archive/2010/01/09/1643166.html

支持(0) 反对(0) psforever | 园豆:461 (菜鸟二级) | 2012-12-29 14:45
0

如果已经知道URL了,直接下载不就可以了

new System.Net.WebClient().DownloadFile(url, file);

I,Robot | 园豆:9783 (大侠五级) | 2012-12-29 16:29
0

直接下载到本地文件夹不就行了

万里沙来手一挥 | 园豆:196 (初学一级) | 2012-12-31 23:40
0

如果有很多像这样,页面上带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的网页示例最好了,可以看看你遇到的是哪部分的问题,一块帮你解决了你就明白这个过程了。

自由神圣 | 园豆:202 (菜鸟二级) | 2013-01-04 08:38
0

把地址贴上来看看

金江 | 园豆:215 (菜鸟二级) | 2013-01-04 14:14
0

有两种方法,我只介绍一种兼容所有浏览器的方法!看源码你就懂:

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();

蓝瑟悠米 | 园豆:202 (菜鸟二级) | 2013-01-05 11:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册