请教: 哪有关于Office2000开发接口的说明和例子, 急!, 在线等待

my9471 2003-12-18 12:20:51
我想在VC中打开Office2000中Word, excel,powerpoint等文档, 查看了很多资料, 都说用Office2000中提供的Com接口开发最快, 可那些接口中的参数全是一样的,MSDN上又没有相关说明,我该怎么办啊,谁帮我,高分送上,急死人了!
...全文
119 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
qingenerp 2004-03-01
  • 打赏
  • 举报
回复
收藏
my9471 2003-12-29
  • 打赏
  • 举报
回复
yintongshun(踏雪有痕):
你说的抓图是指抓屏吗, 我知道怎么做, 但我要做的是在后台打开Word转化成图片, 不显示Word界面的, 你说的这种方法是不行的, 我想要把每一页转化成一张图片, 这样一个文档转化成一系列图片, 能读出Word的信息也可以, 我可经在内存中完成这一操作, 现在我已可以读出文本内容, 但对图片和表格还不知道怎么处理, 你有办法吗?
yintongshun 2003-12-26
  • 打赏
  • 举报
回复
呵呵,不好意思,我回复后再没看到这个帖子,也没收到短信息,今天刚看到。我没代码,如果你想打印成位图,抓图就可以的,关于抓图的网上例子比较多
my9471 2003-12-26
  • 打赏
  • 举报
回复
yintongshun(踏雪有痕):
你那个打印成pdf格式的方法我试了, 怎么不行啊, 我想如果能打印成位图也可以解决我的问题了, 完整源码可以给我吗,谢了,Email:ycpok@21cn.com
gjd111686 2003-12-23
  • 打赏
  • 举报
回复
只有自己安装Office的VBA帮助了,而且是VBScript需要自己测试
可以利用录制宏来查看脚本
my9471 2003-12-23
  • 打赏
  • 举报
回复
太家还有其它东西吗?^_^
my9471 2003-12-19
  • 打赏
  • 举报
回复
yintongshun(踏雪有痕):
你那个打印成pdf格式的完整源码可以给我吗,谢了,Email:ycpok@21cn.com
sinhighly 2003-12-19
  • 打赏
  • 举报
回复
office 2000的帮助文件中有一些接口函数的说明
liuxianzhi 2003-12-19
  • 打赏
  • 举报
回复
我不太记得了,两年前做过这种工作。只是我做这部分工作,完全是根据msdn中搜索出来的信息,讲了如何一步步的用VC来开发这种程序。
如何转换为图片,就不太清楚了。我觉得可能office没有这种接口,可能你也找别的东西用。
my9471 2003-12-18
  • 打赏
  • 举报
回复
多谢各位:
上面的信息我基本上都搜索出来看过了, 不过还是要多谢各位! 现在都没有系统的关于office的开发资料吗?
liuxianzhi(碧渊):你说的MSDN中有例子在什么地方啊, 我是想要一个完全的说明文档,只看例子有些地方还是搞不懂, 这样就不能灵活应用啊!
yintongshun(踏雪有痕):你那个打印成pdf格式的方法我试了, 怎么不行啊, 我想如果能打印成位图也可以解决我的问题了

我的任务是:
读出office文档的内容转化成图片格式显示, 不过不是pdf, 而是位图, 行不行啊? 多谢各位帮我想想办法
yintongshun 2003-12-18
  • 打赏
  • 举报
回复
再来个Excel的:
在Visual C++ 中调用Excel 2000

作者:程 蓬

在开发软件时,经常要将数据输出到Excel 2000中,在Excel 2000中对该数据进行进一步地格式化处理或进行计算处理。在Visual Basic中处理起来较简单,Excel 2000的VB编程帮助中有较为详细的介绍。在Visual C++中如何进行处理了?利用Excel 2000的ActiveX Automate功能,处理起来同VB中类似。但要注意以下几点:


对于对象的属性值的读取或赋值,需要用GetProperty()或SetProperty(NewValue)函数,不能象VB中直接通过属性名称取值或赋值。例如:Worksheet.GetCount(), Worksheet.SetName(“Sheet1”)。


