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