MFC读取word和excel文件

注意: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"  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值