对集合对象中的成员对象的引用,必须使用集合对象的GetItem()函数。例如:Worksheets.GetItem(ColeVariant((long)1))或Worksheets.GetItem(ColeVariant(“Sheet1”))取得第一个工作表。


在COM接口中,时常用到Variant,BSTR,SafeArray数据类型。Variant数据类型是一个联合,可表示几乎所有的类型的数据,具体用法见MSDN中的相关介绍,类_variant_t是对VARIANT数据类型的封装。在Excel 2000的VB编程帮助中,如果提到某函数或属性需要一个值,该值的数据类型通常是Variant,在封装Excel 2000对象的类定义中,说明了具体需要的数据类型。BSTR是一个包括了字符串和字符串长度的数据结构,类_bstr_t是对BSTR数据类型的封装。在Excel 2000的VB编程帮助中提到的字符串通常指BSTR。具体函数参数或属性的数据类型,见封装该对象的类的定义。SafeArray是一个包括数组和数组边界的结构,数组边界外的内容不允许访问。在Excel 2000的VB编程帮助中提到的数组是指SafeArray。关于SafeArray的处理,请见MSDN的相关帮助。


对于缺省参数和缺省值。在VB中,函数的参数可以空缺,在VC++中不允许,必须将所有的参数填写完全。如果你希望指定某个参数为缺省值,根据参数数据类型的不同,可指定不同的缺省值。当参数数据类型为字符串时,可以用长度为0的字符串。如果参数是Variant类型,可用常量vtMissing,该常量在comdef.h中定义。也可用_variant_t(DISP_E_PARAMNOTFOUND, VT_ERROR)产生一个Variant对象。


Excel对象中的集合对象有时包括的子对象是不一定的,例如:Range对象,可以表示Cell的集合,也可以表示Column的集合或Row的集合,Range.GetItem(1)可以返回Cell或Column或Row对象。


对对象的引用或传递对象,使用IDispatch类对象,有时利用Variant对IDispatch进行包装。


以下是一段源程序,演示如何启动Excel 2000,利用一个模板文件产生一个新文档,在该文档的”Sheet1”工作表的第一个单元中填写一段文字,设置第一列的列宽,然后调用一个模板中的宏,执行一段程序,最后打印预览该Excel文档。模板文件名称:MyTemplate.xlt。程序在Visual C++ 6.0 sp4,Windows 2000 Professional sp-1下调试通过。


首先利用Visual C++ 6.0,建立一个MFC基于对话框的工程项目,共享DLL,Win32平台。工程名称ExcelTest。在主对话框中加入一个按钮,


ID IDC_EXCELTEST


Caption Test Excel


双击该按钮,增加成员函数void CExcelTestDlg::OnExceltest()。


在BOOL CExcelTestApp::InitInstance()中,dlg.DoModal();之前增加代码:


if (CoInitialize(NULL)!=0)


{


AfxMessageBox("初始化COM支持库失败!");


exit(1);


}


在return FALSE; 语句前,加入:


CoUninitialize();


选择Menu->View->ClassWizade,打开ClassWizade窗口,选择Add Class->From a type library,选择D:\Program Files\Microsoft Office\office\Excel9.OLB(D:\Program Files\Microsoft Office\是本机上Microsoft Office 2000的安装目录,可根据个人机器上的实际安装目录修改)。选择_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range,加入新类,分别为_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range,头文件Excel9.h,源文件Excel9.cpp。


在ExcelTestDlg.cpp文件的头部,#include "ExcelTestDlg.h"语句之下,增加 :


#include "comdef.h"


#include "Excel9.h"


在void CExcelTestDlg::OnExceltest() 函数中增加如下代码:


void CExcelTestDlg::OnExceltest()


