MFC讀取word和excel檔案

來源:互聯網
上載者:User

注意:2007的office中,有的類名改為了後面加0,如CRange0 CDocument0, 一些函數名稱也改了,格式修改如getText改為了get_Text(),

讀取word 文檔:

記得修改CDocuments , CDocument0
等的標頭檔中的如下://另外記得加上#pragma once

#pragma
once

#import "K:\\Program Files XXX\\Microsoft Office\\Office XX\\MSWORD.OLB"  no_namespace    raw_interfaces_only  \
  rename("FindText","_FindText")       \
  rename("Rectangle","_Rectangle")   \
  rename("ExitWindows","_ExitWindows")

如上我說的,匯入typelib後,添加Application Document.. 等類。如下為一個snippet

#include "CApplication.h"
#include "CDocument0.h"
#include "CDocuments.h"

 CApplication oWord;
 CDocuments oDocs;
 CDocument0 oDoc;

void CVCreadwriteRTFDlg::OnBnClickedButton1() 

// 變數的聲明 
COleVariant  vTrue((short)TRUE),  
                  vFalse((short)FALSE),  
                  vOpt((long)DISP_E_PARAMNOTFOUND,  VT_ERROR); 

CApplication oWordApp ; 
CSelection oSel ;  
CDocuments oDocs ; 
CDocument0 oDoc ;  
CParagraphs paragraphs ; 

CStringArray aryText; 

long paCounst; 
int  lc ; 
  
    // 首先建立一個word執行個體對象 
if (!oWordApp.CreateDispatch(TEXT("Word.Application")) ){ 

AfxMessageBox( TEXT( "CreateDispatch  failed." ) , MB_OK &brvbarMB_SETFOREGROUND);  
return;  // 一定要返回,否則程式崩潰 

// 顯示此對象檔案 ,您也可以不調用此句,不顯示對象檔案 
oWordApp.Set_Visible(TRUE); 

// 建立文檔 
oDocs = oWordApp.get_Documents();  

// 開啟一個新文檔,將e:\\BuildJobEdit.rtf檔案的內容添加到新文檔中 
CComVariant tpl(_T("e:\\BuildJobEdit.rtf")), NewTemplate(false), DocType(0), Visble; 
oDoc = oDocs.Add(&tpl,&NewTemplate,&DocType,&Visble); 
      
// 選中文檔中的所有內容 
oSel = oWordApp.get_Selection(); 
oSel.WholeStory();// 此句必須有,否則後續代碼無效。 

// 得到所有段 
paragraphs = oSel.get_Paragraphs(); 
  
paCounst = paragraphs.get_Count(); 
  
// 將所有段中的每一段都存在數組裡 
for( lc = 1 ; lc < paCounst+1 ; lc++ ){ 

// 得到一段 
CParagraph  paragraph; 
paragraph = paragraphs.Item( (long)lc ); 

// 得到一段的文本 
CRange range = paragraph.get_Range(); 
CString strRangeText = range.get_Text(); 

CFont font = range.get_Font(); 

// 設定文本的字型大小與顏色 
//font.put_Color( RGB(0,255,0) ); 
//font.put_Size( 12 ); 
// AfxMessageBox( strRangeText ); 

// 儲存到數組裡 
aryText.Add( strRangeText ); 

//釋放對象 
paragraph.ReleaseDispatch(); 

讀取excel的相關代碼:

1、  字串前加上L,如L"fox",這是unicode的原因。
 2、  有些函數不一樣了,與第一個連結,比如GetValue,現在應該寫成get_value,這都是筆者一下下調對的,還有一些代碼有錯誤,不過至少下面的代碼運行無誤。
1. 建立MFC工程,MDI(基於對話方塊),其他預設即可。
2. 操作Excel檔案初始化:
    a. project->add class->MFC class from typelib (項目->添加類->Typelib中的MFC類)匯入Excel.exe,一般都在C:/Program Files/Microsoft Office/Office12路徑下(即選擇你的office安裝路徑下的excel.exe加入)
    b. 選中以下幾項_Application,_WorkSheet,_WorkBook,WorkSheets,WorkBooks,Range,然後匯入;
   c. 匯入後自動在工程中添加CApplication,CWorkSheet,CWorkBook,CWorkSheets,CWorkBooks,CRange這些類;

然後需要把這些類的標頭檔中的第一句話 #import ".......EXCEL.EXE" nonamespace 刪除;

引入之後如果編譯遇到錯誤,Not enough actual parameters for macro 'DialogBoxW'. 讓人頭疼!

 

解決方案是在CRange類中,DialogBox()前面添加底線變成_DialogBox(),解決了!
VARIANT DialogBox()  
{  
  VARIANT result;  
  InvokeHelper(0xf5, DISPATCH_METHOD, VT_VARIANT, (void*)&result, NULL);  
  return result;  
}  

 void Cexcel開啟3Dlg::OnBnClickedOk()  
{  
    // TODO: 在此添加控制項通知處理常式代碼  
    CApplication app;  
    CWorkbooks books;  
    CWorkbook book;  
    CWorksheets sheets;  
    CWorksheet sheet;  
    CRange range;  
    CRange iCell;  
    LPDISPATCH lpDisp;  
    COleVariant vResult;  
    COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);  
    if(!app.CreateDispatch(L"Excel.Application"))  
    {  
    AfxMessageBox(L"無法啟動Excel伺服器!");  
    return;  
    }  
    books.AttachDispatch(app.get_Workbooks());  
    lpDisp = books.Open(“d://test.xls”,covOptional, covOptional, covOptional, covOptional, covOptional,covOptional, covOptional, covOptional, covOptional, covOptional,covOptional, covOptional, covOptional,covOptional);  
      
    //得到Workbook  
    book.AttachDispatch(lpDisp);  
    //得到Worksheets  
    sheets.AttachDispatch(book.get_Worksheets());  
   
    //得到當前活躍sheet  
    //如果有儲存格正處於編輯狀態中,此操作不能返回,會一直等待  
    lpDisp=book.get_ActiveSheet();  
    sheet.AttachDispatch(lpDisp);  
    //讀取第一個儲存格的值  
    range.AttachDispatch(sheet.get_Cells());  
    range.AttachDispatch(range.get_Item (COleVariant((long)2),COleVariant((long)1)).pdispVal );  
    /*COleVariant*/ vResult =range.get_Value2();  
    CString str;  
    if(vResult.vt == VT_BSTR) //字串  
    {  
    str=vResult.bstrVal;  
    }  
    else if (vResult.vt==VT_R8) //8位元組的數字  
    {  
    str.Format(L"%f",vResult.dblVal);  
    }  
   
    /*else if(vResult.vt==VT_DATE) //時間格式 
    { 
    SYSTEMTIME st; 
    VariantTimeToSystemTime(&vResult.date, &st); 
    } 
    else if(vResult.vt==VT_EMPTY) //儲存格空的 
    { 
    str=""; 
    }*/    
    books.Close();   
    app.Quit();             // 退出  
    //釋放對象    
    range.ReleaseDispatch();  
    sheet.ReleaseDispatch();  
    sheets.ReleaseDispatch();  
    book.ReleaseDispatch();  
    books.ReleaseDispatch();  
    app.ReleaseDispatch();  
    OnOK();  
    MessageBox(str);
}

另外,在這個檔案的前端記得加入:
#include "CApplication.h"  
#include "CRange.h"  
#include "CWorkbook.h"  
#include "CWorkbooks.h"  
#include "CWorksheet.h"  
#include "CWorksheets.h"  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.