VC6.0實(shí)現(xiàn)讀取Excel數(shù)據(jù)的方法
Excel是常用的辦公軟件之一,本文以Excel2003為例說明VC程序讀取Excel文件的方法。具體步驟如下:
1.首先要將excel類添加到工程中。
在ClassWizard中,【Add Class】,在Excel的安裝目錄找到Excel.exe(Microsoft2003是Excel.exe;2007應(yīng)該又獨(dú)立的lib庫,這個(gè)沒有驗(yàn)證),添加必要的幾個(gè)類:
// Excel應(yīng)用對象 _Application m_oExcelApp; // Excel程序 _Worksheet m_oWorkSheet; // 工作表 _Workbook m_oWorkBook; // 工作簿 Workbooks m_oWorkBooks; // 工作簿集合 Worksheets m_oWorkSheets; // 工作表集合 Range m_oCurrRange; // 使用區(qū)域
添加到工程中的文件是excel.h和excel.cpp。
2.初始化Com庫
if (CoInitialize(NULL)!=0)
{
AfxMessageBox("初始化COM支持庫失敗!");
exit(1);
}
3.讀取文件中的數(shù)據(jù)
if (!m_oExcelApp.CreateDispatch( _T( "Excel.Application" ), NULL ) )
{
::MessageBox( NULL, _T( "創(chuàng)建Excel服務(wù)失敗!" ), _T( "錯(cuò)誤提示!" ), MB_OK | MB_ICONERROR);
exit(1);
}
//設(shè)置為顯示
m_oExcelApp.SetVisible(FALSE);
m_oWorkBooks.AttachDispatch( m_oExcelApp.GetWorkbooks(), TRUE ); //沒有這條語句,下面打開文件返回失敗。
LPDISPATCH lpDisp = NULL;
COleVariant covTrue((short)TRUE);
COleVariant covFalse((short)FALSE);
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
Range oCurCell;
// 打開文件
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) );
// 獲得活動(dòng)的WorkBook( 工作簿 )
m_oWorkBook.AttachDispatch( lpDisp, TRUE );
// 獲得活動(dòng)的WorkSheet( 工作表 )
m_oWorkSheet.AttachDispatch( m_oWorkBook.GetActiveSheet(), TRUE );
// 獲得使用的區(qū)域Range( 區(qū)域 )
m_oCurrRange.AttachDispatch( m_oWorkSheet.GetUsedRange(), TRUE );
// 獲得使用的行數(shù)
long lgUsedRowNum = 0;
m_oCurrRange.AttachDispatch( m_oCurrRange.GetRows(), TRUE );
lgUsedRowNum = m_oCurrRange.GetCount();
// 獲得使用的列數(shù)
long lgUsedColumnNum = 0;
m_oCurrRange.AttachDispatch( m_oCurrRange.GetColumns(), TRUE );
lgUsedColumnNum = m_oCurrRange.GetCount();
// 讀取Sheet的名稱
CString strSheetName = m_oWorkSheet.GetName();
//得到全部Cells,此時(shí),CurrRange是cells的集合
m_oCurrRange.AttachDispatch( m_oWorkSheet.GetCells(), TRUE );
// 遍歷整個(gè)Excel表格
CStringArray* arrayStr;
arrayStr = new CStringArray[lgUsedRowNum];
for ( int i = 0; i < lgUsedRowNum; )
{
for ( int j = 1; j <= lgUsedColumnNum; )
{
oCurCell.AttachDispatch( m_oCurrRange.GetItem( COleVariant( (long)(i + 1)), COleVariant( (long)j ) ).pdispVal, TRUE );
VARIANT varItemName = oCurCell.GetText();
CString strItemName;
strItemName = varItemName.bstrVal;
// AfxMessageBox( strItemName );
// 判斷是否是合并的單元格
VARIANT varMerge = oCurCell.GetMergeCells();
if ( varMerge.boolVal == -1 )
{
// AfxMessageBox( _T( "是合并的單元格!" ) );
}
else if ( varMerge.boolVal == 0 )
{
// AfxMessageBox( _T( "不是合并的單元格!" ) );
}
arrayStr[i].Add( strItemName );
j++;
}
i++;
}
// 更新列表控件數(shù)據(jù)
m_pExcelOperDlg->initListCtrlColumn( lgUsedColumnNum );
m_pExcelOperDlg->updateListCtrlData( arrayStr, lgUsedRowNum );
// 釋放二維數(shù)組
delete[] arrayStr;
// 關(guān)閉
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程序,任務(wù)管理器中的EXCEL進(jìn)程會(huì)自動(dòng)結(jié)束。
補(bǔ)充:本文所述程序?qū)嵗暾创a點(diǎn)此下載
相關(guān)文章
C語言中經(jīng)socket接收數(shù)據(jù)的相關(guān)函數(shù)詳解
這篇文章主要介紹了C語言中經(jīng)socket接收數(shù)據(jù)的相關(guān)函數(shù)詳解,分別為recv()函數(shù)和recvfrom()函數(shù)以及recvmsg()函數(shù)的使用,需要的朋友可以參考下2015-09-09
C++實(shí)現(xiàn)旋轉(zhuǎn)數(shù)組的二分查找
這篇文章主要介紹了C++實(shí)現(xiàn)旋轉(zhuǎn)數(shù)組的二分查找方法,涉及數(shù)組的操作,有值得借鑒的技巧,需要的朋友可以參考下2014-09-09
C++11?condition_variable條件變量的用法說明
這篇文章主要介紹了C++11?condition_variable條件變量的用法說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07

