MFC向Excel读写数据详细方法

更新时间:2023-10-16 11:23:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

MFC读写Excel详细步骤

准备工作:

打开开发环境VC或VS新建一个基于对话框的简单工程; 通过类向导添加类-->类型库中的MFC类

打开创建类对话框

选择文件,位置编辑框填入Excel.exe的详细目录,可以通过浏览选择,在接口下方选择_Application(应用),_Workbook(视窗),Workbooks(整个视窗),Worksheets(单个表单),Worksheets(整个表单),Range(元素集合)六个基本的接口并生成类。选择接口后单击向右的单箭头即可,双箭头是生成所有接口的类; 生成类之后将添加的几个类的头文件中的

#import \注释掉,加上#include。

然后编译,出现下面这俩个错误;点击DialodBoxA找到错误位置将DialodBox改为_DialodBox;再编译,没有错误; warning C4003: “DialogBoxA”宏的实参不足 error C2059: 语法错误:“,”

在要操作Excel类的CPP文件中包含头文件:

准备工作完成。 向Excel写数据:

CFileDialogdlg(FALSE, \,NULL,

OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,\

Files(*.xls)|*.xls|Microsoft Excel Files(*.xlsx)(推荐)|*.xlsx|All Files (*.*)|*.*||\);

CRange range; CMyFont font; CRange cols;

COleVariantcovOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR); if (!app.CreateDispatch(\)) { }

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(\),COleVariant(\)); //设置公式“=RAND()*100000”

range.put_Formula(COleVariant(\));

this->MessageBox(\无法创建Excel应用!\); return;

dlg.m_ofn.lpstrTitle =\保存到Excel\; if (dlg.DoModal() == IDOK) {

//获取路径

CStringstrFileName=dlg.GetPathName();

CWorkbooks books; CWorkbook book; CApplication app; CWorksheets sheets; CWorksheet sheet;

//选择整列,并设置宽度为自适应 cols = range.get_EntireColumn(); cols.AutoFit(); //设置字体为粗体

font = range.get_Font();

font.put_Bold(COleVariant((short)TRUE)); //设置数字格式为货币型

//range.put_NumberFormat(COleVariant(\ CString Range327[]={\,\,\,\,\,\};

CStringfileinfo[]={\齿形\,\齿向\,\齿距\,\左齿面\,\右齿面\,\径跳\}; for(int i=0;i<6;i++) { } /*

//获得坐标为(C,2)单元格 //显示Excel表

range = sheet.get_Range(COleVariant(\ //设置单元格内容位Hello Excel

range.put_Value2(COleVariant(\哈尔滨精达测量仪器有限公司\ */

//选择整列,并设置宽度为自适应 cols = range.get_EntireColumn(); cols.AutoFit();

range = sheet.get_Range(COleVariant(Range327[i]), range.put_Value2(COleVariant(fileinfo[i]));

COleVariant(Range327[i]));

//显示列表控件

range.ReleaseDispatch();

font.ReleaseDispatch(); cols.ReleaseDispatch(); sheet.ReleaseDispatch(); sheets.ReleaseDispatch(); book.ReleaseDispatch(); books.ReleaseDispatch();

//以下关闭应用的两条代码结合使用且顺序不能反,否则无法关闭进程 app.Quit();

app.ReleaseDispatch();

book.SaveCopyAs(COleVariant(strFileName)); book.put_Saved(true);

//app.put_Visible(TRUE);

//允许其他用户控制Excel,否则Excel、将一闪而过 //app.put_UserControl(TRUE);

}

读取Excel中的数据:

UpdateData(TRUE); str327=\;

UpdateData(FALSE); CApplication app; CWorkbooks books; CWorkbook book; CWorksheets sheets; CWorksheet sheet; CRange range; CRangeoCurCell;

CString strFileName1;

CFileDialogdlg(TRUE, \,NULL,

OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,\

Files(*.xls)|*.xls|Microsoft Excel Files(*.xlsx)|*.xlsx|All Files (*.*)|*.*||\);

