1.首先安装OFFICE软件[Office 2021 ProPlus],此版本为OFFICE16

2.进入VS2017或以下的开发环境,使用快捷键调出CTRL+SHIFT+A调出【添加类】

要VS2017以上的版本,无法添加此库,得手动添加比较麻烦,建议用2017加载完后再用VS2017以上的开发环境。

选中Visual C++=》MFC=》Typelib中的MFC类

OFFICE的Excel地址为:C:\Program Files\Microsoft Office\root\Office16,其他OFFICE版本大同小异

3.注释头文件避免错误

把刚才导入的头文件的import操作全部注释掉避免出现错误

头文件为:

CApplication
CWorkbook
CWorksheet
CRange
CWorksheets
CWorkbooks
//#import "C:\\Program Files (x86)\\Microsoft Office\\Office12\\EXCEL.EXE" no_namespace

进入CRange.h中把第335行代码

VARIANT DialogBox()
//改为VARIANT _DialogBox()

4.封装Excel操作

添加Excel.h输入:

#pragma once
#include "CApplication.h"
#include "CRange.h"
#include "CWorkbook.h"
#include "CWorkbooks.h"
#include "CWorksheet.h"
#include "CWorksheets.h"
#include "stdafx.h"class Excel
{
public:Excel();~Excel();void show(bool bShow);//检查一个cell是否为字符串bool isCellString(long iRow, long iColumn);//检查一个cell是否为数值bool isCellInt(long iRow, long iColumn);//得到一个cell的stringCString getCellString(long iRow, long iColumn);//得到一个cell的总数int getCellInt(long iRow, long iColumn);//得到一个cell的double数据double getCellDouble(long iRow, long iColumn);//取得行的总数int getRowCount();//取得列的总数int getColumnCount();//使用某个shellbool loadSheet(long tableId, bool preLoaded = false);bool loadSheet(CString sheet, bool preLoaded = false);//通过序号取得某个sheet的名称CString getSheetName(long tableID);//得到sheet的总数int getSheetCount();//打开excel文件bool open(const char* fileName);//关闭打开的excel文件void close(bool ifSave = false);//另存为一个excel文件void saveAsXLSFile(const CString &xlsFile);//取得打开文件的名称CString getOpenFileName();//取得打开sheel的名称CString getOpenSheelName();//向cell中写入一个int值void setCellInt(long iRow, long iColumn, int newInt);//向cell中写入一个字符串void setCellString(long iRow, long iColumn, CString newString);
public://初始化 Excel_OLEstatic bool initExcel();//释放Excel_OLEstatic void release();//取得列的名称static char* getColumnName(long iColumn);
protected:void preLoadSheet();
private:CString openFileName;CWorkbook workBook;           //当前处理的文件CWorkbooks books;             //ExcelBook集合,多文件时使用CWorksheet workSheet;         //当前使用sheetCWorksheets sheets;           //Excel的sheet集合CRange currentRange;           //当前操作区域bool isLoad;                   //是否已经加载了某个sheet数据COleSafeArray safeArray;
protected:static CApplication application;   //Excel进程实例
};

添加Excel.cpp

