VS2010 MFC 操作Excel(读写)

说到操作excel,可能用java来写更方便一些。mfc确实不太适合这种操作,个人感觉要比java复杂一点,尤其是在数据类型的转换和操作上,java简单有效。下面进入正题,环境为vs2010。

1. 这个小的mfc程序实现的是读取excel中的数据,然后经过数据处理,生成一个新的excel来存放处理结果。

2.我们用到的技术是通过OLE/COM对excel进行操作。


步骤:

1.新建MFC对话框。注意勾选自动化,否则后面加入不了需要的库,导致启动服务失败等错误。有的博客说需要加入

1 if (!AfxOleInit())
2 {
3     AfxMessageBox(IDP_OLE_INIT_FAILED);
4     return FALSE;
5 }

笔者实验发现自己的环境自动添加了这部分代码。

        2. 向项目工程中添加基本的7个类( Excel 作为 OLE/COM 库插件,定义好了各类交互的接口,这些接口是跨语言的接口。 VC 可以通过导入这些接口,并通过   接口来对 Excel 的操作), 由于本文只关心对 Excel 表格中的数据的读取,主要关注7个接_ Application、 Workbooks  _Workbook 、Worksheets 、 _Worksheet Range、Font 

VS2012 导入 OLE/COM 组件的接口的步骤为: 项目->类向导->添加类->类型库中的MFC类 ,先选择要导入的组件所在的路径,即 Excel.exe 所在的路      径,然后再选择 要导入的 Excel 类型库中的接口。组件路径一般为C:\Program Files\Microsoft Office\Office15\EXCEL.exe;格式类似。

        3. 导入之后需要“#import "C:\\Program Files\\Microsoft Office\\Office12\\EXCEL.EXE" no_namespace”注释掉,然后添加头文                 件:#include <afxdisp.h>到上面7个文件中去。

4.如果有错误error C2059双击error C2059,将VARIANT DialogBox()改成VARIANT _DialogBox()再次编译,通过!!

5.读写excel。

在对话框头文件中*Dlg.h定义变量

 1 //定义接口类变量 
 2     CApplication app; 
 3     CWorkbook book;  
 4     CWorkbooks books;  
 5     CWorksheet sheet;  
 6     CWorksheets sheets; 
 7     CRange range;  
 8     CMyFont font;   
 9     CRange cols; 
10     LPDISPATCH lpDisp;
以上部分来自网络,经试验,正确无误。
 6.功能可以分为三个模块,第一个模块是一个文件选择器,第二个模块是读取excel,第三个模块为创建excel. 

(1)文件选择部分

void CTXDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CFileDialog OpenDlg(true);
if(OpenDlg.DoModal() == IDOK){
CEdit* ECtr = (CEdit *)GetDlgItem(IDC_EDIT1);
fileNameTrans = OpenDlg.GetPathName();
ECtr->SetWindowText(fileNameTrans);
}
}

(2)导入excel并读取数据,放到list里面暂存待处理

void CTXDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
int mCount=0;
CString str,str1;
double num1,num2;
double d_skewing =0.004;
COleVariant vResult;
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
if(!app.CreateDispatch(_T("Excel.Application"))){
this->MessageBox(_T("无法创建Excel应用!"));
return;
}
books.AttachDispatch(app.get_Workbooks());
lpDisp = books.Open(fileNameTrans,covOptional, covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional);
book.AttachDispatch(lpDisp);
sheets.AttachDispatch(book.get_Worksheets());
//得到当前活跃sheet
lpDisp = book.get_ActiveSheet();
sheet.AttachDispatch(lpDisp);
//获得行数
CRange usedRange;
CRange mRange;
usedRange.AttachDispatch(sheet.get_UsedRange());
mRange.AttachDispatch(usedRange.get_Rows(),true);
int count = mRange.get_Count();
usedRange.ReleaseDispatch();
mRange.ReleaseDispatch();
//读取一个值
range.AttachDispatch(sheet.get_Cells());
range.AttachDispatch(range.get_Item(COleVariant((long)1),COleVariant((long)2)).pdispVal);
vResult = range.get_Value2();
if(vResult.vt == VT_BSTR){
str1 = vResult.bstrVal;
}else if(vResult.vt == VT_R8){
str1.Format(L"%f",vResult.dblVal);
}else{
str1 = "数据类型错误!";
this->MessageBox(str1);
return;
}
num1 = _wtof(str1.GetBuffer(0));
mList1.AddTail(1);
mList2.AddTail(str1);//添加第一个值
++mCount;
//读取单元格值
for(int i=2;i<count;i++){
range.AttachDispatch(sheet.get_Cells());
range.AttachDispatch(range.get_Item(COleVariant((long)i),COleVariant((long)2)).pdispVal);
vResult = range.get_Value2();
if(vResult.vt == VT_BSTR){
str = vResult.bstrVal;
}else if(vResult.vt == VT_R8){
str.Format(L"%f",vResult.dblVal);
}else{
str = "数据类型错误!";
this->MessageBox(str);
break;
}
num2 = _wtof(str.GetBuffer(0));
if(num2-num1>=0.004){
mList1.AddTail(i);
mList2.AddTail(str);
num1 = num2;
++mCount;
}
range.ReleaseDispatch();
}
books.Close();
sheet.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
app.ReleaseDispatch();
app.Quit();