{


_Application ExcelApp;


Workbooks wbsMyBooks;


_Workbook wbMyBook;


Worksheets wssMysheets;


_Worksheet wsMysheet;


Range rgMyRge;


//创建Excel 2000服务器(启动Excel)




if (!ExcelApp.CreateDispatch("Excel.Application",NULL))


{


AfxMessageBox("创建Excel服务失败!");


exit(1);


}


//利用模板文件建立新文档


wbsMyBooks.AttachDispatch(ExcelApp.GetWorkbooks(),true);


wbMyBook.AttachDispatch(wbsMyBooks.Add(_variant_t("g:\\exceltest\\MyTemplate.xlt")));


//得到Worksheets


wssMysheets.AttachDispatch(wbMyBook.GetWorksheets(),true);


//得到sheet1


wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("sheet1")),true);


//得到全部Cells,此时,rgMyRge是cells的集合


rgMyRge.AttachDispatch(wsMysheet.GetCells(),true);


//设置1行1列的单元的值


rgMyRge.SetItem(_variant_t((long)1),_variant_t((long)1),_variant_t("This Is A Excel Test Program!"));


//得到所有的列


rgMyRge.AttachDispatch(wsMysheet.GetColumns(),true);


//得到第一列


rgMyRge.AttachDispatch(rgMyRge.GetItem(_variant_t((long)1),vtMissing).pdispVal,true);


//设置列宽


rgMyRge.SetColumnWidth(_variant_t((long)200));


//调用模板中预先存放的宏


ExcelApp.Run(_variant_t("CopyRow"),_variant_t((long)10),vtMissing,vtMissing,


vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,


vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,


vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,


vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing);


//打印预览


wbMyBook.SetSaved(true);


ExcelApp.SetVisible(true);


wbMyBook.PrintPreview(_variant_t(false));


//释放对象


rgMyRge.ReleaseDispatch();


wsMysheet.ReleaseDispatch();


wssMysheets.ReleaseDispatch();


wbMyBook.ReleaseDispatch();


wbsMyBooks.ReleaseDispatch();


ExcelApp.ReleaseDispatch();


}


添加完以上程序后,可运行看结果
yintongshun 2003-12-18
  • 打赏
  • 举报
回复

在VC中如何将数据导入Word中

[03-9-10 10:36] 作者:何鸿鹏
在给企业开发的项目中,客户经常要求将数据汇总显示并打印。站在程序员的立场上,简单数据的汇总打印可以采用VB自带报表,对复杂的数据用水晶报表或第三方打印控件。在企业中,汇总数据另一个目的是为了便于交流和共享资源,报表的格式通常固定,内容可以自己调整,他们对 Excel 和 Word 情有独钟。

  刚完成的项目中,客户要求将汇总的数据以三种方式进行显示和打印:AutoCad、Excel 和 Word 文档中。前两种方式网上资源很多,对 Word 文档我找到例子不是很多。由于需要和 AutoCad 开发程序结合,不能将 Word 文档以 OLE 的方式 嵌入到程序中,文档只能在内存中形成,这将占用大量的CPU资源,另开一个线程进行处理,线程间以发送消息的方式进行通信。

  首先在VC引入Word, 对格式相同的地方一定使用模版的方式进行处理,这可以大大的提高运行速度,Word中的模版为*.dot。加载模版的代码为:

  sDocs=sApp.GetDocuments();
  sDocs.AttachDispatch(sApp.GetDocuments(),true);
  COleVariant vFalse((long)0),vTrue((long)1);
  sDoc.AttachDispatch(sDocs.Add(COleVariant(_variant_t(strFileName)), vFalse,vFalse, vTrue));

  需要注意的是,如果Word中使用到表格,VBA录制的全是Selection对象的处理方法,在VC中使用Selection对象的MoveUp和MoveDown函数时会出现不确定现象(如果你知道为什么的话请告诉我)。如果你需要绘制表格,不要用程序来动态形成,绘制表格的代码是很繁琐的,而且在页眉中绘制单元格是很难控制的。可以先在模版中绘出你要的表格格式,然后用程序复制单元格或者直接使用模版中的单元格。由于我做的项目表格的行数不确定,我采用的是复制单元格的方式(速度比较慢,谁有更好的方法?)。

  剩下的处理流程,就是你想做什么操作,先在Word中录制一段宏,然后查看其VBA代码,并将其转化到Vc程序中。这就看你Word使用的熟练程度了,例如如何把不同页的页眉页脚设置不同,如何得到当前页的页数以及总的文档的页数,具体可以参考程序。

  VC中也可以像Excel中调用模版中存在的宏,代码如下:
  VARIANT vtMissing ;vtMissing.vt =VT_ERROR;
  vtMissing.scode =DISP_E_PARAMNOTFOUND;
  sApp.Run("AddCell",&vtMissing,&vtMissing,&vtMissing,
  &vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,
  &vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,
  &vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,
  &vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing);


