利用C++编程从TXT文档中提取数据生成EXCEL表格,求代码和注释
答案:2 悬赏:20
解决时间 2021-02-26 22:31
- 提问者网友:控制庸俗
- 2021-02-26 07:31
利用C++编程从TXT文档中提取数据生成EXCEL表格,求代码和注释
最佳答案
- 二级知识专家网友:气场征服一切
- 2021-02-26 08:44
只有java的-,-帮不到你。
全部回答
- 1楼网友:没感情的陌生人
- 2021-02-26 10:19
1、添加ole/com支持。
首先,应用程序必须添加对ole/com的支持,才能导入ole/com组件。
本文使用的是mfc对话框程序,在创建工程的向导中选中automation选项即可为程序自动添加相应的头文件和ole库初始化代码。
通过查看源代码,可以知道在stdafx.h的头文件中,添加了ole/com很多类所需添加的头文件。
#include // mfc 自动化类
同时,在应用程序类的initinstance函数中,添加了ole/com的初始化代码,如下所示:
// 初始化 ole 库
if (!afxoleinit())
{
afxmessagebox(idp_ole_init_failed);
return false;
}
2、导入并封装excel中的接口
excel作为ole/com库插件,定义好了各类交互的接口,这些接口是跨语言的接口。vc可以通过导入这些接口,并通过接口来对excel的操作。
由于本文只关心对excel表格中的数据的读取,主要关注几个_application、workbooks、_workbook、worksheets、_worksheet、range等几个接口。excel的各类接口的属性、方法可以通过msdn的office development进行查询。
vs2010导入ole/com组件的接口的步骤为:project->class wizard->add class->mfc class from typelib,先选择要导入的组件所在的路径,即excel.exe所在的路径,然后再选择
要导入的excel类型库中的接口。
在完成接口导入后,vs2010将自动为导入的接口创建相应的实现类,用于对接口属性和方法的实现。由于标准的c++没有属性访问器,只能添加一个两个存取函数来实现对属性的访问,通过在属性名称前加上get_和put_前缀分别实现对属性的读写操作。即,由vc自动完成c++类对接口的封装。
本文所导入的接口对应的类和头文件的说明如下所示:
excel接口
导入类
头文件
说明
_application
capplicaton
application.h
excel应用程序。
workbooks
cworkbooks
workbooks.h
工作簿的容器,里面包括了excel应用程序打开的所有工作簿。
_workbook
cworkbook
workbook.h
单个工作簿。
worksheets
cworksheets
worksheets.h
单个工作簿中的sheet表格的容器,包括该工作簿中的所有sheet。
_worksheet
cworksheet
worksheet.h
单个sheet表格。
range
crange
range.h
一定数量的单元格,可对单元格进行单个或多个单元格进行操作。
3、导入excel的整个类型库
接口对应类只是对接口的属性和方法进行了封装,而excel中的数据类型,如枚举类型却并为并不能使用,因此,为了更方便的操作excel,还需要导入excel的数据类型。
通过查看导入接口对应的头文件可以发现,在所有导入接口的头文件中,都会有这么行:
#import "d:\\program files\\microsoft office\\office12\\excel.exe" no_namespace
这行代码的作用是导入excel整个类型库到工程中。
由vs2010自动产生的导入代码存在以下几个问题:
(1)如果导入了多个接口,每个头文件都会把类型库导入一次,如果引用多个头文件,会导致类型库重复导入。
(2)excel类型库中有些类型会跟mfc类库的某些类型冲突。
(3)excel类型库的某些类型跟其他office和vb的某些库相关,如果不导入相关库,将导致这些类型无法使用。。
以上三点问题的解决方法如下:
(1)仅在_application接口对应头文件中导入excel类型库。
(2)对冲突的类型进行重命名。
(3)在导入excel类型库之前,先导入office和vb的相关库。
更改后的导入类型库的代码如下:
#import "c:\\program files\\common files\\microsoft shared\\office12\\mso.dll" \
rename("rgb", "msorgb") \
rename("documentproperties", "msodocumentproperties")
using namespace office;
#import "c:\\program files\\common files\\microsoft shared\\vba\\vba6\\vbe6ext.olb"
using namespace vbide;
#import "d:\\program files\\microsoft office\\office12\\excel.exe" \
rename("dialogbox", "exceldialogbox") \
rename("rgb", "excelrgb") \
rename("copyfile", "excelcopyfile") \
rename("replacetext", "excelreplacetext") \
no_auto_exclude
using namespace excel;
编译程序后,会在debug或release目录下生成三个文件mso.tlh、vbe6ext.tlh和excel.tlh。通过打开文件可知,该三个文件的命名空间分别是office、vbide和excel。导入了excel的整个类型库后,就可以使用excel中的所有类型了。
4、操作excel步骤
操作excel的主要步骤如下:
(1)创建一个excel应用程序。
(2)得到workbook的容器。
(3)打开一个workbook或者创建一个workbook。
(4)得到workbook中的worksheet的容器。
(5)打开一个worksheet或者创建一个worksheet。
(6)通过range对worksheet中的单元格进行读写操作。
(7)保存excel。
(8)释放资源。
5、批量处理excel表格
vc通过ole/com操作excel,是通过进程间的组件技术。因此,每次读写excel中的单元格时,都要进行进程间的切换。当数据量大,如果一个单元格一个单元格的读取,主要的时间都花费在进程切换中。因此读取多个单元格,将可有效的提高程序的运行效率。
对多个单元格的读写操作可以通过crange中以下两个成员函数来完成。
variant get_value2();
void put_value2(variant& newvalue);
其中,输入参数newvalue只要输入一个二维数组,即可实现向excel中一次写入多个单元格的值。
当然,在对crange类进行操作之前,要设置crange类对应的单元格。
6、excel表格的保存
(1)如果要保存打开的工作簿,使用cworkbook类的save函数就可以保存工作簿,原文件将被覆盖。
(2)如果是新创建的工作簿,或者是要另存为,可使用cworkbook类的saveas函数。
saveas的参数比较多。其中,第1个参数是设置要保存文件的路径;第2个参数是设置文件的格式,可在msdn中查看枚举类型xlfileformat来了解excel的文件格式。经过测试,在本文所用的测试环境中,excel2003的文件格式是xlexcel8,excel2007的文件格式是xlexcel4。
7、获取当前excel的版本
可以通过capplication的get_version函数来获得excel的版本,其中,excel2007的主版本号是12,excel2003的主版本号是11。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