MFC读写Excel详细步骤
说明 : 代码编译可能会编译不通过,主要是看注释说明.
准备工作:
打开开发环境VC或VS新建一个基于对话框的简单工程; 通过类向导添加类-->类型库中的MFC类
打开创建类对话框
选择文件,位置编辑框填入Excel.exe的详细目录,可以通过浏览选择,在接口下方选择_Application(应用),_Workbook(视窗)Workbooks(整个视窗),Worksheets(单个表单),Worksheets(整个表单),Range(元素集合)六个基本的接口并生成类。选择接口后单击向右的单箭头即可,双箭头是生成所有接口的类;
生成类之后将添加的几个类的头文件中的#import "E:\\Microsoft Office\\Office14\\EXCEL.EXE" no_namespace 注释掉,加上#include<afxdisp.h>。然后编译,出现下面这俩个错误;点击DialodBoxA找到错误位置将DialodBox改为_DialodBox;再编译,没有错误;warning C4003: “DialogBoxA”宏的实参不足 error C2059: 语法错误:“,” 在要操作Excel类的CPP文件中包含头文件:
准备工作完成。
向Excel写数据:
CFileDialogdlg(FALSE, ".xlsx",NULL,
OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"Microsoft ExcelFiles(*.xls)|*.xls|Microsoft Excel Files(*.xlsx)(推荐)|*.xlsx|All Files (*.*)|*.*||");
Files(*.xls)|*.xls|Microsoft Excel Files(*.xlsx)(推荐)|*.xlsx|All Files (*.*)|*.*||");
dlg.m_ofn.lpstrTitle = " 保存到 Excel" ;
if(dlg.DoModal() == IDOK)
{
// 获取路径
CString strFileName=dlg.GetPathName(); CWorkbooks books;
CWorkbook book;
CApplication app;
CWorksheets sheets;
CWorksheet sheet;
CRange range;
CMyFont font;
CRange cols;
COleVariant covOptional(( long ) DISP_E_PARAMNOTFO,UVNTD_ERROR);
if(!app.CreateDispatch("Excel.Application"))
{
this -> MessageBox("无法创建 Excel 应用!");
return;
}
books=app.get_Workbooks();
book=books.Add(covOptional);
sheets=book.get_Worksheets();
sheet=sheets.get_Item(COleVariant((short)1));
//获得(A,1)(B,1) 两个单元格
range=sheet.get_Range(COleVariant("A1"),COleVariant("B6"));
//设置公式“=RAND()*100000”
range.put_Formula(COleVariant("=RAND()*1000"));
//选择整列,并设置宽度为自适应
cols = range.get_EntireColumn();
cols.AutoFit();
//设置字体为粗体
font = range.get_Font();
font.put_Bold(COleVariant((short)TRUE));
//设置数字格式为货币型
//range.put_NumberFormat(COleVariant("$0.00"));
CString Range327[]={"C1","C2","C3","C4","C5","C6"};
CString fileinfo[]={"齿形","齿向","齿距","左齿面","右齿面","径跳"};
for(int i=0;i<6;i++)
{
range = sheet.get_Range(COleVariant(Range327[i]),COleVariant(Range327[i]));
range.put_Value2(COleVariant (fileinfo[i]));
}
/*
//获得坐标为(C,2)单元格
//显示Excel 表
range = sheet.get_Range(COleVariant("C1"), COleVariant("F10"));
//设置单元格内容位 Hello Excel
range.put_Value2(COleVariant("哈尔滨精达测量仪器有限公司"));
*/
//选择整列,并设置宽度为自适应
cols = range.get_EntireColumn();
cols.AutoFit();
//显示列表控件
//app.put_Visible(TRUE);
//允许其他用户控制 Excel ,否则 Excel 、将一闪而过
//app.put_UserControl(TRUE);
book.SaveCopyAs( COleVariant (strFileName));
book.put_Saved( true );
range.ReleaseDispatch();
font.ReleaseDispatch();
cols.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
//以下关闭应用的两条代码结合使用且顺序不能反,否则无法关闭进程
app.Quit();
app.ReleaseDispatch();
}
读取Excel中的数据:
UpdateData(TRUE);
str327="";
UpdateData(FALSE);
CApplication app;
CWorkbooks books;
CWorkbook book;
CWorksheets sheets;
CWorksheet sheet;
CRange range;
CRange oCurCell;
CString strFileName1;
CFileDialog dlg(TRUE,".xlsx",NULL,
OFN_FILEMUSTEXIS| OT FN_HIDEREADON| OLYFN_OVERWRITEPRO,
M"MPiTcrosoft ExcelFiles(*.xls)|*.xls|Microsoft Excel Files(*.xlsx)|*.xlsx|All Files(*.*)|*.*||");
dlg.m_ofn.lpstrTitle ="打开Excel文件";
int nRetVal = dlg.DoModal();
if(nRetVal == IDOK)
{
if(!app.CreateDispatch(_T("Excel.Application"),NULL))
{
::MessageBox(NULL,_T("创建Excel 服务失败"),_T("错误提示"),MB_OK|MB_ICONERROR);
return;
//exit(1);
}
// 设置为显示
app.put_Visible(FALSE);
books.AttachDispatch(app.get_Workbooks(),TRUE);
LPDISPATClHpDisp = NULL;
COleVariant covTrue((short)TRUE);
COleVariant covFalse((short)FALSE);
COleVariant covOptional((long)DISP_E_PARAMNOTFO,UNVDT_ERROR);
//打开文件
CString strFilePath=dlg.GetPathName();
strFileName1=strFilePath;
//研发人员名单 2016.xls";
lpDisp = books.Open( strFilePath,
_variant_t (vtMissing),
_variant_t (vtMissing),
_variant_t (vtMissing),
_variant_t (vtMissing),
_variant_t (vtMissing),
_variant_t (vtMissing),
_variant_t (vtMissing),
_variant_t (vtMissing),
_variant_t (vtMissing),
_variant_t (vtMissing),
_variant_t (vtMissing),
_variant_t (vtMissing),
_variant_t (vtMissing),
_variant_t (vtMissing) );
//获得活动的WorkBook(工作簿)
book.AttachDispatch(lpDisp, TRUE);
//获得活动的WorkSheet(工作表)
sheet.AttachDispatch(book.get_ActiveSheet(),TRUE);
//获得使用的区域 Range(区域)
range.AttachDispatch(sheet.get_UsedRange(),TRUE);
//获得使用的行数
long lgUsedRowNum = 0;
range.AttachDispatch(range.get_Rows(),TRUE);
lgUsedRowNum = range.get_Count();
//获得使用的列数
long lgUsedColumnNum = 0;
range.AttachDispatch(range.get_Columns(),TRUE);
lgUsedColumnNum = range.get_Count();
//读取Sheet的名称
CString strSheetName = sheet.get_Name();
//得到全部Cells ,此时,CurrRange 是cells 的集合
range.AttachDispatch(sheet.get_Cells(), TRUE);
//遍历整个Excel 表格
CStringArray* arrayStr;
arrayStr =newCStringArray [lgUsedRowNum];
for (int i = 0; i <lgUsedRowNum; ) // 遍历行
{
for(int j = 1; j <= lgUsedColumnNum; ) // 遍历列
{
oCurCell.AttachDispatch(range.get_Item(COleVariant((long)(i+ 1)),COleVariant((long)j)).pdispVal,TRUE);
VARIANTvarItemName = oCurCell.get_Text();
CString strItemName;
strItemName = varItemName.bstrVal;
//AfxMessageBox(strItemName );
//判断是否是合并的单元格
VARIANTvarMerge = oCurCell.get_MergeCells(); CString
PosInfo1[]={"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T"};
CString PosInfo2[]={"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20"};
if(varMerge.boolVal == -1 )
{
AfxMessageBox( PosInfo1[j-1]+PosInfo2[i]+"是合并的单元格!");
}
//else if ( varMerge.boolVal == 0 )
//{
//AfxMessageBox( _T( " 不是合并的单元格 !" ) );
//}
} i++;
}
arrayStr[i].Add( strItemName );
j++;
if(lgUsedColumnNum*lgUsedRowNum>=300)
{
MessageBox( " 文件过大,存储空间不足,无法读取! " ); goto LLL;
}
CString strTempValue[20][20];
for(int i = 0; i <lgUsedColumnNum; i++) // 遍历列
{
for(int j = 0; j <lgUsedRowNum; j++)// 遍历行
{
strTempValue[i][j]=arrayStr[j].GetAt(i);
}
}
//释放二维数组
delete [] arrayStr;
//这里设置了字符串类型,应该还能设置其它类型参数,比如说整型。解开上面代码中的注释,
可以尝试下其它功能。参考资源 [1]
// 释放资源
// book.SaveCopyAs(COleVariant(strFilePath));
// book.put_Saved(true);
book.ReleaseDispatch();
books.ReleaseDispatch();
app.Quit();
app.ReleaseDispatch();
long size327=lgUsedColumnNum*lgUsedRowNum;
datafloat=atof(strTempValue[0][0]); UpdateData( TRUE);
for (int i = 0; i <lgUsedColumnNum; i++)// 遍历列
{
if(i!=0)
{
str327=str327+"\r\n";
}
for ( int j = 0; j <lgUsedRowNum; j++)
{
if (!strTempValue[i][j].IsEmpty())
{
str327=str327+ "\r\n" +strTempValue[i][j];
}
}
}
m_ddd=datafloat;
UpdateData(FALSE);
}
//book.SaveCopyAs(COleVariant(strFileName1));
//book.put_Saved(true);
// 不显示任何警告对话框
// 在保存文件代码之前加上下面两句语句
app.put_AlertBeforeOverwriting( false );
app.put_DisplayAlerts(false );
// 将对应 Excel 进程关闭
range.ReleaseDispatch();
oCurCell.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
// 以下关闭应用的两条代码结合使用且顺序不能反,否则无法关闭进程
app.Quit();
app.ReleaseDispatch();
}
}
}
转载自 : 百度文库
下面也有相应的详细文章:
第一篇 : https://www.cnblogs.com/tianya2543/p/4165997.html
第二篇 : https://blog.csdn.net/qivan/article/details/7599924