Excel的:
http://www.vchelp.net/vchelp/file2003_2/excelaccess.asp?type_id=50&class_id=1&cata_id=10&article_id=1004&search_term=
yintongshun 2003-12-18
  • 打赏
  • 举报
回复

运用VC或Java对Office进行编程操作 etre(原作)
用VC对Office进行操作的介绍已经不少了,但是从来没有把word,excel,powerPoint进进全面的介绍的。
由于工作的需要,我需要对在自己的软件中对word,excel,powerPoint进行操作。所以把自己的体会写出来和大家分享,希望对大家有所帮助。当然还有很多不当之处,希望大家指出。
用例子来说明吧,首先创建一个MFC AppWizard(EXE)工程,然后通过在VIEW菜单中,选ClassWizard,选Automation选项卡,选Add Class,选择From a TypeLibrary, 选中Microsoft Office 2000 类型库:Excel9.olb,MSPPT9.OLB,MSWORD9.OLB(在Microsoft Office\Office目录下) 会将类型库中的所有类添加到你的工程中。
然后写一个类来操作Office吧!
ObtGuiGcomOfficePrinter .h
#if !defined(AFX_OBTGUIGCOMOFFICEPRINTER_H__03A0C2D8_DFC8_4B51_8ADB_994B86BACB82__INCLUDED_)
#define AFX_OBTGUIGCOMOFFICEPRINTER_H__03A0C2D8_DFC8_4B51_8ADB_994B86BACB82__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "comdef.h"
#include "ObtGuiGcomMsWord9.h"
#include "ObtGuiGcomMsPpt9.h"
#include "ObtGuiGcomExcel9.h"

class AFX_EXT_CLASS ObtGuiGcomOfficePrinter
{
public:
ObtGuiGcomOfficePrinter();
virtual ~ObtGuiGcomOfficePrinter();

//Operator
public:
BOOL WordPrinterToJcf(LPCTSTR lpszFileName,LPCTSTR lpszActivePrinter);
BOOL ExcelPrinterToJcf(LPCTSTR lpszFileName,LPCTSTR lpszActivePrinter);
BOOL PowerPointPrinterToJcf(LPCTSTR lpszFileName,LPCTSTR lpszActivePrinter);

};

#include "stdafx.h"
#include "ObtGuiGcomOfficePrinter.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

ObtGuiGcomOfficePrinter::ObtGuiGcomOfficePrinter()
{

}


ObtGuiGcomOfficePrinter::~ObtGuiGcomOfficePrinter()
{

}