//Excel.cpp
#include "stdafx.h"
#include <tchar.h>
#include "Excel.h"COleVariant
covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
CApplication Excel::application;
Excel::Excel() :isLoad(false)
{
}
Excel::~Excel()
{//close();
}bool Excel::initExcel()
{//创建Excel 2000服务器(启动Excel)   if (!application.CreateDispatch(_T("Excel.application"), nullptr)){MessageBox(nullptr, _T("创建Excel服务失败,你可能没有安装EXCEL,请检查!"), _T("错误"), MB_OK);return FALSE;}application.put_DisplayAlerts(FALSE);return true;
}
void Excel::release()
{application.Quit();application.ReleaseDispatch();application = nullptr;
}bool Excel::open(const char*  fileName)
{   close();//先关闭文件//利用模板建立新文档books.AttachDispatch(application.get_Workbooks(), true);LPDISPATCH lpDis = nullptr;lpDis = books.Add(COleVariant(CString(fileName)));if (lpDis){workBook.AttachDispatch(lpDis);sheets.AttachDispatch(workBook.get_Worksheets());openFileName = fileName;return true;}return false;
}void Excel::close(bool ifSave)
{   if (!openFileName.IsEmpty())//如果文件已经打开,关闭文件{//如果保存,交给用户控制,让用户自己存,如果自己SAVE,会出现莫名的等待  if (ifSave){//show(true);}else{workBook.Close(COleVariant(short(FALSE)), COleVariant(openFileName), covOptional);books.Close();}//清空打开文件名称openFileName.Empty();}sheets.ReleaseDispatch();workSheet.ReleaseDispatch();currentRange.ReleaseDispatch();workBook.ReleaseDispatch();books.ReleaseDispatch();
}void Excel::saveAsXLSFile(const CString &xlsFile)
{workBook.SaveAs(COleVariant(xlsFile),covOptional,covOptional,covOptional,covOptional,covOptional,0,covOptional,covOptional,covOptional,covOptional,covOptional);return;
}int Excel::getSheetCount()
{return sheets.get_Count();
}CString Excel::getSheetName(long tableID)
{CWorksheet sheet;sheet.AttachDispatch(sheets.get_Item(COleVariant((long)tableID)));CString name = sheet.get_Name();sheet.ReleaseDispatch();return name;
}void Excel::preLoadSheet()
{CRange used_range;used_range = workSheet.get_UsedRange();VARIANT ret_ary = used_range.get_Value2();if (!(ret_ary.vt & VT_ARRAY)){return;}  safeArray.Clear();safeArray.Attach(ret_ary);
}
//按照名称加载sheet表格,也可提前加载所有表格
bool Excel::loadSheet(long tableId, bool preLoaded)
{LPDISPATCH lpDis = nullptr;currentRange.ReleaseDispatch();currentRange.ReleaseDispatch();lpDis = sheets.get_Item(COleVariant((long)tableId));if (lpDis){workSheet.AttachDispatch(lpDis, true);currentRange.AttachDispatch(workSheet.get_Cells(), true);}else{return false;}isLoad = false;//如果进行预先加载  if (preLoaded){preLoadSheet();isLoad = true;}return true;
}
bool Excel::loadSheet(CString sheet, bool preLoaded)
{LPDISPATCH lpDis = nullptr;currentRange.ReleaseDispatch();currentRange.ReleaseDispatch();lpDis = sheets.get_Item(COleVariant(sheet));if (lpDis){workSheet.AttachDispatch(lpDis, true);currentRange.AttachDispatch(workSheet.get_Cells(), true);}else{return false;}isLoad = false;   if (preLoaded)//如果进行预先加载 {preLoadSheet();isLoad = true;}return true;
}
int Excel::getColumnCount()
{CRange range;CRange usedRange;usedRange.AttachDispatch(workSheet.get_UsedRange(), true);range.AttachDispatch(usedRange.get_Columns(), true);int count = range.get_Count();usedRange.ReleaseDispatch();range.ReleaseDispatch();return count;
}
int Excel::getRowCount()
{CRange range;CRange usedRange;usedRange.AttachDispatch(workSheet.get_UsedRange(), true);range.AttachDispatch(usedRange.get_Rows(), true);int count = range.get_Count();usedRange.ReleaseDispatch();range.ReleaseDispatch();return count;
}bool Excel::isCellString(long iRow, long iColumn)
{CRange range;range.AttachDispatch(currentRange.get_Item(COleVariant((long)iRow), COleVariant((long)iColumn)).pdispVal, true);COleVariant vResult = range.get_Value2();    if (vResult.vt == VT_BSTR)//VT_BSTR标示字符串  {return true;}return false;
}
bool Excel::isCellInt(long iRow, long iColumn)
{CRange range;range.AttachDispatch(currentRange.get_Item(COleVariant((long)iRow), COleVariant((long)iColumn)).pdispVal, true);COleVariant vResult = range.get_Value2();    if (vResult.vt == VT_INT || vResult.vt == VT_R8)//VT_BSTR标示字符串  {return true;}return false;
}
CString Excel::getCellString(long iRow, long iColumn)
{COleVariant vResult;CString str;//字符串  if (isLoad == false){CRange range;range.AttachDispatch(currentRange.get_Item(COleVariant((long)iRow), COleVariant((long)iColumn)).pdispVal, true);vResult = range.get_Value2();range.ReleaseDispatch();}//如果数据依据预先加载了  else{long read_address[2];VARIANT val;read_address[0] = iRow;read_address[1] = iColumn;safeArray.GetElement(read_address, &val);vResult = val;}if (vResult.vt == VT_BSTR){str = vResult.bstrVal;}//整数  else if (vResult.vt == VT_INT){str.Format(_T("%d"), vResult.pintVal);}//8字节的数字   else if (vResult.vt == VT_R8){str.Format(_T("%0.0f"), vResult.dblVal);}//时间格式  else if (vResult.vt == VT_DATE){SYSTEMTIME st;VariantTimeToSystemTime(vResult.date, &st);CTime tm(st);str = tm.Format(_T("%Y-%m-%d"));}//单元格空的      else if (vResult.vt == VT_EMPTY){str = "";}return str;
}
double Excel::getCellDouble(long iRow, long iColumn)
{double rtn_value = 0;COleVariant vresult;//字符串  if (isLoad == false){CRange range;range.AttachDispatch(currentRange.get_Item(COleVariant((long)iRow), COleVariant((long)iColumn)).pdispVal, true);vresult = range.get_Value2();range.ReleaseDispatch();}//如果数据依据预先加载了  else{long read_address[2];VARIANT val;read_address[0] = iRow;read_address[1] = iColumn;safeArray.GetElement(read_address, &val);vresult = val;}if (vresult.vt == VT_R8){rtn_value = vresult.dblVal;}return rtn_value;
}int Excel::getCellInt(long iRow, long iColumn)
{int num;COleVariant vresult;if (isLoad == FALSE){CRange range;range.AttachDispatch(currentRange.get_Item(COleVariant((long)iRow), COleVariant((long)iColumn)).pdispVal, true);vresult = range.get_Value2();range.ReleaseDispatch();}else{long read_address[2];VARIANT val;read_address[0] = iRow;read_address[1] = iColumn;safeArray.GetElement(read_address, &val);vresult = val;}//    num = static_cast<int>(vresult.dblVal);return num;
}void Excel::setCellString(long iRow, long iColumn, CString newString)
{COleVariant new_value(newString);CRange start_range = workSheet.get_Range(COleVariant(_T("A1")), covOptional);CRange write_range = start_range.get_Offset(COleVariant((long)iRow - 1), COleVariant((long)iColumn - 1));write_range.put_Value2(new_value);start_range.ReleaseDispatch();write_range.ReleaseDispatch();
}void Excel::setCellInt(long iRow, long iColumn, int newInt)
{COleVariant new_value((long)newInt);CRange start_range = workSheet.get_Range(COleVariant(_T("A1")), covOptional);CRange write_range = start_range.get_Offset(COleVariant((long)iRow - 1), COleVariant((long)iColumn - 1));write_range.put_Value2(new_value);start_range.ReleaseDispatch();write_range.ReleaseDispatch();
}void Excel::show(bool bShow)
{application.put_Visible(bShow);application.put_UserControl(bShow);
}CString Excel::getOpenFileName()
{return openFileName;
}CString Excel::getOpenSheelName()
{return workSheet.get_Name();
}char* Excel::getColumnName(long iColumn)
{static char column_name[64];size_t str_len = 0;while (iColumn > 0){int num_data = iColumn % 26;iColumn /= 26;if (num_data == 0){num_data = 26;iColumn--;}column_name[str_len] = (char)((num_data - 1) + 'A');str_len++;}column_name[str_len] = '\0';//反转  _strrev(column_name);return column_name;
}

