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进程会自动结束。
补充:本文所述程序实例完整源码点此下载