BOOL ObtGuiGcomOfficePrinter::PowerPointPrinterToJcf(LPCTSTR lpszFileName,LPCTSTR lpszActivePrinter)
{
_PptApplication m_powerpointApp;
Presentations m_powerpointPres;
_Presentation m_powerpointPre;

m_powerpointPres.ReleaseDispatch();
m_powerpointPre.ReleaseDispatch();

if(!m_powerpointApp.CreateDispatch("PowerPoint.Application"))
{
AfxMessageBox("创建PowerPoint服务失败!");
return FALSE;
}

m_powerpointApp.m_bAutoRelease=true;
m_powerpointApp.SetVisible(TRUE);//对于PowerPoint必须设置为TRUE

m_powerpointPres.AttachDispatch(m_powerpointApp.GetPresentations());
m_powerpointPres.Open(lpszFileName,-1,-1,-1);
m_powerpointPre.AttachDispatch(m_powerpointApp.GetActivePresentation(),TRUE);

m_powerpointPre.PrintOut(-1,-1,"",long(1),-1);

m_powerpointApp.Quit();

m_powerpointPre.ReleaseDispatch();
m_powerpointPres.ReleaseDispatch();
m_powerpointApp.ReleaseDispatch();

return TRUE;
}
BOOL ObtGuiGcomOfficePrinter::ExcelPrinterToJcf(LPCTSTR lpszFileName,LPCTSTR lpszActivePrinter)
{
_ExcelApplication m_excelApp;//定义Excel提供的应用程序对象
Workbooks m_excelBooks;
_Workbook m_excelBook;

m_excelBooks.ReleaseDispatch();
m_excelBook.ReleaseDispatch();
m_excelApp.m_bAutoRelease=true;

//创建Excel 2000服务器(启动Excel)
if (!m_excelApp.CreateDispatch("Excel.Application"))
{
AfxMessageBox("创建Excel服务失败!");
return FALSE;
}

m_excelApp.SetVisible(FALSE); //设置为隐藏
//利用模板文件建立新文档
m_excelBooks.AttachDispatch(m_excelApp.GetWorkbooks(),true);
m_excelBook.AttachDispatch(m_excelBooks.Add(_variant_t(lpszFileName)));

//m_excelApp.SetActivePrinter(lpszActivePrinter); //设置当前打印机
COleVariant covTrue((short)TRUE), covFalse((short)FALSE), covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);//定义打印机并打印
m_excelBook.PrintOut(covOptional,covOptional,COleVariant(long(1)),covFalse,covOptional,covOptional,covOptional,covOptional);

m_excelApp.Quit();//退出

m_excelBook.ReleaseDispatch();
m_excelBooks.ReleaseDispatch();
m_excelApp.ReleaseDispatch();

return TRUE;
}

BOOL ObtGuiGcomOfficePrinter::WordPrinterToJcf(LPCTSTR lpszFileName,LPCTSTR lpszActivePrinter)
{

_WordApplication m_wordApp;//定义Word提供的应用程序对象
Documents m_wordDocs;//定义Word提供的文档对象
_Document m_wordDoc; //当前的的文档对象

m_wordDocs.ReleaseDispatch();
m_wordDoc.ReleaseDispatch();
m_wordApp.m_bAutoRelease=true;

if(!m_wordApp.CreateDispatch("Word.Application")) //创建Word应用服务
{
AfxMessageBox("创建Word应用服务失败!");
return FALSE;
}

m_wordApp.SetVisible(FALSE); //设置为隐藏
//下面是打开文件定义VARIANT变量;
COleVariant varFilePath(lpszFileName);
COleVariant varstrNull("");
COleVariant varZero((short)0);
COleVariant varTrue(short(1),VT_BOOL);
COleVariant varFalse(short(0),VT_BOOL);

m_wordDocs.AttachDispatch(m_wordApp.GetDocuments());//将Documents类对象m_Docs和Idispatch接口关联起来;
m_wordDocs.Open(varFilePath,varFalse,varFalse,varFalse,varstrNull,varstrNull,varFalse,varstrNull,varstrNull,varTrue,varTrue,varTrue);
m_wordDoc.AttachDispatch(m_wordApp.GetActiveDocument()); //得到当前激活的Document对象

m_wordApp.SetActivePrinter(lpszActivePrinter); //设置当前打印机
COleVariant covTrue((short)TRUE), covFalse((short)FALSE), covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); //定义打印属性
m_wordDoc.PrintOut(covFalse,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
COleVariant((long)1),
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional);

m_wordApp.Quit(covOptional,covOptional,covOptional);//退出

m_wordDoc.ReleaseDispatch(); //断开关联;
m_wordDocs.ReleaseDispatch();
m_wordApp.ReleaseDispatch();
return TRUE;
}
以上是用Office打开相应的文档进行打印的操作,如果你需要进行相应的其他操作,你可以用Office里面的宏进行录制然后转化为相应的代码。





yintongshun 2003-12-18
  • 打赏
  • 举报
回复
Excel的:
http://www.vchelp.net/vchelp/file2003_2/excelaccess.asp?type_id=50&class_id=1&cata_id=10&article_id=1004&search_term=
yintongshun 2003-12-18
  • 打赏
  • 举报
