1、 C++程序读取HTML文件中的数据 摘要 C++语言作为一种计算机语言,它是在C语言基础上发展起来的,是真正的面向对象编程语言,它的功能强大,本文简要介绍了利用C++语言中的MFC类库编程间接读取HTML文件中的数据的实现过程。 本次设计先要建立一个HTML文件,HTML语言可以用多种软件编写,本文选择用写字板编写并建立了一个HTML文件,这是此次设计当中需要被MFC类库读取的文件。由于MFC类库难以直接读取HTML文件中的数据,所以要以EXCEL为桥梁将它们连接起来。所以选择先建立EXCEL与MFC类库之间的联系,用MFC打开EXCEL表格,然后用EXCEL表格读取HTML文件
2、中的数据,再用MFC类库中的类编程读取EXCEL文件中的数据,最终间接达到用C++程序读取HTML文件中的数据的目的。 关键词:HTML文件 数据 EXCEL MFC类库 目 录 一.系统设计总说明............................................2 1.1设计目的................................................ 2 1.2设计要求................................................
3、 2 1.3设计内容................................................ 3 1.4变量命名规则.............................................3 1.5主要类和函数.............................................3 1.6系统功能简介.............................................5 二.C++语言课程设计报告....................................... 5 2.
4、1 需求分析................................................ 5 2.1.1 功能需求分析 ...................................... 5 2.1.2 环境需求分析 ...................................... 6 2.2 概要设计................................................ 7 2.2.1 系统功能模块图 .................................... 7
5、 2.2.2 程序流程图 ........................................ 7 2.3 详细设计................................................ 9 2.3.1 设计原理 .......................................... 9 2.3.2 基础知识简介 ...................................... 9 2.3.3 系统界面 ........................................
6、 17 2.4 调试与操作说明......................................... 18 三、设计总结................................................. 20 参考文献..................................................... 21 一.系统设计总说明 1.1设计目的 《C++课程设计》是信息管理与信息系统专业的重要实践性课程。课程设计为学生提供了一个手脑并用、独立实践的机会。目的在于培养学生分析问题和解决问题的能力,将课本的理论知
7、识与实际应用问题进行有机结合,提高学生程序设计、程序调试及项目开发能力。 通过本课程设计的实践,全面总结C++课程学习中的数据类型、程序结构、数组、函数、指针、结构体等基本概念,掌握其使用方法。培养使用面向过程的程序设计方法编写计算机程序的能力。 课题的目的主要是考查学生对C++语言的综合编程能力的掌握,培养学生的分析问题和解决问题的能力及逻辑思维能力。该课题主要考察学生对函数、结构体,指针,文件等的操作,以及C++语言基本规则和算法的掌握,所以完成本课题要求学生较强的设计能力,特别是要具有综合应用能力。如何调程序也非常重要,通过这个程序可以学习到以前调试短程序没有的的经验
8、 1.2设计要求 ①问题分析和任务定义:根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么(而不是怎么做),限制条件是什么。 ②概要设计:对问题描述中涉及的操作对象定义相应结构体,并按照以设计需要为中心的原则,确定各个结构体之间的关系。逻辑设计的结果应写出每个结构体抽象数据结构体型的定义(包括数据结构的描述和每个基本操作的功能说明)、各个主要模块的算法,并画出模块之间的调用关系图。 ③详细设计:定义相应的结构体并写出各函数的算法。在这个过程中,要综合考虑系统功能,使得系统结构清晰、合理、简单和易于调试,数据类型的实现尽可能做到数据封装,基本操作的规格说明尽可能做到明确具体
9、写出函数形式的算法框架。 ④程序编码:把详细设计的结果进一步求精为程序设计语言程序,同时加入部分注解,使程序中逻辑概念清楚。 ⑤程序调试与测试:能够熟练掌握调试工具的各种功能,设计测试数据确定疑点,通过修改程序来证实它或绕过它。调试正确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果。 ⑥结果分析:程序运行结果包括正确的输入及输出结果。 1.3设计内容 C++程序读取HTML文件中的数据 1.4 变量命名规则 选择类名里的关键字或者以英文命名,例子如下: _Application app; Workbooks books; _
10、Workbook book; Sheets sheets; _Worksheet sheet; Range range; CString strPathName; CFileDialog dlg; int row; 1.5 主要类和函数 类: _Application:Application 对象用于存储和访问来自任何页面的变量,类似于 session 对象。不同之处在于,所有的用户分享一个 Application 对象,而 session 对象和用户的关系是一一对应的。 _Workbook:Workbook对象
11、代表一个工作簿 Workbooks:Workbooks集合对象则代表同一Excel进程中打开的所有工作簿对象。 Sheets:sheets是当前活动表,每个是Sheet是一个工作簿,各个sheet就构成sheets,也就是工作表了。 _Worksheet:Worksheet代表Excel工作表 Worksheets:worksheets是指你当前非活动表。Worksheets集合对象代表代表Excel工作表的集合 Range:Range()则是指一个区域,区域中可以是一个单元格,也可以是多个单元格。 Font:规定文本的字体、字体尺寸、字体颜色。 函数功能: int CList
12、Ctrl::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中
13、的对应单元格。 void CRange::ReleaseDispatch() 释放接口。 _Worksheet ::GetUsedRange() 求有效行 BOOL CListCtrl::DeleteAllItems 函数功能从列表视图控件删除所有项。 void CWnd:: SetRedraw( BOOL bRedraw = TRUE ) 应用程序调用SetRedraw以允许重画变化或防止变化被重画。这个成员函数 设置或清除重画标志。当重画标志被清除时,在每次变化以后,内容不会更新,直到重画标志被设置才会重新绘出。 void Invalidate( BOOL bEras
14、e = TRUE ) 该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重 绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原被遮住的部分就是无效的,需要重绘。 BOOL UpdateWindow(HWND hWnd) 如果窗口更新的区域不为空,UpdateWindow函数通过发送一个WM_PAINT 消息来更新指定窗口的客户区。函数绕过应用程序的消息队列,直接发送WM_PAINT消息给指定窗口的窗口过程,如果更新区域为空,则不发送消息。 Format:format是DOS系统的一种命令,format指令用于格式化磁盘,是一种高级格式化,对磁盘进行的格式编写
15、程序。 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文件,具体操作是:先获取EXCE
16、L工作簿集合,再添加一个工作簿西安市EXCEL表格,最后设置为用户可控制。因为在实际生活中人们主要用EXCEL来进行数据操作,且EXCEL可以读取网页数据又方便修改,所以为了方便操作,选择了EXCEL来作为枢纽,将C++程序与HTML文件联系起来。 (2)EXCEL文件读取HTML文件中的数据模块主要功能是将C++程序难以读取的HTML文件转化为方便C++程序读取的EXCEL文件,此模块是在(1)建立了EXCEL文件的基础上进行,在EXCEL文件里操作的。具体操作是:点击菜单栏里的“数据”,再点击新出现的工具箱的左上角的“至网页”会弹出一个网页窗口,输入要读取的网页地址之后选择所需要的表格,
17、最后点击“导入”保存就完成了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、记事本 采用技术:面向
18、过程 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函数的程序流程图。 开始
19、
i 20、L操作交替进行,通过调用各个函数以及操作EXCEL,实现不同的功能。因为EXCEL本身具有读取网页数据的功能,所以可以直接利用EXCEL读取HTML文件中的数据,然后再利用C++程序读取EXCEL文件。要达到这一目的,首先要设置建立C++与EXCEL之间的联系并运用C++编程打开EXCEL。在C++中创建VC界面使操作简洁明了,VC界面中的每一个按键都有一个成员函数与之相对应,在成员函数里编写程序定义按键的功能。作为一个读取HTML文件数据的程序,这样的设计增大了程序的实用性。
2.3.2 基础知识简介
1、HTML表格及其分类:
HTML表格通过属性-值对来描述对象,内容为对象属性的单 21、元格称为属性域,内容为属性对应值的单元格称为值域。在HTML表格中,表格由table元素标记,它由若干行元素(row)构成,每一行又由若干单元(cell)构成。这些单元可以表示表头信息的th元素,也可以是表示数据信息的td元素。单元可以跨越多个列或多个行,跨越的行、列数分别由th或td元素的rowspan与colspan属性指定。本文应用示例表格如图4所示:
图4
示例表格对应的HTML文档如下:
23、
HTML表格结构比较复杂,从形式上可以分为简单表格与复杂表格2类。其中,简单表格又可以分为3种:
(1)行标题表(属性在前n行);
(2)列标题表(属性在前m行);
(3)行列标题表(属性分别在前n行与前m列)。
本文所用示例表格即为简单表格中的行标题表。
2、MFC中EXCEL相关类的添加
(1)启动VC 6.0,打开新建对话框,新建一个MFC AppWizard(exe)工程,这里工程名设置为Test,点击“确定”;之后选择“基本对话框”,点击“完成”;最后再点击“确定”。所有过程如图5的3张图片所示:
姓名
班级
住址
周三
数学 1101
西安碑林区
李四
数学 1101
西安雁塔区
王五
数学 1101
西安长安区
24、 图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
25、 成功之后,工程文件结构图如图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(); #
26、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 到此,自动化工程建立完成,
27、建立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 n
28、otification 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.GetWorkbo
29、oks(); //获取工作簿集合 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窗
30、口,点击“数据”里的“自网站”,会出现一个窗口,见图11; 数据 自网站 图11 在地址里输入网站地址,找到所需要的表格点击导入,就可以将HTML文件中的数据读到Excel里。过程及结果如图12所示: 图12 3、C++程序读取EXCEL文件中的数据 点击图8中Test对话框的“读取Excel”,在弹出的窗口中选出需要打开的Excel文件,点击“打开”即能读出Excel里的数据,过程及结果如图13所示。 图13 三、设计总结 通过这次课程设计,我拓宽了知识面,锻炼了能力,综合素质得到较大提高。 本次课程设计,使我对用C++程序读取HTML文件中的数据的基本
31、过程的设计方法、步骤、思路、有一定的了解与认识。在课程设计过程中,我基本能按照规定的程序进行,先针对MFC和HTML的使用收集、调查有关资料,其间,同组成员之间进行几次方案的讨论、修改,再讨论、再修改,最后定案。设计方案初步确定后,再进行扩充详细设计,最终用C++语言实现了MFC读取HTML文件中的数据。整个过程周密有序,对我按时高质完成课程设计非常有利!但是严格说起来,我们这次做的程序并不能直接用MFC读取HTML文件中的数据,它是以Excel为桥梁,先用Excel读取HTML文件数据,再用MFC读取Excel文件中的数据,整个过程有些复杂,还需要我们进一步去改进它,完善它。 总的来说,本
32、次课程设计基本达到了专业学习的预期目的。课程设计之后,我不仅仅是感到实际动手能力有所提高,更重要的是进一步激发了我对专业知识的兴趣,并能够结合实际存在的问题在专业领域内进行更深入的学习。 作为一个应用数学专业的本科生来说,实际能力的培养至关重要,而这种实际能力的培养单靠课堂教学是远远不够的,必须从课堂走向实践。通过此次课程设计,让我找出自身状况与实际需要的差距,并在以后的学习期间及时补充相关知识,为求职与正式工作做好充分的知识、能力准备,从而缩短从校园走向社会的心理转型期。 参考文献 [1]肖宏伟,Visual C++实效编程百例(第二版)[M],北京:人民邮电出
33、版社,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.