this->MessageBox(_T("数据已导入,请点击导入按键!"));

}

(3)对读取的数据进行处理,结果保存,生成新的excel

void CTXDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
if(!app.CreateDispatch(_T("Excel.Application"),NULL)){
AfxMessageBox(_T("启动Excel服务器失败!"));
return ;
}
//判断当前的Excel的版本
CString strExcelVersion = app.get_Version();
int iStart =0;
strExcelVersion = strExcelVersion.Tokenize(_T("."),iStart);
if(_T("11")==strExcelVersion){
AfxMessageBox(_T("当前的Excel的版本是2003"));
}else if(_T("12")==strExcelVersion){
AfxMessageBox(_T("当前的Excel的版本是2007"));
}else{
AfxMessageBox(_T("当前的Excel的版本是其他版本"));
}
app.put_Visible(true);
app.put_UserControl(false);
//得到工作薄容器
books.AttachDispatch(app.get_Workbooks());
//打开一个工作薄,如不存在,则创建
CString strBookPath = _T("D:\\tmp.xls");
try{
lpDisp = books.Open(strBookPath,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing);
book.AttachDispatch(lpDisp);
}catch(...){
lpDisp = books.Add(vtMissing);
book.AttachDispatch(lpDisp);
}
//得到工作薄中的sheet的容器
sheets.AttachDispatch(book.get_Sheets());
//打开一个sheet,如不存在,就新增一个sheet
CString strSheetName = _T("NewSheet");
try{
//尝试打开一个已有的sheet
lpDisp = sheets.get_Item(_variant_t(strSheetName));
sheet.AttachDispatch(lpDisp);
}catch(...){
//创建一个新的sheet
lpDisp = sheets.Add(vtMissing,vtMissing,_variant_t((long)1),vtMissing);
sheet.AttachDispatch(lpDisp);
sheet.put_Name(strSheetName);
}
range.AttachDispatch(sheet.get_Cells());
//插入数据
POSITION ps1 = mList1.GetHeadPosition();
POSITION ps2 = mList2.GetHeadPosition();
int aa;
CString mStr1,mStr2,strr;
for(int i=1;ps1!=NULL&&ps2!=NULL;mList1.GetNext(ps1),mList2.GetNext(ps2),i++){
iCells.AttachDispatch(range.get_Item(COleVariant((long)i),COleVariant((long)1)).pdispVal,true);
aa = mList1.GetAt(ps1);
strr.Format(L"%d",aa);
iCells.put_Value2(COleVariant(strr));
iCells.AttachDispatch(range.get_Item(COleVariant((long)i),COleVariant((long)2)).pdispVal,true);
strr = mList2.GetAt(ps2);
iCells.put_Value2(COleVariant(strr));
}
//book.Save();
range.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
app.Quit();
app.ReleaseDispatch();

}



  • 9
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: VS2019 MFC操作Excel是一种常用的开发技术,可以通过使用MFC库中的一些功能和类来实现对Excel文件的操作。 首先,需要在工程中引入MFC库和所需的头文件,如afxwin.h、afxdisp.h等。 接下来,使用COleVariant类型的变量来打开Excel应用程序,并创建一个工作簿(Workbook)对象。例如: ```cpp CApplication excelApp; if (!excelApp.CreateDispatch(_T("Excel.Application"))) { AfxMessageBox(_T("Excel应用程序创建失败!")); return; } CWorkbooks workbooks = excelApp.GetWorkbooks(); CWorkbook workbook = workbooks.Add(); ``` 然后,通过获取工作簿中的工作表(Worksheets)对象,可以进行对工作簿的操作。例如: ```cpp CWorksheets worksheets = workbook.GetWorksheets(); CWorksheet worksheet = worksheets.GetItem(COleVariant((short)1)); //获取第一个工作表 Range range; //定义一个区域对象 range.AttachDispatch(worksheet.GetRange(COleVariant(L"A1"), COleVariant(L"C3"))); //获取A1到C3的单元格区域 COleVariant data(_T("Hello, Excel!")); //准备要入的数据 range.put_Value2(data); //将数据入区域 ``` 当需要Excel数据时,可以借助Worksheet对象的Cells属性和Range对象进行操作。例如: ```cpp CRange usedRange = worksheet.GetUsedRange(); //获取已使用的单元格范围 int rowCount = usedRange.GetRows().GetCount(); //获取行数 int columnCount = usedRange.GetColumns().GetCount(); //获取列数 for (int i = 1; i <= rowCount; i++) { for (int j = 1; j <= columnCount; j++) { CRange cell = worksheet.GetCells().GetItem(COleVariant(i), COleVariant(j)); //获取指定单元格 CString value = cell.GetValue(); //获取单元格的值 //对获取到的数据进行处理 } } ``` 最后,记得在不需要使用Excel时,调用相关的关闭和释放函数,以结束Excel应用程序的运行。例如: ```cpp workbook.SaveAs(COleVariant(L"test.xlsx")); //保存工作簿到文件 workbook.Close(); excelApp.Quit(); ``` 以上是使用VS2019 MFC操作Excel的基本方法,通过这些方法可以方便地对Excel文件进行操作,实现各种需求。 ### 回答2: VS2019 MFC操作Excel的基本步骤如下: 首先,我们需要在项目中引入MFC类库。在新建项目时,选择MFC应用程序,并在创建向导中勾选"使用MFC功能"。 接下来,我们需要添加Excel的头文件和库文件。在项目的stdafx.h文件中添加以下代码: ``` #include "afxdb.h" #include "afxdao.h" ``` 然后,在需要操作Excel的代码文件中,包含afxdao.h头文件,并定义以下变量: ``` CDatabase db; CDaoWorkspace workspace; CDaoDatabase* pDaoDB; CDaoRecordset rs; ``` 接着,我们需要创建一个Excel数据源。通过以下代码连接数据库: ``` CString strExcelFile = _T("C:\\path\\to\\excel.xls"); // 替换为实际的Excel文件路径 CString strConnect = _T("Excel 8.0;HDR=YES;IMEX=1;"); // 数据源连接字符串 db.Open(NULL, FALSE, FALSE, strConnect); pDaoDB = db.m_pDaoDatabase; ``` 通过以上代码,我们成功地连接了Excel文件,现在可以开始操作Excel表格了。 例如,我们可以执行下列操作Excel文件中的数据: ``` rs.Open(db.OpenRecordset(_T("SELECT * FROM Sheet1")));//替换Sheet1为实际的工作表名称 while (!rs.IsEOF()) { CString strName; rs.GetFieldValue(_T("Name"), strName); // 取Name列的数据 // 在这里处理取到的数据 rs.MoveNext(); } rs.Close(); ``` 类似地,我们可以编代码实现入数据、修改数据等其他操作操作完成后,务必关闭数据库连接: ``` db.Close(); ``` 这样,我们就完成了在VS2019 MFC操作Excel的基本步骤。当然,在实际应用中,还可以根据具体需求进一步扩展功能。 ### 回答3: VS2019 MFC操作Excel的主要步骤如下: 首先,我们需要添加必要的头文件和库文件。在MFC应用程序的代码中,包含<afxdisp.h>和<atlbase.h>这两个头文件。此外,还需要在项目的属性中添加Microsoft.Office.Interop.Excel作为附加依赖项。 接下来,我们可以使用Excel应用程序对象进行操作。可以通过以下代码进行初始化: ``` _Application excelApp; if (!excelApp.CreateDispatch(L"Excel.Application")) { AfxMessageBox(L"无法启动Excel应用程序。"); return; } excelApp.put_Visible(TRUE); ``` 然后,我们可以打开一个工作簿并选择一个工作表进行操作。可以使用以下代码打开工作簿: ``` _Workbook excelWorkbook; excelWorkbook = excelApp.get_Workbooks().Open(L"C:\\Path\\To\\Workbook.xlsx"); ``` 接着,我们可以访问工作表中的单元格数据,并进行取或操作。例如,可以使用下面的代码来取A1单元格的数据并将其显示在MessageBox中: ``` _Range excelRange; excelRange = excelWorkbook.get_Worksheets().get_Item(1).get_Range(COleVariant(L"A1"), COleVariant(L"A1")); CString value = (LPCTSTR)excelRange.get_Value2().bstrVal; AfxMessageBox(value); ``` 最后,在完成操作后,我们应该关闭工作簿和Excel应用程序,释放相关资源。可以使用以下代码来关闭工作簿和Excel应用程序: ``` excelWorkbook.Close(FALSE); excelApp.Quit(); ``` 以上是使用VS2019 MFC操作Excel的基本步骤。在实际开发中,根据具体需求,还可以进行更多的操作,如新增工作表、格式化单元格、插入图表等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值