回复

在VC中如何将数据导入Word中

[03-9-10 10:36] 作者:何鸿鹏
在给企业开发的项目中,客户经常要求将数据汇总显示并打印。站在程序员的立场上,简单数据的汇总打印可以采用VB自带报表,对复杂的数据用水晶报表或第三方打印控件。在企业中,汇总数据另一个目的是为了便于交流和共享资源,报表的格式通常固定,内容可以自己调整,他们对 Excel 和 Word 情有独钟。

  刚完成的项目中,客户要求将汇总的数据以三种方式进行显示和打印:AutoCad、Excel 和 Word 文档中。前两种方式网上资源很多,对 Word 文档我找到例子不是很多。由于需要和 AutoCad 开发程序结合,不能将 Word 文档以 OLE 的方式 嵌入到程序中,文档只能在内存中形成,这将占用大量的CPU资源,另开一个线程进行处理,线程间以发送消息的方式进行通信。

  首先在VC引入Word, 对格式相同的地方一定使用模版的方式进行处理,这可以大大的提高运行速度,Word中的模版为*.dot。加载模版的代码为:

  sDocs=sApp.GetDocuments();
  sDocs.AttachDispatch(sApp.GetDocuments(),true);
  COleVariant vFalse((long)0),vTrue((long)1);
  sDoc.AttachDispatch(sDocs.Add(COleVariant(_variant_t(strFileName)), vFalse,vFalse, vTrue));

  需要注意的是,如果Word中使用到表格,VBA录制的全是Selection对象的处理方法,在VC中使用Selection对象的MoveUp和MoveDown函数时会出现不确定现象(如果你知道为什么的话请告诉我)。如果你需要绘制表格,不要用程序来动态形成,绘制表格的代码是很繁琐的,而且在页眉中绘制单元格是很难控制的。可以先在模版中绘出你要的表格格式,然后用程序复制单元格或者直接使用模版中的单元格。由于我做的项目表格的行数不确定,我采用的是复制单元格的方式(速度比较慢,谁有更好的方法?)。

  剩下的处理流程,就是你想做什么操作,先在Word中录制一段宏,然后查看其VBA代码,并将其转化到Vc程序中。这就看你Word使用的熟练程度了,例如如何把不同页的页眉页脚设置不同,如何得到当前页的页数以及总的文档的页数,具体可以参考程序。

  VC中也可以像Excel中调用模版中存在的宏,代码如下:
  VARIANT vtMissing ;vtMissing.vt =VT_ERROR;
  vtMissing.scode =DISP_E_PARAMNOTFOUND;
  sApp.Run("AddCell",&vtMissing,&vtMissing,&vtMissing,
  &vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,
  &vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,
  &vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,
  &vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing,&vtMissing);

yintongshun 2003-12-18
  • 打赏
  • 举报
回复

运用VC或Java对Office进行编程操作 etre(原作)
用VC对Office进行操作的介绍已经不少了,但是从来没有把word,excel,powerPoint进进全面的介绍的。
由于工作的需要,我需要对在自己的软件中对word,excel,powerPoint进行操作。所以把自己的体会写出来和大家分享,希望对大家有所帮助。当然还有很多不当之处,希望大家指出。
用例子来说明吧,首先创建一个MFC AppWizard(EXE)工程,然后通过在VIEW菜单中,选ClassWizard,选Automation选项卡,选Add Class,选择From a TypeLibrary, 选中Microsoft Office 2000 类型库:Excel9.olb,MSPPT9.OLB,MSWORD9.OLB(在Microsoft Office\Office目录下) 会将类型库中的所有类添加到你的工程中。
然后写一个类来操作Office吧!
ObtGuiGcomOfficePrinter .h
#if !defined(AFX_OBTGUIGCOMOFFICEPRINTER_H__03A0C2D8_DFC8_4B51_8ADB_994B86BACB82__INCLUDED_)
#define AFX_OBTGUIGCOMOFFICEPRINTER_H__03A0C2D8_DFC8_4B51_8ADB_994B86BACB82__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "comdef.h"
#include "ObtGuiGcomMsWord9.h"
#include "ObtGuiGcomMsPpt9.h"
#include "ObtGuiGcomExcel9.h"