5.使用Excel库操作

加载Excel表

 CStatic m_sheetname;    bool bInit = m_excel.initExcel();//初始化Excelchar path[MAX_PATH];//路径GetCurrentDirectoryA(MAX_PATH, path);//获取当前的工作目录strcat_s(path,"\\Data\\All Data.xls");//设置要打开文件的完整路径bool bRet = m_excel.open(path);//打开Excel文件CString strSheetName = m_excel.getSheetName(14);//获取sheet表名m_sheetname.SetWindowTextW(strSheetName);bool bLoad = m_excel.loadSheet(strSheetName);//装载sheet

读Excel表

 int nRow = m_excel.getRowCount();//获取sheet中行数int nCol = m_excel.getColumnCount();//获取sheet中列数CString cell;cell = m_excel.getCellString(1, 1);

具体接口函数,查看相关的Excel接口文件

VS2017 MFC操作Excel相关推荐

  1. MFC操作Excel增删改查

    本文是在MFC中操作excel,并将excel中的数据导进到listCtrl控件中,并在控件中进行增删改查操作,同时保存到excel表中. 新建MFC项目 应用程序添加,基于对话框模式,下一步,直到 ...

  2. 【关于MFC操作Excel表格的一些经验】

    前段时间花个两个星期做了两个和excel表格有关的软件,所以在这里记录下一些经验: 操作excel表格主要两种方法: 一.使用SpreadSheet类操作: 在前面加一个文件打开的函数:dlg. fi ...

  3. 【MFC/C++操作Excel】Excel篇 (OLE/COM)

    MFC操作Excel 下面的操作基于Excel2003 一.初始化操作 1.导入类库 点击查看->建立类向导-> Add Class...\From a type Library...-& ...

  4. 使用MFC自动化操作Excel文档

    使用MFC自动化操作Excel文档 项目中要用到MFC操作Excel文件,在网上搜的结果,有把Excel当数据库处理的,也有直接操作Excel的,最终在MSDN上看到的结果,测试后觉得好用些. 使用基 ...

  5. VC2010操作Excel的方法

    第一种方法是添加Microsoft的类库时,在注册表中可以直接找到类库 本文介绍VC2010环境如何实现EXCEL操作,介绍了详细步骤并给出了具体的程序代码. 1. 创建新的C++工程 创建基于对话框 ...

  6. VS2008环境使用MFC操作读取excel文件

    踏破铁鞋无觅处,得来费死了工夫. 本文章的引用来源,本人综合而成. http://blog.csdn.net/chasemylov/archive/2010/08/27/5844826.aspx ht ...

  7. MFC中使用OLE/COM操作EXCEL的方法

    使用OLE的方法操作EXCEL,首先计算机必须安装excel,这样才会有接口暴露出来.本次使用大神封装好的类. excel作为OLE/COM库插件,定义好了各类交互接口,而且这些接口是跨语言的,可以导 ...

  8. MFC读写Excel操作——遇到的问题

    前言 在MFC读写Excel表格时,稍微有一点点点的问题,都不能通过.甚至,仅仅是调整几行代码,也不能通过.把这些坑记录下来,分享出来. 坑-No.1 CString sDriver = L" ...

  9. VC操作Excel文件编程相关内容总结

    最近在做个数据库程序,因为有些数据用户要求导出到Excel文件显示(需要报给其他单位).所以查阅了一下相关的VC的Excel编程操作,总结一下吧:(所有资料来源于网络) 利用VC操作Excel的方法至 ...

