资源描述
C++程序读取HTML文件中的数据
摘要
C++语言作为一种计算机语言,它是在C语言基础上发展起来的,是真正的面向对象编程语言,它的功能强大,本文简要介绍了利用C++语言中的MFC类库编程间接读取HTML文件中的数据的实现过程。
本次设计先要建立一个HTML文件,HTML语言可以用多种软件编写,本文选择用写字板编写并建立了一个HTML文件,这是此次设计当中需要被MFC类库读取的文件。由于MFC类库难以直接读取HTML文件中的数据,所以要以EXCEL为桥梁将它们连接起来。所以选择先建立EXCEL与MFC类库之间的联系,用MFC打开EXCEL表格,然后用EXCEL表格读取HTML文件中的数据,再用MFC类库中的类编程读取EXCEL文件中的数据,最终间接达到用C++程序读取HTML文件中的数据的目的。
关键词:HTML文件 数据 EXCEL MFC类库
目 录
一.系统设计总说明............................................2
1.1设计目的................................................ 2
1.2设计要求................................................ 2
1.3设计内容................................................ 3
1.4变量命名规则.............................................3
1.5主要类和函数.............................................3
1.6系统功能简介.............................................5
二.C++语言课程设计报告....................................... 5
2.1 需求分析................................................ 5
2.1.1 功能需求分析 ...................................... 5
2.1.2 环境需求分析 ...................................... 6
2.2 概要设计................................................ 7
2.2.1 系统功能模块图 .................................... 7
2.2.2 程序流程图 ........................................ 7
2.3 详细设计................................................ 9
2.3.1 设计原理 .......................................... 9
2.3.2 基础知识简介 ...................................... 9
2.3.3 系统界面 ......................................... 17
2.4 调试与操作说明......................................... 18
三、设计总结................................................. 20
参考文献..................................................... 21
一.系统设计总说明
1.1设计目的
《C++课程设计》是信息管理与信息系统专业的重要实践性课程。课程设计为学生提供了一个手脑并用、独立实践的机会。目的在于培养学生分析问题和解决问题的能力,将课本的理论知识与实际应用问题进行有机结合,提高学生程序设计、程序调试及项目开发能力。
通过本课程设计的实践,全面总结C++课程学习中的数据类型、程序结构、数组、函数、指针、结构体等基本概念,掌握其使用方法。培养使用面向过程的程序设计方法编写计算机程序的能力。
课题的目的主要是考查学生对C++语言的综合编程能力的掌握,培养学生的分析问题和解决问题的能力及逻辑思维能力。该课题主要考察学生对函数、结构体,指针,文件等的操作,以及C++语言基本规则和算法的掌握,所以完成本课题要求学生较强的设计能力,特别是要具有综合应用能力。如何调程序也非常重要,通过这个程序可以学习到以前调试短程序没有的的经验。
1.2设计要求
①问题分析和任务定义:根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么(而不是怎么做),限制条件是什么。
②概要设计:对问题描述中涉及的操作对象定义相应结构体,并按照以设计需要为中心的原则,确定各个结构体之间的关系。逻辑设计的结果应写出每个结构体抽象数据结构体型的定义(包括数据结构的描述和每个基本操作的功能说明)、各个主要模块的算法,并画出模块之间的调用关系图。
③详细设计:定义相应的结构体并写出各函数的算法。在这个过程中,要综合考虑系统功能,使得系统结构清晰、合理、简单和易于调试,数据类型的实现尽可能做到数据封装,基本操作的规格说明尽可能做到明确具体。写出函数形式的算法框架。
④程序编码:把详细设计的结果进一步求精为程序设计语言程序,同时加入部分注解,使程序中逻辑概念清楚。
⑤程序调试与测试:能够熟练掌握调试工具的各种功能,设计测试数据确定疑点,通过修改程序来证实它或绕过它。调试正确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果。
⑥结果分析:程序运行结果包括正确的输入及输出结果。
1.3设计内容
C++程序读取HTML文件中的数据
1.4 变量命名规则
选择类名里的关键字或者以英文命名,例子如下:
_Application app; Workbooks books; _Workbook book;
Sheets sheets; _Worksheet sheet; Range range;
CString strPathName; CFileDialog dlg; int row;
1.5 主要类和函数
类:
_Application:Application 对象用于存储和访问来自任何页面的变量,类似于 session 对象。不同之处在于,所有的用户分享一个 Application 对象,而 session 对象和用户的关系是一一对应的。
_Workbook:Workbook对象代表一个工作簿
Workbooks:Workbooks集合对象则代表同一Excel进程中打开的所有工作簿对象。
Sheets:sheets是当前活动表,每个是Sheet是一个工作簿,各个sheet就构成sheets,也就是工作表了。
_Worksheet:Worksheet代表Excel工作表
Worksheets:worksheets是指你当前非活动表。Worksheets集合对象代表代表Excel工作表的集合
Range:Range()则是指一个区域,区域中可以是一个单元格,也可以是多个单元格。
Font:规定文本的字体、字体尺寸、字体颜色。
函数功能:
int CListCtrl::InsertColumn(int nCol, const LVCOLUMN* pColumn)
作用是在列表视图控件中新插入一列。
int CListCtrl::InsertItem( int nItem, LPCTSTR lpszItem, int nImage )
用于MFC中CListCtrl控件加入列表项,只操作CListCtrl的第一列。
void CRange:: AttachDispatch(LPDISPATCH lpDispatch,BOOL bAutorelease =1)
操作EXCEL的函数,位于CRange类中,可以用来锁定和读取EXCEL中的对应单元格。
void CRange::ReleaseDispatch()
释放接口。
_Worksheet ::GetUsedRange()
求有效行
BOOL CListCtrl::DeleteAllItems
函数功能从列表视图控件删除所有项。
void CWnd:: SetRedraw( BOOL bRedraw = TRUE )
应用程序调用SetRedraw以允许重画变化或防止变化被重画。这个成员函数
设置或清除重画标志。当重画标志被清除时,在每次变化以后,内容不会更新,直到重画标志被设置才会重新绘出。
void Invalidate( BOOL bErase = TRUE )
该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重
绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原被遮住的部分就是无效的,需要重绘。
BOOL UpdateWindow(HWND hWnd)
如果窗口更新的区域不为空,UpdateWindow函数通过发送一个WM_PAINT
消息来更新指定窗口的客户区。函数绕过应用程序的消息队列,直接发送WM_PAINT消息给指定窗口的窗口过程,如果更新区域为空,则不发送消息。
Format:format是DOS系统的一种命令,format指令用于格式化磁盘,是一种高级格式化,对磁盘进行的格式编写程序。
1.6系统功能简介
用C++程序读取HTML文件中的数据。
二.C++语言课程设计报告
2.1 需求分析
2.1.1 功能需求分析
本文中,C++程序读取HTML文件中的数据的过程是:要先创建一个EXCEL文件读取HTML文件中的数据,然后再用C++语言读取EXCEL文件。过程如图1所示:
图1
此过程间接达到了利用C++程序读取HTML文件中的数据的目的。它主要有三大模块:建立EXCEL文件;EXCEL文件读取HTML文件中的数据;C++程序读取EXCEL文件中的数据。
(1) 建立EXCEL文件模块的主要功能是为了读取HTML文件,具体操作是:先获取EXCEL工作簿集合,再添加一个工作簿西安市EXCEL表格,最后设置为用户可控制。因为在实际生活中人们主要用EXCEL来进行数据操作,且EXCEL可以读取网页数据又方便修改,所以为了方便操作,选择了EXCEL来作为枢纽,将C++程序与HTML文件联系起来。
(2)EXCEL文件读取HTML文件中的数据模块主要功能是将C++程序难以读取的HTML文件转化为方便C++程序读取的EXCEL文件,此模块是在(1)建立了EXCEL文件的基础上进行,在EXCEL文件里操作的。具体操作是:点击菜单栏里的“数据”,再点击新出现的工具箱的左上角的“至网页”会弹出一个网页窗口,输入要读取的网页地址之后选择所需要的表格,最后点击“导入”保存就完成了HTML文件的读取,但此时的数据还在EXCEL上,还需要经过模块3才能将HTML文件中的数据读到C++程序里。
(3)C++程序读取EXCEL文件中的数据模块主要功能是将模块(2)中的EXCEL文件中的数据用C++程序读出来。具体操作:运行C++程序,会出现一个操作窗口,点击“读取Excel表格”,在弹出的窗口的文件名里找到之前保存的EXCEL表格,点击“打开”就可以成功将数据读入C++里。操作过程比较方便。
2.1.2 环境需求分析
操作系统:Windows 7.0
调试软件:Microsoft公司的Visual C++ 6.0、记事本
采用技术:面向过程
2.2 概要设计
2.2.1 系统功能模块图
本次设计主要有三大模块:建立EXCEL文件;EXCEL文件读取HTML文件中的数据;C++程序读取EXCEL文件中的数据。其中建立EXCEL文件和C++程序读取EXCEL文件中的数据是在C++程序和记事本中进行的,而EXCEL文件读取HTML文件中的数据是在Excel中进行的。整个系统功能模块图如图2所示:
图2
2.2.2 程序流程图
本次设计所编写的C++程序里的主要实现部分在CTestDlg类里,其中的成员函数OnOK的作用是实现MFC对Excel的读取,图3即为OnOK函数的程序流程图。
开始
i<nRows?
j<=nColumnCount+1?
建立接口
i=2
读取单元格
j=1
j++
i++
得到表格
Y N
N
Y
对m_list赋值
更新CListCtrl
释放excel
结束
图3
2.3 详细设计
2.3.1 设计原理
C++程序读取HTML文件中的数据以C++程序和EXCEL操作交替进行,通过调用各个函数以及操作EXCEL,实现不同的功能。因为EXCEL本身具有读取网页数据的功能,所以可以直接利用EXCEL读取HTML文件中的数据,然后再利用C++程序读取EXCEL文件。要达到这一目的,首先要设置建立C++与EXCEL之间的联系并运用C++编程打开EXCEL。在C++中创建VC界面使操作简洁明了,VC界面中的每一个按键都有一个成员函数与之相对应,在成员函数里编写程序定义按键的功能。作为一个读取HTML文件数据的程序,这样的设计增大了程序的实用性。
2.3.2 基础知识简介
1、HTML表格及其分类:
HTML表格通过属性-值对来描述对象,内容为对象属性的单元格称为属性域,内容为属性对应值的单元格称为值域。在HTML表格中,表格由table元素标记,它由若干行元素(row)构成,每一行又由若干单元(cell)构成。这些单元可以表示表头信息的th元素,也可以是表示数据信息的td元素。单元可以跨越多个列或多个行,跨越的行、列数分别由th或td元素的rowspan与colspan属性指定。本文应用示例表格如图4所示:
图4
示例表格对应的HTML文档如下:
<html>
<head>
<title>表格</title>
</head>
<body>
<table width="314" border="1"align="center">
<tr>
<td width="75">姓名</td>
<td width="86">班级</td>
<td width="131">住址</td>
</tr>
<tr>
<td>周三</td>
<td>数学 1101</td>
<td>西安碑林区</td>
</tr>
<tr>
<td>李四</td>
<td>数学 1101</td>
<td>西安雁塔区</td>
</tr>
<tr>
<td>王五</td>
<td>数学 1101</td>
<td>西安长安区</td>
</tr>
</table>
</body>
</html>
HTML表格结构比较复杂,从形式上可以分为简单表格与复杂表格2类。其中,简单表格又可以分为3种:
(1)行标题表(属性在前n行);
(2)列标题表(属性在前m行);
(3)行列标题表(属性分别在前n行与前m列)。
本文所用示例表格即为简单表格中的行标题表。
2、MFC中EXCEL相关类的添加
(1)启动VC 6.0,打开新建对话框,新建一个MFC AppWizard(exe)工程,这里工程名设置为Test,点击“确定”;之后选择“基本对话框”,点击“完成”;最后再点击“确定”。所有过程如图5的3张图片所示:
图5
(2)进入MFC应用程序向导,选择基本对话框,直接点击完成,工程文件结构图如图6:
图6
(3)打开MFC ClassWizard窗口(查看---->建立类向导),选择Automation,单击Add Class按钮,选择From a type library...,弹出文件选择对话框可以在这里设置对话控制,将表中的控件直接拖入对话框即可。如图7所示:
图7
之后定位到Microsoft Office的安装目录,选择EXCEL.exe,确定后,弹出Confirm Classes窗口,选择列表中需要的类,单击OK按钮。过程及结果如图8所示:
图8
成功之后,工程文件结构图如图9所示:
图9
(4)返回编辑器,查看工程文件,可发现多了excel.h及excel.cpp两个文件;
(5)打开stdafx.h头文件确保包含如图9头文件:
图9
(6)打开Test.cpp文件,修改CTestApp::InitInstance(),加入如下代码:
BOOL CTestApp::InitInstance()
{
AfxEnableControlContainer();
#ifdef _AFXDLL
Enable3dControls();
#else
Enable3dControlsStatic();
#endif
CTestDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK){}
else if (nResponse == IDCANCEL){}
return FALSE;
}
为保证编译时不产生重复定义错误,打开excel.h文件,在文件开始位置加入如下代码:
#if !defined _HEAD_FILE_EXCEL_
#define _HEAD_FILE_EXCEL_
相应的,在文件末尾加入:
#endif
到此,自动化工程建立完成,建立F7,看是否能通过编译。
(7)选择ResourceView工作区,打开IDD_TEST_DIALOG,在对话框中添加一个按钮控件Button1,双击它,生成一个Button1 Click事件的处理函数;另一个按钮控件OnOK生成过程同上:
void CTestDlg::OnButton1()
{
// TODO: Add your control notification handler code here
}
(8)在OnButton1函数中添加代码:
void CTestDlg::OnButton1()
{
// TODO: Add your control notification handler code here
_Application app;
Workbooks books;
_Workbook book;
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
if( !app.CreateDispatch("Excel.Application") )
{
this->MessageBox("无法创建Excel应用!");
return;
}
books=app.GetWorkbooks(); //获取工作簿集合
book=books.Add(covOptional); //添加一个工作簿
app.SetVisible(TRUE); //显示Excel表格
app.SetUserControl(TRUE);//设置为用户可控制
}
2.3.3 系统界面
VC界面中列出了该程序的功能:创建Excel表格、读取Excel表格、取消、数据显示框。如图10:
图10
2.4 调试与操作说明
1、建立EXCEL文件:
直接点击图8Test对话框的“创建Excel表格” ;
2、EXCEL文件读取HTML文件中的数据:
弹出一个Excel窗口,点击“数据”里的“自网站”,会出现一个窗口,见图11;
数据
自网站
图11
在地址里输入网站地址,找到所需要的表格点击导入,就可以将HTML文件中的数据读到Excel里。过程及结果如图12所示:
图12
3、C++程序读取EXCEL文件中的数据
点击图8中Test对话框的“读取Excel”,在弹出的窗口中选出需要打开的Excel文件,点击“打开”即能读出Excel里的数据,过程及结果如图13所示。
图13
三、设计总结
通过这次课程设计,我拓宽了知识面,锻炼了能力,综合素质得到较大提高。
本次课程设计,使我对用C++程序读取HTML文件中的数据的基本过程的设计方法、步骤、思路、有一定的了解与认识。在课程设计过程中,我基本能按照规定的程序进行,先针对MFC和HTML的使用收集、调查有关资料,其间,同组成员之间进行几次方案的讨论、修改,再讨论、再修改,最后定案。设计方案初步确定后,再进行扩充详细设计,最终用C++语言实现了MFC读取HTML文件中的数据。整个过程周密有序,对我按时高质完成课程设计非常有利!但是严格说起来,我们这次做的程序并不能直接用MFC读取HTML文件中的数据,它是以Excel为桥梁,先用Excel读取HTML文件数据,再用MFC读取Excel文件中的数据,整个过程有些复杂,还需要我们进一步去改进它,完善它。
总的来说,本次课程设计基本达到了专业学习的预期目的。课程设计之后,我不仅仅是感到实际动手能力有所提高,更重要的是进一步激发了我对专业知识的兴趣,并能够结合实际存在的问题在专业领域内进行更深入的学习。
作为一个应用数学专业的本科生来说,实际能力的培养至关重要,而这种实际能力的培养单靠课堂教学是远远不够的,必须从课堂走向实践。通过此次课程设计,让我找出自身状况与实际需要的差距,并在以后的学习期间及时补充相关知识,为求职与正式工作做好充分的知识、能力准备,从而缩短从校园走向社会的心理转型期。
参考文献
[1]肖宏伟,Visual C++实效编程百例(第二版)[M],北京:人民邮电出版社,2004.
[2]刘惊雷,Visual C++实用教程[M],北京:电子工业出版社,2005.
[3]张立科,Visual C++ 6.0 MFC库类参考手册[M],北京:人民邮电出版社,2004.5.
[4]郑莉, C++语言程序设计(第4版)[M],北京:清华大学出版社,2010.7
[5]刘丽霞 刘晋伟,脑动力.HTML+CSS标签速查效率手册[M],北京:电子工业出版社,2012.
[6]贾长云,HTML表格向LXM的智能转换[J],计算机工程,第35卷第14期32~34,2009.7.
展开阅读全文