ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: VBA万岁

[求助] VSTO入门问题集

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-1-14 10:14 | 显示全部楼层
lipton 发表于 2016-1-13 06:21
207楼的链接发错了,是一个嵌入型的小型数据库。
网页提取的类库是
http://htmlagilitypack.codeplex.com ...

多谢,按照你提供的网址已成功下载HtmlAgilityPack.1.4.6,有空再测试看看。
HtmlAgilityPack.1.4.6.zip (1.53 MB, 下载次数: 34)

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-1-14 15:57 | 显示全部楼层
VBA万岁 发表于 2016-1-14 10:14
多谢,按照你提供的网址已成功下载HtmlAgilityPack.1.4.6,有空再测试看看。

顺便附上对网页源码按指定的网页标签进行分行(有些网页源码复制到工作表后是没有分行的文本)以便于对源码进行解析的代码:
customUI.zip (1.47 MB, 下载次数: 36)

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-1-14 21:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
VBA万岁 发表于 2016-1-13 11:25
今用VBA做了一个,如附件,看看VSTO能否实现。

VSTO测试成功,主要代码如下:
  1. using HtmlAgilityPack;

  2.         public static string GetWebClient(string url)
  3.          {
  4.              string strHTML = "";
  5.              WebClient myWebClient = new WebClient();
  6.              Stream myStream = myWebClient.OpenRead(url);
  7.              StreamReader sr = new StreamReader(myStream, Encoding.Default);//注意编码
  8.              strHTML = sr.ReadToEnd();
  9.              myStream.Close();
  10.              return strHTML;
  11.          }

  12.          private void button5_Click(object sender, EventArgs e)
  13.          {
  14.              comboBox1.Items.Clear();
  15.              //更加链接格式和省份代码构造URL
  16.              String url = "http://www.tianqihoubao.com/lishi/";
  17.              //下载网页源代码
  18.              var docText = GetWebClient(url);
  19.              //加载源代码,获取文档对象
  20.              var doc = new HtmlAgilityPack.HtmlDocument();
  21.              doc.LoadHtml(docText);
  22.              //更加xpath获取总的对象,如果不为空,就继续选择dl标签
  23.              var res = doc.DocumentNode.SelectSingleNode(@"/html[1]/body[1]/div[1]/div[7]/div[1]/div[1]/div[3]");
  24.              if (res != null)
  25.              {
  26.                  var list = res.SelectNodes(@"dl");//选择标签数组
  27.                  if (list.Count < 1) return;
  28.                  foreach (var item in list)
  29.                  {
  30.                      var dd = item.SelectSingleNode(@"dt").SelectNodes("a");
  31.                      foreach (var node in dd)
  32.                      {
  33.                          var text = node.InnerText.Trim();
  34.                          //拼音代码要从href属性中进行分割提取
  35.                          var herf = node.Attributes["href"].Value.Trim().Split('/', '.');
  36.                          //Console.WriteLine("{0}:{1}", text, herf[herf.Length - 2]);
  37.                          comboBox1.Items.Add(text + ":" + herf[herf.Length - 2]);
  38.                      }
  39.                  }
  40.              }
  41.              comboBox1.TabIndex = 0;
  42.          }

  43.          private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
  44.          {
  45.              comboBox2.Items.Clear();
  46.              try
  47.              {
  48.                  String cityCode = comboBox1.Text.Substring(comboBox1.Text.LastIndexOf(":") + 1);
  49.                  //更加链接格式和省份代码构造URL
  50.                  String url = String.Format("http://www.tianqihoubao.com/lishi/{0}.htm", cityCode);
  51.                  //下载网页源代码
  52.                  var docText = GetWebClient(url);
  53.                  //加载源代码,获取文档对象
  54.                  var doc = new HtmlAgilityPack.HtmlDocument();
  55.                  doc.LoadHtml(docText);
  56.                  //更加xpath获取总的对象,如果不为空,就继续选择dl标签
  57.                  var res = doc.DocumentNode.SelectSingleNode(@"/html[1]/body[1]/div[1]/div[6]/div[1]/div[1]/div[3]");
  58.                  if (res != null)
  59.                  {
  60.                      var list = res.SelectNodes(@"dl");//选择标签数组
  61.                      if (list.Count < 1) return;
  62.                      foreach (var item in list)
  63.                      {
  64.                          var dd = item.SelectSingleNode(@"dd").SelectNodes("a");
  65.                          foreach (var node in dd)
  66.                          {
  67.                              var text = node.InnerText.Trim();
  68.                              //拼音代码要从href属性中进行分割提取
  69.                              var herf = node.Attributes["href"].Value.Trim().Split('/', '.');
  70.                              //Console.WriteLine("{0}:{1}", text, herf[herf.Length - 2]);
  71.                              comboBox2.Items.Add(text + ":" + herf[herf.Length - 2]);
  72.                          }
  73.                      }
  74.                  }
  75.              }
  76.              catch (WebException webEx)
  77.              {
  78.                  Console.WriteLine(webEx.Message.ToString());
  79.              }
  80.          }

  81.          private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
  82.          {
  83.              listBox1.Items.Clear();
  84.              try
  85.              {
  86.                  String cityCode = comboBox2.Text.Substring(comboBox2.Text.LastIndexOf(":") + 1);
  87.                  //更加拼音代码,月份信息构造URL
  88.                  String url = String.Format("http://www.tianqihoubao.com/lishi/{0}/month/{1}{2}.html", cityCode, comboBox3.Text, comboBox4.Text);
  89.                  //获取该链接的源代码
  90.                  var docText = GetWebClient(url);
  91.                  //加载源代码,获取页面结构对象
  92.                  var doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(docText);
  93.                  //更加Xpath获取表格对象
  94.                  var res = doc.DocumentNode.SelectSingleNode(@"/html[1]/body[1]/div[2]/div[6]/div[1]/div[1]/table[1]");
  95.                  if (res != null)
  96.                  {
  97.                      //获取所有行
  98.                      var list = res.SelectNodes(@"tr");
  99.                      list.RemoveAt(0);//移除第一行,是表头
  100.                      // 遍历每一行,获取日期,以及天气状况等信息
  101.                      foreach (var item in list)
  102.                      {
  103.                          var dd = item.SelectNodes(@"td");
  104.                          //日期 -  - 气温 - 风力风向
  105.                          if (dd.Count != 4) continue;
  106.                          //获取当前行日期
  107.                          var date1 = dd[0].InnerText.Replace("\r\n", "").Replace(" ", "").Trim();
  108.                          //获取当前行天气状况
  109.                          var tq = dd[1].InnerText.Replace("\r\n", "").Replace(" ", "").Trim();
  110.                          //获取当前行气温
  111.                          var qw = dd[2].InnerText.Replace("\r\n", "").Replace(" ", "").Trim();
  112.                          //获取当前行风力风向
  113.                          var fx = dd[3].InnerText.Replace("\r\n", "").Replace(" ", "").Trim();
  114.                          //输出
  115.                          //Console.WriteLine("{0}:{1},{2},{3}", date1, tq, qw, fx);
  116.                          listBox1.Items.Add(date1 + ":" + tq + ":" + qw + ":" + fx);
  117.                      }
  118.                  }
  119.              }
  120.              catch (WebException webEx)
  121.              {
  122.                  Console.WriteLine(webEx.Message.ToString());
  123.              }
  124.          }
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-1-14 21:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 VBA万岁 于 2016-1-15 14:41 编辑
VBA万岁 发表于 2016-1-13 11:25
今用VBA做了一个,如附件,看看VSTO能否实现。


