2019.04.13-04.15
处理大批量Excel数据时,并且数据处理行为模式一致,考虑采用C++进行批量处理,降低工作量。在查阅相关资料后,发现用的较多的有OLE的方式,能实现基本的excel功能,完成大部分的数据处理,利用OLE加载Excel程序的前提是电脑中安装有Mircosoft office excel。具体的操作方法,需要包含Excel加载所需的头文件,可以参考网上加载相关头文件的方法,已经加载好的头文件,下载完成后,直接放在运行文件目录下即可直接使用。
一:Excel文件新建,保存
1:添加头文件,创建数据对象
#include <CApplication.h>
#include <CWorkBooks.h>
#include <CWorkBook.h>
CApplication m_app; //关联启动Excel文件
CWorkBooks m_books; //创建多个工作簿
CWorkBook m_book; //当前工作簿
2:关联程序,添加工作簿
//关联调度Excel程序
m_books.AttachDispatch(p_ExcelApp->get_Workbooks(),true);
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
//添加新的工作簿对象,用于新建Excel文件
m_book = m_books.Add(cvOptional);
//保存新工作簿
m_book.SaveAs(COleVariant("E:\\saveexcel.xlsx"),
covOptional, covOptional,covOptional,covOptional, covOptional, 0,
covOptional, covOptional, covOptional,covOptional, covOptional);
3:释放工作对象
m_book.RelaeseDispatch();
m_books.RelaeseDispatch();
m_books.Close();
p_app.ReleaseDispatch();
p_app.Quit();
二:Excel数据读取,处理
1:添加头文件, 创建数据对象
#include <CApplication.h>
#include <CWorkBooks.h>
#include <CWorkBook.h>
#include <CWorkSheets.h>
#include <CWorkSheet.h>
#include <CRange.h>
CApplication m_app; //关联启动Excel文件
CWorkBooks m_books; //创建多个工作簿
CWorkBook m_book; //当前工作簿
CWorkSheets m_sheets; //工作列表
CworkSheet m_sheet; //当前工作表格
Crange m_range; //数据单元格
2:关联Excel程序,打开工作簿
//创建调度Excel程序
m_app.CreateDispatch("Excel.Application",NULL);
//关联调用工作簿
m_books.AttachDispatch(m_app.get_WorkBooks(),true);
//打开工作簿
m_book = m_books.open("打开文件全路径",cvOptional,
covOptional,covOptional,covOptional,covOptional,
covOptional,covOptional,covOptional,covOptional,
covOptional,covOptional,covOptional,covOptional);
3:获取多个列表,打开工作表
//关联所有工作列表
m_sheets.AttachDispatch(m_book.get_Worksheets(),true);
//打开工作列表
m_sheet = m_sheet.get_Item(COleVariant("sheet1"));
4:获取数据单元格,单元处理
//获取工作范围
m_range = m_sheet.get_UsedRange();
//关联调度所有单元格
m_range.AttachDispatch(m_sheet.get_Cells(), true);
//读取单个单元格
CRange read_cell;
//关联调用相应位置的单元格,注意单元格从(1,1)开始索引
//若是合并的单元格内容,则获取所有合并单元格的第一个,其余的为空格
read_cell.AttachDispatch(m_range.get_Item(COleVariant((long)3),
COleVariant((long)3)).pdispVal,
true);
//取值
COleVariant vResult = read_cell.get_Value2();
float cell_data = vResult.dblVal; //注意此处数据格式的转换,可在转换前添加数据类型判断
//释放关联对象
read_cell.ReleaseDispatch();
注意一点,Excel单元格是从1开始索引的,不是从0,若是从0开始索引会出现异常。
5:释放工作对象,和创建相反过程
m_range.ReleaseDispatch();
m_sheet.ReleaseDispatch();
m_sheets.ReleaseDispatch();
m_book.ReleaseDispatch();
m_books.Close();
m_books.ReleaseDispatch();
p_ExcelApp->Quit();
p_ExcelApp->ReleaseDispatch();