C++讀取Excel 精華
阿新 • • 發佈:2019-02-05
<pre name="code" class="cpp">Excel是常用的辦公軟體之一,本文以Excel2003為例說明VC程式讀取Excel檔案的方法。具體步驟如下: 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程序會自動結束。