1、导入EXCEL控件
打开类向导,添加类型库中的MFC类

选择文件来源,打开EXCEL.EXE所在的文件路径

然后添加如下图所示的几个类,这几个类可以满足基本的读写

然后把新添加的这几个类中头文件中的 #import注释掉

当引用头文件准备使用时,会发现有个错误,此时在DialogBox()前增加一个下划线,变成VARIANT _DialogBox() 就可以正常使用了

2、初始化Ole环境
在程序初始化之后调用AfxOleInit();
在程序关闭之前调用AfxOleTerm();
3、调用
初始化EXCEL调用环境
CApplication excelApp;
//启动Excel
if (!excelApp.CreateDispatch(_T("Excel.Application"), NULL))
{
AfxMessageBox(_T("启动Excel失败!"));
return FALSE;
}
获取工作簿和sheet页(EXCEL已经存在)
CWorkbook book;
CWorkbooks books;
CWorksheets sheets;
CWorksheet sheet;
// 解析EXCEL
COleVariant
covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
books.AttachDispatch(excelApp.get_Workbooks(), TRUE);
book = books.Open(strExcelPath, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional);
sheets = book.get_Worksheets();
//获取第一个工作表
sheet = sheets.get_Item(COleVariant((short)1));
创建一个新的工作簿
CWorkbook bookNew = books.Add(covOptional);
对EXCEL的数据
进行操作
CRange usedRange;
usedRange.AttachDispatch(sheet.get_Cells(), TRUE);
// 或者如下(AttachDispatch和等于是两种不同的使用方式)
usedRange = sheet.get_UsedRange();
// 获取某个单元格,i,j从1开始
usedRange.AttachDispatch(usedRange.get_Item(COleVariant(long(i)), COleVariant(long(j))).pdispVal, TRUE);
// 或者如下
usedRange= usedRange.get_Item(COleVariant(long(i)), COleVariant(long(j))).pdispVal;
usedRange.put_Item(COleVariant(long(i)), COleVariant(long(j)), COleVariant(_T("文字内容"));
// 如果需要写入数字,则需要先设置格式,如下:
usedRange.put_NumberFormat(COleVariant(_T("@")));
usedRange.put_Item(COleVariant(long(i)), COleVariant(long(j)), COleVariant(_T("2025"));
// 读取或者写入单个单元格,还可以使用
COleVariant ret = usedRange.get_Value2();
usedRange.put_Value2(ret);
如果需要读取一整行数据,但不希望每次都用get_Item读取一个单元格,则可以使用COleSafeArray
// 读取整行
CRange range, cell;
range.AttachDispatch(sheet.get_UsedRange());
int nColumnCount = (CRange(range.get_Columns())).get_Count();
TCHAR chEnd = 'A' + nColumnCount;
CString strRange;
strRange.Format(_T("A1:%c1"), chEnd);
CRange rowHead = range.get_Range(COleVariant(strRange), covOptional);
// 获取值数组
COleSafeArray sa = rowHead.get_Value2();
CStringArray arrField;
for (long col = 1; col <= nColumnCount; col++)
{
long indices[2] = { 1, col };
COleVariant varValue;
sa.GetElement(indices, &varValue);
CString value;
switch (varValue.vt)
{
case VT_BSTR:
value = varValue.bstrVal;
break;
case VT_R8:
value.Format(_T("%g"), varValue.dblVal);
break;
case VT_I4:
value.Format(_T("%d"), varValue.lVal);
break;
default:
value = _T("");
}
arrField.Add(value);
}
释放引用及保存EXCEL文件
//保存
book.SaveCopyAs(COleVariant(strExcelPath)); //SaveCopyAs在strFile路径下保存为指定格式.xlsx的文件
book.put_Saved(TRUE); //将Workbook的保存状态设置为已保存,即不让系统提示是否人工保存
// 释放各种引用
usedRange.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
books.Close();
退出EXCEL操作
excelApp.Quit();
excelApp.ReleaseDispatch();
1124

被折叠的 条评论
为什么被折叠?