最新文章

  1. Visual Studio跨平台开发实战(2) - Xamarin.iOS基本控制项介绍
  2. mysql decs倒叙查询_mysql按照日期方式查询
  3. 【NLP】基于TF-IDF和KNN的模糊字符串匹配优化
  4. boost::mp11::mp_map_update相关用法的测试程序
  5. 这里有 40 本 Python 书等你来领取!(任选)
  6. 【转载】用廉价的315M遥控模块实现数据传输
  7. 深度学习目标检测算法综述(论文和代码)
  8. JavaScript 面试总结
  9. 【多图】Google工程师解析Android系统架构--what is android(转载)
  10. 一个多文件编程里.h文件定义static变量产生的问题
  11. URLLoader 类和 URLVariables 类
  12. python3闭包通俗解释_python通俗解说闭包
  13. SQL查询数据以及排序
  14. 计算机毕业设计Java教材管理系统(源码+系统+mysql数据库+Lw文档)
  15. 理解OFDM技术原理
  16. win10如何把计算机名改成英文名,两种方法轻松搞定win10专业版中文用户名改为英文用户名...
  17. java封装与调用方法_java方法和封装
  18. Windows防火墙配置脚本讲解
  19. C#—飞行棋超全总结(全注释版)
  20. Windows下tracert命令

热门文章

  1. 如何理解国产操作系统,现状又是如何?
  2. 《隐忍的老虎司马懿》
  3. 打印机一页内容总是有空白
  4. JavaPOI导出Excel合集——Java导出全内容
  5. phpstudy安装和使用
  6. 雪球产品,场外雪球结构介绍
  7. 【接口时序】5、QSPI Flash的原理与QSPI时序的Verilog实现(转载)https://www.cnblogs.com/liujinggang/p/9651170.html
  8. mxnet load生成的json模型告警src/nnvm/legacy_json_util.cc:204: Warning: loading symbol saved by MXNet versio
  9. 西南科技大学 Python程序设计 班长选举
  10. HLS(一)Vivado高层次综合概述