1、在菜单栏的“项目”->“添加新项目”->MFC下的Type Liabrary 选择 mircosoft excel....可看到对应的dll文件路径,从文件夹中添加。
主要用到以下几个类:
_Application:表示整个的Excel应用程序,包含一个工作簿集合
Workbooks:工作簿集合,包含N个工作簿(Workbook)
_Workbook:工作簿,包含一个工作表(sheets)集合
Worksheets:工作表集合,包含N个工作表
_Worksheet:工作表,也就是我们在Excel中看到的Sheet1、Sheet2、Sheet3,它是我们操作Excel的基本单位
Range:这是单元格的集合,我们知道Excel是由一个个的单元格组成的,通过Range来操作单元格
Font:用于设置单元格的字体、颜色、字号、粗体设置
Interior:设置底色
Boards:设置区域内所有单元格的边框,如果要设置一组区域的外边框的话用Rang->BorderAround设置
下面举个我自己的例子进行说明
通常在App的InitInstance()里面加入初始化和关闭COM库的操作,在DoModal()调用之前加入初始化的代码:
if (!AfxOleInit())
{
AfxMessageBox(_T("注册COM出错!"));
return FALSE;
}
因为加载的类与vs本身自带的起了冲突。解决办法:
1,注释掉每个头文件的
#import “C:\Program Files\Microsoft Office\Office12\EXCEL.EXE” no_namespace,
2,在添加的头文件中每个里面都加入#include
3,然后在CRange.h中的 VARIANT DialogBox() 改成 VARIANT _DialogBox()
4.在stdafx.h文件中,添加
#include "CApplication.h"
#include "CRange.h"
#include "CWorkbook.h"
#include "CWorkbooks.h"
#include "CWorksheet.h"
#include "CWorksheets.h"
#include"CFont0.h"
#include"Cnterior.h"
#include"CBorder.h"
在.h中定义一些全局变量。
CApplication app;
CWorkbooks books;
CWorkbook book;
CWorksheets sheets;
CWorksheet sheet;
CRange range;
LPDISPATCH lpDisp;
COleVariant vResult;
CString str = _T("");
在*dlg.cpp文件中进行操作
打开Excel表格,进行一系列对象的初始化:
void CFirstWorkDlg::OpenExcel(CString szFileName,INT iSheet)
{
if (!app.CreateDispatch(_T("Excel.Application"), NULL))
{
AfxMessageBox(_T("Create Excel service failure!"));
return;
}
// 设置为FALSE时,后面的app.Quit();注释要打开
// 否则EXCEL.EXE进程会一直存在,并且每操作一次就会多开一个进程
app.put_Visible(FALSE);
books.AttachDispatch(app.get_Workbooks(), true);
/*
* 打开一个工作簿。
* Excel 2000 只需要13个参数就行,Excel 2003需要15个参数
*/
lpDisp = books.Open(szFileName,
covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional);
ASSERT(lpDisp);
book.AttachDispatch(lpDisp);
// 得到Worksheets
sheets.AttachDispatch(book.get_Worksheets(), true);
// 得到Worksheet
sheet.AttachDispatch(sheets.get_Item(_variant_t(iSheet)));
// 得到全部Cells
//range.AttachDispatch(sheet.get_Cells(), true);
}
按钮单击事件函数,读取Excel表格内容并放到ListControl控件中
void CFirstWorkDlg::OnBnClickedRead()
{
CFileDialog fileDlg(TRUE, _T("(*.xls)|*.xls"), NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
_T("Material File(*.xls)|*.xls||"), this);
CString szFileName;
if (fileDlg.DoModal() == IDOK)
{
szFileName = fileDlg.GetPathName();
}
//CString szFileName = _T("C:\\Users\\Administrator\\Desktop\\ENGDATA.xls");
INT iSheet = 1;
OpenExcel(szFileName,iSheet);
m_list.DeleteAllItems();
CRange oCurSel;
range.AttachDispatch(sheet.get_UsedRange());
range.AttachDispatch(range.get_Rows());
long row = range.get_Count();
range.AttachDispatch(range.get_Columns());
long col = range.get_Count();
range.AttachDispatch(sheet.get_Cells(), true);
for (int i = 1; i <= row; ++i)
{
for (int j = 1; j <= col; ++j)
{
oCurSel.AttachDispatch(range.get_Item(_variant_t((long)i), _variant_t((long)j)).pdispVal);
vResult = oCurSel.get_Text();
//VARIANT res = oCurSel.get_Text();
//CString strRes = res.bstrVal;
str = vResult.bstrVal;
if (1 == i)
m_list.InsertColumn(j-1, str, LVCFMT_CENTER, 100, -1);
else if (1 == j)
m_list.InsertItem(i-2, str);
else
m_list.SetItemText(i-2,j-1, str);
/*
switch (vResult.vt)
{
case VT_BSTR: // 字符串
str = vResult.bstrVal;
break;
case VT_R8: // 8字节的数字
str.Format(_T("%f"), vResult.dblVal);
break;
case VT_DATE: // 时间格式
SYSTEMTIME st;
VariantTimeToSystemTime(vResult.date, &st);
break;
case VT_EMPTY: // 单元格空的
str = "";
break;
}
*/
}
}
CloseExcel();
}
释放对象。
void CFirstWorkDlg::CloseExcel()
{
// book.Save(); // 保存Excel的内容
// app.put_DisplayAlerts(true); // 弹出对话框询问是否保存
app.Quit(); // 退出
//释放对象
range.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
app.ReleaseDispatch();
}
https://blog.csdn.net/mars_xiaolei/article/details/79077480
上面就是一些对于Excel的基本操作,如果有什么问题希望大家能够指出!