class AFX_EXT_CLASS ObtGuiGcomOfficePrinter
{
public:
ObtGuiGcomOfficePrinter();
virtual ~ObtGuiGcomOfficePrinter();

//Operator
public:
BOOL WordPrinterToJcf(LPCTSTR lpszFileName,LPCTSTR lpszActivePrinter);
BOOL ExcelPrinterToJcf(LPCTSTR lpszFileName,LPCTSTR lpszActivePrinter);
BOOL PowerPointPrinterToJcf(LPCTSTR lpszFileName,LPCTSTR lpszActivePrinter);

};

#include "stdafx.h"
#include "ObtGuiGcomOfficePrinter.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

ObtGuiGcomOfficePrinter::ObtGuiGcomOfficePrinter()
{

}


ObtGuiGcomOfficePrinter::~ObtGuiGcomOfficePrinter()
{

}

BOOL ObtGuiGcomOfficePrinter::PowerPointPrinterToJcf(LPCTSTR lpszFileName,LPCTSTR lpszActivePrinter)
{
_PptApplication m_powerpointApp;
Presentations m_powerpointPres;
_Presentation m_powerpointPre;

m_powerpointPres.ReleaseDispatch();
m_powerpointPre.ReleaseDispatch();

if(!m_powerpointApp.CreateDispatch("PowerPoint.Application"))
{
AfxMessageBox("创建PowerPoint服务失败!");
return FALSE;
}

m_powerpointApp.m_bAutoRelease=true;
m_powerpointApp.SetVisible(TRUE);//对于PowerPoint必须设置为TRUE

m_powerpointPres.AttachDispatch(m_powerpointApp.GetPresentations());
m_powerpointPres.Open(lpszFileName,-1,-1,-1);
m_powerpointPre.AttachDispatch(m_powerpointApp.GetActivePresentation(),TRUE);

m_powerpointPre.PrintOut(-1,-1,"",long(1),-1);

m_powerpointApp.Quit();

m_powerpointPre.ReleaseDispatch();
m_powerpointPres.ReleaseDispatch();
m_powerpointApp.ReleaseDispatch();

return TRUE;
}
BOOL ObtGuiGcomOfficePrinter::ExcelPrinterToJcf(LPCTSTR lpszFileName,LPCTSTR lpszActivePrinter)
{
_ExcelApplication m_excelApp;//定义Excel提供的应用程序对象
Workbooks m_excelBooks;
_Workbook m_excelBook;

m_excelBooks.ReleaseDispatch();
m_excelBook.ReleaseDispatch();
m_excelApp.m_bAutoRelease=true;

//创建Excel 2000服务器(启动Excel)
if (!m_excelApp.CreateDispatch("Excel.Application"))
{
AfxMessageBox("创建Excel服务失败!");
return FALSE;
}

m_excelApp.SetVisible(FALSE); //设置为隐藏
//利用模板文件建立新文档
m_excelBooks.AttachDispatch(m_excelApp.GetWorkbooks(),true);
m_excelBook.AttachDispatch(m_excelBooks.Add(_variant_t(lpszFileName)));

//m_excelApp.SetActivePrinter(lpszActivePrinter); //设置当前打印机
COleVariant covTrue((short)TRUE), covFalse((short)FALSE), covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);//定义打印机并打印
m_excelBook.PrintOut(covOptional,covOptional,COleVariant(long(1)),covFalse,covOptional,covOptional,covOptional,covOptional);

m_excelApp.Quit();//退出

m_excelBook.ReleaseDispatch();
m_excelBooks.ReleaseDispatch();
m_excelApp.ReleaseDispatch();

return TRUE;
}