C#制作测试源码见218楼。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-1-15 09:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
VBA万岁 发表于 2016-1-14 21:32
VSTO测试成功,主要代码如下:

VBA获取农历、星座、宜忌的代码稍作更改:
  1. Private Sub ListBox1_Change()
  2. On Error Resume Next
  3. Dim url, html, n
  4. url = Replace(ListBox1.List(ListBox1.ListIndex, 4), "about:", "http://www.tianqihoubao.com/")
  5. Set html = CreateObject("htmlfile")
  6. With CreateObject("msxml2.xmlhttp")
  7.     .Open "get", url, False
  8.     .send
  9.     'rs = StrConv(.responseBody, vbUnicode, &H804)
  10.     't = Split(Split(rs, "<b>阳历</b>")(1), "</font>")(0)
  11.     't = Replace(Replace(Replace(t, "&nbsp;", ""), "</b>", ";"), "<b>", ";")
  12.     't = Replace(Replace(t, "<br />", ""), "<font color=blue>", "")
  13.     't = t & ";忌: " & Split(Split(rs, "</font><br/> <b>忌</b>: <font color=red>")(1), "</font>")(0)
  14.     'TextBox1.Text = "阳历" & t
  15.     html.body.innerhtml = StrConv(.responseBody, vbUnicode, &H804)
  16.     t = Split(Split(html.all.tags("div")(1).innertext, "阳历")(1), "-")(0)
  17.     TextBox1.Text = "阳历" & Mid(t, 1, Len(t) - 12)
  18. End With
  19. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-1-15 21:30 | 显示全部楼层
