VC6.0实现读取Excel数据的方法
Excel是常用的办公软件之一,本文以Excel2003为例说明VC程序读取Excel文件的方法。具体步骤如下:
1.首先要将excel类添加到工程中。
在ClassWizard中,【AddClass】,在Excel的安装目录找到Excel.exe(Microsoft2003是Excel.exe;2007应该又独立的lib库,这个没有验证),添加必要的几个类:
//Excel应用对象 _Applicationm_oExcelApp;//Excel程序 _Worksheetm_oWorkSheet;//工作表 _Workbookm_oWorkBook;//工作簿 Workbooksm_oWorkBooks;//工作簿集合 Worksheetsm_oWorkSheets;//工作表集合 Rangem_oCurrRange;//使用区域
添加到工程中的文件是excel.h和excel.cpp。
2.初始化Com库
if(CoInitialize(NULL)!=0) { AfxMessageBox("初始化COM支持库失败!"); exit(1); }
3.读取文件中的数据
if(!m_oExcelApp.CreateDispatch(_T("Excel.Application"),NULL)) { ::MessageBox(NULL,_T("创建Excel服务失败!"),_T("错误提示!"),MB_OK|MB_ICONERROR); exit(1); } //设置为显示 m_oExcelApp.SetVisible(FALSE); m_oWorkBooks.AttachDispatch(m_oExcelApp.GetWorkbooks(),TRUE);//没有这条语句,下面打开文件返回失败。 LPDISPATCHlpDisp=NULL; COleVariantcovTrue((short)TRUE); COleVariantcovFalse((short)FALSE); COleVariantcovOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR); RangeoCurCell; //打开文件 lpDisp=m_oWorkBooks.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(工作簿) m_oWorkBook.AttachDispatch(lpDisp,TRUE); //获得活动的WorkSheet(工作表) m_oWorkSheet.AttachDispatch(m_oWorkBook.GetActiveSheet(),TRUE); //获得使用的区域Range(区域) m_oCurrRange.AttachDispatch(m_oWorkSheet.GetUsedRange(),TRUE); //获得使用的行数 longlgUsedRowNum=0; m_oCurrRange.AttachDispatch(m_oCurrRange.GetRows(),TRUE); lgUsedRowNum=m_oCurrRange.GetCount(); //获得使用的列数 longlgUsedColumnNum=0; m_oCurrRange.AttachDispatch(m_oCurrRange.GetColumns(),TRUE); lgUsedColumnNum=m_oCurrRange.GetCount(); //读取Sheet的名称 CStringstrSheetName=m_oWorkSheet.GetName(); //得到全部Cells,此时,CurrRange是cells的集合 m_oCurrRange.AttachDispatch(m_oWorkSheet.GetCells(),TRUE); //遍历整个Excel表格 CStringArray*arrayStr; arrayStr=newCStringArray[lgUsedRowNum]; for(inti=0;i<lgUsedRowNum;) { for(intj=1;j<=lgUsedColumnNum;) { oCurCell.AttachDispatch(m_oCurrRange.GetItem(COleVariant((long)(i+1)),COleVariant((long)j)).pdispVal,TRUE); VARIANTvarItemName=oCurCell.GetText(); CStringstrItemName; strItemName=varItemName.bstrVal; //AfxMessageBox(strItemName); //判断是否是合并的单元格 VARIANTvarMerge=oCurCell.GetMergeCells(); if(varMerge.boolVal==-1) { //AfxMessageBox(_T("是合并的单元格!")); } elseif(varMerge.boolVal==0) { //AfxMessageBox(_T("不是合并的单元格!")); } arrayStr[i].Add(strItemName); j++; } i++; } //更新列表控件数据 m_pExcelOperDlg->initListCtrlColumn(lgUsedColumnNum); m_pExcelOperDlg->updateListCtrlData(arrayStr,lgUsedRowNum); //释放二维数组 delete[]arrayStr; //关闭 m_oWorkBook.Close(covOptional,COleVariant(strFilePath),covOptional); m_oWorkBooks.Close(); //释放 m_oCurrRange.ReleaseDispatch(); m_oWorkSheet.ReleaseDispatch(); m_oWorkSheets.ReleaseDispatch(); m_oWorkBook.ReleaseDispatch(); m_oWorkBooks.ReleaseDispatch(); m_oExcelApp.ReleaseDispatch(); m_oExcelApp.Quit();//这条语句是推出Excel程序,任务管理器中的EXCEL进程会自动结束。
补充:本文所述程序实例完整源码点此下载