使用C#采集Shibor数据到Excel
对Shibor的变化一直以来比较关注,正好最近学习了对html数据处理的一些知识,就打算拿来采集一些我需要的Shibor数据。
使用到的库
HttpAgilityPack 一个非常不错的html解析工具库
NPOI 一个非常好的office文档生成和读取的库。
整个过程如下:
分析网页内容结构
Shibor的网站开发的比较早了,所以网页布局采用的大量的Table和iFrame,利用浏览器的F12工具,可以很方便的分析出来需要数据的位置。
从上面截图可以看出,我需要的数据区域是一个iFrame加载出来的,所以其实这个src的内容就是我要的,即/shibor/Shibor.do?date=2018-04-25
,结合域名知道实际请求url是http://www.shibor.org/shibor/Shibor.do?date=2018-04-25
参数是日期,格式是yyyy-MM-dd
,也就是说只需要构造这个参数,就可以得到不同日期的shibor数据了。
将这个新url输入到浏览器里查看
确实是我需要的内容。
下载和解析网页内容
下载该网页的内容就简单了,可以使用很多种方法,我这里直接使用了Http Agility Pack
里的HttpWeb
类里的Load
方法。
涉及到的页面分析这里不罗嗦了,并不难理解,直接贴代码了。
public List<ShiborModel> Download(DateTime shiborDate)
{
string new_url = $"{url}{shiborDate.ToString("yyyy-MM-dd")}";
List<ShiborModel> shibors = new List<ShiborModel>();
try
{
var web = new HtmlWeb();
var doc = web.Load(new_url);
var results = doc.DocumentNode.SelectSingleNode("//table[@class='shiborquxian']");
foreach (var item in results.Descendants("tr"))
{
var tds = item.Descendants("td").ToList();
var name = tds[1].InnerText;
var shibor = tds[2].InnerText;
var bp = tds[4].InnerText;
shibors.Add(new ShiborModel
{
Name = name,
Shibor = double.Parse(shibor),
BP = double.Parse(bp)
});
}
}
catch (Exception)
{
Console.WriteLine($"处理{shiborDate.ToString("yyyyMMdd")}");
}
return shibors;
}
处理解析得到的数据
上面方法返回的是需要数据的集合,而我需要将这些数据输出为excel格式的文件,而.net输出excel的库也有很多,我使用的是国人自己基于openxmlsdk开发的NPOI库,很优秀的库,同样贴出处理的代码。
关于NPOI的使用,可以参考其他人写的文章。
public void BatchDownLoad(DateTime startDate, DateTime endDate)
{
try
{
XSSFWorkbook workbook2007 = new XSSFWorkbook();
workbook2007.CreateSheet("Shibor");
if (File.Exists(excel))
{
File.Delete(excel);
}
FileStream fs = new FileStream(excel, FileMode.CreateNew);
XSSFSheet sheet = (XSSFSheet)workbook2007.GetSheet("Shibor");
XSSFRow first_row = (XSSFRow)sheet.CreateRow(0);
((XSSFCell)first_row.CreateCell(0)).SetCellValue("日期");
((XSSFCell)first_row.CreateCell(1)).SetCellValue("O/N");
((XSSFCell)first_row.CreateCell(2)).SetCellValue("1W");
((XSSFCell)first_row.CreateCell(3)).SetCellValue("2W");
((XSSFCell)first_row.CreateCell(4)).SetCellValue("1M");
((XSSFCell)first_row.CreateCell(5)).SetCellValue("3M");
((XSSFCell)first_row.CreateCell(6)).SetCellValue("6M");
((XSSFCell)first_row.CreateCell(7)).SetCellValue("9M");
((XSSFCell)first_row.CreateCell(8)).SetCellValue("1Y");
var dataformat = workbook2007.CreateDataFormat();
var style = workbook2007.CreateCellStyle();
style.DataFormat = dataformat.GetFormat("yyyy-MM-dd");
int rowNumber = 1;
DateTime currentDate = startDate;
while (currentDate < endDate)
{
var shibors = Download(currentDate);
if (shibors.Count == 0)
continue;
XSSFRow temp_row = (XSSFRow)sheet.CreateRow(rowNumber);
((XSSFCell)temp_row.CreateCell(0)).SetCellValue(currentDate.Date);
temp_row.GetCell(0).CellStyle = style;
((XSSFCell)temp_row.CreateCell(1)).SetCellValue(shibors[0].Shibor);
((XSSFCell)temp_row.CreateCell(2)).SetCellValue(shibors[1].Shibor);
((XSSFCell)temp_row.CreateCell(3)).SetCellValue(shibors[2].Shibor);
((XSSFCell)temp_row.CreateCell(4)).SetCellValue(shibors[3].Shibor);
((XSSFCell)temp_row.CreateCell(5)).SetCellValue(shibors[4].Shibor);
((XSSFCell)temp_row.CreateCell(6)).SetCellValue(shibors[5].Shibor);
((XSSFCell)temp_row.CreateCell(7)).SetCellValue(shibors[6].Shibor);
((XSSFCell)temp_row.CreateCell(8)).SetCellValue(shibors[7].Shibor);
Console.WriteLine($"{currentDate.Date}处理OK");
currentDate = currentDate.AddDays(1);
rowNumber++;
}
workbook2007.Write(fs);
fs.Close();
workbook2007.Close();
}
catch (Exception)
{
throw;
}
}
得到结果
图形不是程序生成的,是我用excel的图表功能附加上去的。
因为不是正式项目,所以没有考虑太多开发的规范性,代码只是要求能运行出结果即可。
使用C#采集Shibor数据到Excel的更多相关文章
- C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)
第一次接触HtmlAgilityPack是在5年前,一些意外,让我从技术部门临时调到销售部门,负责建立一些流程和寻找潜在客户,最后在阿里巴巴找到了很多客户信息,非常全面,刚开始是手动复制到Excel, ...
- 使用POI导出百万级数据到excel的解决方案
1.HSSFWorkbook 和SXSSFWorkbook区别 HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls,一张表最大支持65536行数据,256列 ...
- ASP.NET MVC5下载数据到Excel文件
项目中的一个功能是将数据导入到Excel文件中,这里使用NPOI操作Excel,代码如下: public class Excel : IDataTransfer { public Stream Exp ...
- 1.ASP.NET MVC使用EPPlus,导出数据到Excel中
好久没写博客了,今天特地来更新一下,今天我们要学习的是如何导出数据到Excel文件中,这里我使用的是免费开源的Epplus组件. 源代码下载:https://github.com/caofangshe ...
- 导出数据到Excel --使用ExcelReport有感
先看图,这是几个月前用NPOI写的导出数据到Excel,用了上百行代码,而且难控制,导出来也比较难看 excel打开的效果 下面是我用ExcelReport类库导出到Excel的操作 1.首先引用Ex ...
- 将Oracle数据库中的数据写入Excel
将Oracle数据库中的数据写入Excel 1.准备工作 Oracle数据库"TBYZB_FIELD_PRESSURE"表中数据如图: Excel模板(201512.xls): 2 ...
- [Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你!
引言 项目中常用到将数据导入Excel,将Excel中的数据导入数据库的功能,曾经也查找过相关的内容,将曾经用过的方案总结一下. 方案一 NPOI NPOI 是 POI 项目的 .NET 版本.POI ...
- 使用Open xml 操作Excel系列之二--从data table导出数据到Excel
由于Excel中提供了透视表PivotTable,许多项目都使用它来作为数据分析报表. 在有些情况下,我们需要在Excel中设计好模板,包括数据源表,透视表等, 当数据导入到数据源表时,自动更新透视表 ...
- Dynamics CRM导出数据到Excel
原创地址:http://www.cnblogs.com/jfzhu/p/4276212.html 转载请注明出处 Pivot Table是微软BI的一个重要工具,所以这里讲一下Dynamics CRM ...
随机推荐
- using指令都用了这么多年了,其实还真没懂!
在C语言中,我们经常使用#include<stdio.h>指令来导入标准输入输出库,这确实很好理解,相当于把代码复制到当前的程序中. 但在C#语言中,当我们写Console程序时,经常在第 ...
- jdk8环境下,添加重复注解的美好体验
为了实现业务层缓存,定义了几个注解:@Cache.able.@Cache.put.@Cache.del 分别实现对业务方法的 缓存检测.缓存插入 和 缓存清除. public @interface C ...
- Caused by: org.apache.velocity.exception.MethodInvocationException: Invocation of method 'getUser' in class org.uncommons.reportng.ReportMetadata threw exception class java.net.UnknownHostException :
Running TestSuite [TestNG] [WARN] Ignoring duplicate listener : org.uncommons.reportng.HTMLReporter ...
- HDU 1025 LIS二分优化
题目链接: acm.hdu.edu.cn/showproblem.php?pid=1025 Constructing Roads In JGShining's Kingdom Time Limit: ...
- HDU 1114(没有变形的完全背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114 Piggy-Bank Time Limit: 2000/1000 MS (Java/Others ...
- ASP.NET Core 如何实现404错误跳转到主页
假如用户在Web浏览器上敲错了URL,访问了ASP.NET Core站点下一个不存在的URL地址,那么默认情况下ASP.NET Core会返回给浏览器著名的404错误,那么有什么办法可以让ASP.NE ...
- 图片在线处理 webp!
之前处理图片的方式是,小图标通过gulp配置的spritesmith雪碧图方式,.png会先用ps工具转成.jpg,然后jpg太大则用在线压缩工具来进行压缩(另外gulp系列的gulp-imagemi ...
- 清除浮动元素的margin-top失效原因(更改之前的错误)
//样式代码body,div{ margin:; padding:; } .box1{ background:#900; width:200px; height:200px; margin:20px ...
- [原创]升级Gerrit的commit-msg,检查git commit时必须填写开发任务编号TaskID
公司使用git+gerrit+jenkins进行持续集成实践,其中gerrit用来进行Code Review.另外我们自己研发了一套敏捷项目管理系统TPM(TeamPlus Management),用 ...
- .NET中Quartz任务调度器的简单应用实例
1.首先从NuGet中安装Quartz,安装最新版本就OK 2.新建一个Job类实现Quart中的IJob接口用于执行业务逻辑,代码如下: class CheckUpdateJob : IJob { ...