BOOL ObtGuiGcomOfficePrinter::WordPrinterToJcf(LPCTSTR lpszFileName,LPCTSTR lpszActivePrinter)
{

_WordApplication m_wordApp;//定义Word提供的应用程序对象
Documents m_wordDocs;//定义Word提供的文档对象
_Document m_wordDoc; //当前的的文档对象

m_wordDocs.ReleaseDispatch();
m_wordDoc.ReleaseDispatch();
m_wordApp.m_bAutoRelease=true;

if(!m_wordApp.CreateDispatch("Word.Application")) //创建Word应用服务
{
AfxMessageBox("创建Word应用服务失败!");
return FALSE;
}

m_wordApp.SetVisible(FALSE); //设置为隐藏
//下面是打开文件定义VARIANT变量;
COleVariant varFilePath(lpszFileName);
COleVariant varstrNull("");
COleVariant varZero((short)0);
COleVariant varTrue(short(1),VT_BOOL);
COleVariant varFalse(short(0),VT_BOOL);

m_wordDocs.AttachDispatch(m_wordApp.GetDocuments());//将Documents类对象m_Docs和Idispatch接口关联起来;
m_wordDocs.Open(varFilePath,varFalse,varFalse,varFalse,varstrNull,varstrNull,varFalse,varstrNull,varstrNull,varTrue,varTrue,varTrue);
m_wordDoc.AttachDispatch(m_wordApp.GetActiveDocument()); //得到当前激活的Document对象

m_wordApp.SetActivePrinter(lpszActivePrinter); //设置当前打印机
COleVariant covTrue((short)TRUE), covFalse((short)FALSE), covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); //定义打印属性
m_wordDoc.PrintOut(covFalse,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
COleVariant((long)1),
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional,
covOptional);

m_wordApp.Quit(covOptional,covOptional,covOptional);//退出

m_wordDoc.ReleaseDispatch(); //断开关联;
m_wordDocs.ReleaseDispatch();
m_wordApp.ReleaseDispatch();
return TRUE;
}
以上是用Office打开相应的文档进行打印的操作,如果你需要进行相应的其他操作,你可以用Office里面的宏进行录制然后转化为相应的代码。




liuxianzhi 2003-12-18
  • 打赏
  • 举报
回复
BOOL CWordInfo::SetFile(LPCTSTR lpszFileName)
{
m_sFullPath=lpszFileName;//¼Ç¼ÏÂÀ´Õâ¸öȫ·¾¶
CFileFind ff;
if (!ff.FindFile(lpszFileName)) return FALSE;

try
{
COleVariant covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
Documents docs(m_objWord->GetDocuments());
m_doc.AttachDispatch(docs.Open(
COleVariant(lpszFileName,VT_BSTR),
covFalse, // Confirm Conversion.
covFalse, // ReadOnly.
covFalse, // AddToRecentFiles.
covOptional, // PasswordDocument.
covOptional, // PasswordTemplate.
covFalse, // Revert.
covOptional, // WritePasswordDocument.
covOptional, // WritePasswordTemplate.
covOptional) // Format.
);
}
OLE_CATCH(FALSE);

m_bSetFile = true; m_sFileTitle = CCELTools::TitleOnly(lpszFileName);
return TRUE;
}
liuxianzhi 2003-12-18
  • 打赏
  • 举报
回复
CWordInfo::CWordInfo()
{
m_nRefCount++;
m_bSetFile = false;

if (1==m_nRefCount && CCELTools::IsWordExist())
{
try
{
ASSERT (NULL==m_objWord);
m_objWord = new _ApplicationWord;

if (!m_objWord->CreateDispatch("Word.Application"))
{
AfxMessageBox("²»ÄÜ´´½¨Word¶ÔÏó!", MB_ICONSTOP);
delete m_objWord; m_objWord = NULL;
throw 0;
return;
}
}
OLE_CATCH();
}
}
liuxianzhi 2003-12-18
  • 打赏
  • 举报
回复
MSDN里面有这种例子啊。
只要你安装有office,就可以在VC中导入他的msword9.olb或者msexcel9.olb,然后就可以用里面的类了。
我以前做过,不过没有小例子,你在msdn里面搜一下,肯定可以找到的。别着急,慢慢来!没有解决不了的问题。
my9471 2003-12-18
  • 打赏
  • 举报
回复
没人知道吗?

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