VC下操控excel(精典)
來源:互聯網
上載者:User
原貼地址:http://blog.csdn.net/primer_programer/archive/2008/05/09/2422118.aspx現在對Excel的操作越來越流行,可能還有對錶格的格式進行修改等複雜的操作,這裡只說明讀取Excel檔案的方法(這裡以2003為例)。 1.
首先要將excel類添加到工程中。在ClassWizard中,【Add Class】,在Excel的安裝目錄找到Excel.exe(Microsoft2003是Excel.exe;2007應該又獨立的lib庫,這個沒有驗證),添加必要的幾個類:// Excel應用對象_Application m_oExcelApp; // Excel
程式_Worksheet m_oWorkSheet; //
工作表_Workbook m_oWorkBook; //
活頁簿Workbooks m_oWorkBooks; //
活頁簿集合Worksheets m_oWorkSheets; //
工作表集合Range m_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 ); //
沒有這條語句,下面開啟檔案返回失敗。 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) ); //
獲得活動的WorkBook( 活頁簿 ) m_oWorkBook.AttachDispatch( lpDisp, TRUE ); //
獲得活動的WorkSheet( 工作表 ) m_oWorkSheet.AttachDispatch( m_oWorkBook.GetActiveSheet(), TRUE ); //
獲得使用的地區Range( 地區 ) m_oCurrRange.AttachDispatch( m_oWorkSheet.GetUsedRange(), TRUE ); //
獲得使用的行數 long lgUsedRowNum = 0; m_oCurrRange.AttachDispatch( m_oCurrRange.GetRows(), TRUE ); lgUsedRowNum = m_oCurrRange.GetCount(); //
獲得使用的列數 long lgUsedColumnNum = 0; m_oCurrRange.AttachDispatch( m_oCurrRange.GetColumns(), TRUE ); lgUsedColumnNum = m_oCurrRange.GetCount(); //
讀取Sheet的名稱 CString strSheetName = m_oWorkSheet.GetName(); //
得到全部Cells,此時,CurrRange是cells的集合 m_oCurrRange.AttachDispatch( m_oWorkSheet.GetCells(), TRUE ); //
遍曆整個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++; } //
更新清單控制項資料 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進程會自動結束。