dlg.m_ofn.lpstrTitle = \打开Excel文件\ ; intnRetVal = dlg.DoModal(); if ( nRetVal == IDOK ) {

if (!app.CreateDispatch( _T( \ ), NULL ) ) { }

//设置为显示

app.put_Visible(FALSE);

books.AttachDispatch(app.get_Workbooks(), TRUE ); LPDISPATCHlpDisp = NULL;

COleVariantcovTrue((short)TRUE); COleVariantcovFalse((short)FALSE);

COleVariantcovOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

// 打开文件

CStringstrFilePath=dlg.GetPathName(); strFileName1=strFilePath;

//CStringstrFilePath=\研发人员名单2016.xls\ lpDisp = books.Open( strFilePath,

_variant_t(vtMissing), _variant_t(vtMissing), _variant_t(vtMissing),

::MessageBox( NULL, _T( \创建Excel服务失败!\ ), _T( \错误提示!\ ), MB_OK | return; //exit(1);

MB_ICONERROR);

_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 ); // 获得使用的行数 longlgUsedRowNum = 0;

range.AttachDispatch(range.get_Rows(), TRUE ); lgUsedRowNum = range.get_Count(); // 获得使用的列数 longlgUsedColumnNum = 0;

range.AttachDispatch(range.get_Columns(), TRUE ); lgUsedColumnNum = range.get_Count(); // 读取Sheet的名称

CStringstrSheetName = sheet.get_Name(); //得到全部Cells,此时,CurrRange是cells的集合 range.AttachDispatch(sheet.get_Cells(), TRUE ); // 遍历整个Excel表格 CStringArray* arrayStr;

arrayStr = newCStringArray[lgUsedRowNum]; for ( int i = 0; i

for ( int j = 1; j <= lgUsedColumnNum; )//遍历列 {

oCurCell.AttachDispatch( range.get_Item( COleVariant( (long)(i + 1)), VARIANTvarItemName = oCurCell.get_Text(); CStringstrItemName;

COleVariant( (long)j ) ).pdispVal, TRUE );

strItemName = varItemName.bstrVal; AfxMessageBox(strItemName ); // 判断是否是合并的单元格

VARIANTvarMerge = oCurCell.get_MergeCells(); CString

//

PosInfo1[]={\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\};

CString

PosInfo2[]={\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\};

}

if(lgUsedColumnNum*lgUsedRowNum>=300) { }

CStringstrTempValue[20][20];

for ( int i = 0; i

// 释放二维数组 delete[] arrayStr;

for (int j = 0; j

strTempValue[i][j]=arrayStr[j].GetAt(i); MessageBox(\文件过大,存储空间不足,无法读取!\); goto LLL; } i++;

if ( varMerge.boolVal == -1 ) { }

else if ( varMerge.boolVal == 0 ) { }

arrayStr[i].Add( strItemName ); j++;

AfxMessageBox( _T( \不是合并的单元格!\

AfxMessageBox( PosInfo1[j-1]+PosInfo2[i]+\是合并的单元格!\ );

// // // //

/**********************************************************************************//这里设置了字符串类型,应该还能设置其它类型参数,比如说整型。解开上面代码中的注释,

******************/

可以尝试下其它功能。参考资源[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

m_ddd=datafloat; UpdateData(FALSE);

if (i!=0) { }

for (int j = 0; j

if (!strTempValue[i][j].IsEmpty()) { }

str327=str327+\+strTempValue[i][j]; str327=str327+\;

// //

//将对应Excel进程关闭 range.ReleaseDispatch(); oCurCell.ReleaseDispatch(); sheet.ReleaseDispatch(); sheets.ReleaseDispatch(); book.ReleaseDispatch(); books.ReleaseDispatch();

}

/*******************资源释放***********************/ //book.SaveCopyAs(COleVariant(strFileName1)); //book.put_Saved(true); //不显示任何警告对话框

app.put_AlertBeforeOverwriting(false); app.put_DisplayAlerts(false);

LLL:

//在保存文件代码之前加上下面两句语句

//以下关闭应用的两条代码结合使用且顺序不能反,否则无法关闭进程 app.ReleaseDispatch();

app.Quit();

本文来源:https://www.bwwdw.com/article/l0ff.html

Top