VBA万岁 发表于 2016-1-15 09:57
VBA获取农历、星座、宜忌的代码稍作更改:

VS获取农历、星座、宜忌的代码如下:
  1. using HtmlAgilityPack;//此用于提取全国天气后报数据
  2. using System.Text.RegularExpressions;//用于listBox1的代码引用正则Regex.Split


  3.          private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
  4.          {            
  5.              try
  6.              {
  7.                  String cityCode = comboBox2.Text.Substring(comboBox2.Text.LastIndexOf(":") + 1);
  8.                  //更加链接格式和省份代码构造URL
  9.                  String url = String.Format("http://www.tianqihoubao.com//lishi/{0}/{1}.html", cityCode, listBox1.Text.Substring(0, 4) + listBox1.Text.Substring(5, 2) + listBox1.Text.Substring(8, 2));               
  10.                  //下载网页源代码
  11.                  var docText = GetWebClient(url);
  12.                  //加载源代码,获取文档对象
  13.                  var doc = new HtmlAgilityPack.HtmlDocument();
  14.                  doc.LoadHtml(docText);
  15.                  //更加xpath获取总的对象,如果不为空,就继续选择dl标签
  16.                  var res = doc.DocumentNode.SelectSingleNode(@"/html[1]/body[1]");
  17.                  if (res != null)
  18.                  {
  19.                      String t = Regex.Split(res.InnerText, "阳历")[1].Split('-')[0];
  20.                      textBox1.Text = "阳历" + t.Substring(0, t.Length - 12).Replace("&nbsp;", "").Replace("\r\n","");
  21.                  }
  22.              }
  23.              catch (Exception exception)
  24.              {
  25.                  MessageBox.Show(exception.Message);
  26.              }
  27.          }
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-1-15 21:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
VBA万岁 发表于 2016-1-14 21:32
VSTO测试成功,主要代码如下:

随感:通过以上两个实例,感觉VSTO采集网页数据比VBA快很多。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-1-15 21:44 | 显示全部楼层
VBA万岁 发表于 2016-1-15 21:33
随感:通过以上两个实例,感觉VSTO采集网页数据比VBA快很多。

制作测试源码如下:
ExcelHelpTaskPane.rar (718.24 KB, 下载次数: 17)

TA的精华主题

TA的得分主题

发表于 2016-1-15 22:06 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
VBA万岁 发表于 2016-1-15 21:33
随感:通过以上两个实例,感觉VSTO采集网页数据比VBA快很多。

建议你可以尝试一下写自己的功能类库,封装常用的功能,尽可能不要把逻辑都直接写在控件的关联方法上.
可能到时候你才明白用C#的生成效率有多高.

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2016-1-15 22:57 | 显示全部楼层
excelhomesnake 发表于 2016-1-15 22:06
建议你可以尝试一下写自己的功能类库,封装常用的功能,尽可能不要把逻辑都直接写在控件的关联方法上.
可 ...

同感,把变与不变隔离开来,封装不变部分。单一职责职责清晰,领会了,写代码会有质的飞跃。
有位大师提过,一个过程超过25行算法就应该重写,里面就包含了隔离封装的意思。实际上不但CSharp,VBA也适用。

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-6-30 17:40 , Processed in 0.051004 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表