请教: 哪有关于Office2000开发接口的说明和例子, 急!, 在线等待 我想在VC中打开Office2000中Word, excel,powerpoint等文档, 查看了很多资料, 都说用Office2000中提供的Com接口开发最快, 可那些接口中的参数全是一样的,MSDN上又没有相关说明,我该怎么办啊,谁帮我,高分送上,急死人了! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 MSDN里面有这种例子啊。只要你安装有office,就可以在VC中导入他的msword9.olb或者msexcel9.olb,然后就可以用里面的类了。我以前做过,不过没有小例子,你在msdn里面搜一下,肯定可以找到的。别着急,慢慢来!没有解决不了的问题。 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(); }} 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;} 运用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();//Operatorpublic: 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_FILEstatic 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里面的宏进行录制然后转化为相应的代码。 在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= 运用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();//Operatorpublic: 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_FILEstatic 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里面的宏进行录制然后转化为相应的代码。 在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= 再来个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(); } 添加完以上程序后,可运行看结果 多谢各位: 上面的信息我基本上都搜索出来看过了, 不过还是要多谢各位! 现在都没有系统的关于office的开发资料吗? liuxianzhi(碧渊):你说的MSDN中有例子在什么地方啊, 我是想要一个完全的说明文档,只看例子有些地方还是搞不懂, 这样就不能灵活应用啊! yintongshun(踏雪有痕):你那个打印成pdf格式的方法我试了, 怎么不行啊, 我想如果能打印成位图也可以解决我的问题了 我的任务是: 读出office文档的内容转化成图片格式显示, 不过不是pdf, 而是位图, 行不行啊? 多谢各位帮我想想办法 yintongshun(踏雪有痕): 你那个打印成pdf格式的完整源码可以给我吗,谢了,Email:[email protected] 我不太记得了,两年前做过这种工作。只是我做这部分工作,完全是根据msdn中搜索出来的信息,讲了如何一步步的用VC来开发这种程序。如何转换为图片,就不太清楚了。我觉得可能office没有这种接口,可能你也找别的东西用。 office 2000的帮助文件中有一些接口函数的说明 只有自己安装Office的VBA帮助了,而且是VBScript需要自己测试可以利用录制宏来查看脚本 yintongshun(踏雪有痕): 你那个打印成pdf格式的方法我试了, 怎么不行啊, 我想如果能打印成位图也可以解决我的问题了, 完整源码可以给我吗,谢了,Email:[email protected] yintongshun(踏雪有痕): 你说的抓图是指抓屏吗, 我知道怎么做, 但我要做的是在后台打开Word转化成图片, 不显示Word界面的, 你说的这种方法是不行的, 我想要把每一页转化成一张图片, 这样一个文档转化成一系列图片, 能读出Word的信息也可以, 我可经在内存中完成这一操作, 现在我已可以读出文本内容, 但对图片和表格还不知道怎么处理, 你有办法吗? 关于软件模块化的问题 求助达人! (急!!!!)在MFC中,怎样实现当鼠标停在父窗口的某个位置时,出现图像或自定义的菜单,当鼠标离开时消失? 想在消息映射函数中获取消息ID 学MFC看哪本书比较好,介绍介绍(是光有VC的书) 怎么不能出现对话框????? Visual C++消息映射问题,请相助!!赠送高分 关于DLL中创建窗口,实现消息处理的问题 这个问题是什么意思? 编译错误????? 【公务贴】净化论坛风气,带有不文明语言的帖子一律删除 怪,COleDateTime t = COleDateTime::GetCurrentTime()在debug时出错。
只要你安装有office,就可以在VC中导入他的msword9.olb或者msexcel9.olb,然后就可以用里面的类了。
我以前做过,不过没有小例子,你在msdn里面搜一下,肯定可以找到的。别着急,慢慢来!没有解决不了的问题。
{
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();
}
}
{
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;
}
运用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里面的宏进行录制然后转化为相应的代码。
在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);
http://www.vchelp.net/vchelp/file2003_2/excelaccess.asp?type_id=50&class_id=1&cata_id=10&article_id=1004&search_term=
运用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里面的宏进行录制然后转化为相应的代码。
在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=
在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();
}
添加完以上程序后,可运行看结果
上面的信息我基本上都搜索出来看过了, 不过还是要多谢各位! 现在都没有系统的关于office的开发资料吗?
liuxianzhi(碧渊):你说的MSDN中有例子在什么地方啊, 我是想要一个完全的说明文档,只看例子有些地方还是搞不懂, 这样就不能灵活应用啊!
yintongshun(踏雪有痕):你那个打印成pdf格式的方法我试了, 怎么不行啊, 我想如果能打印成位图也可以解决我的问题了 我的任务是:
读出office文档的内容转化成图片格式显示, 不过不是pdf, 而是位图, 行不行啊? 多谢各位帮我想想办法
你那个打印成pdf格式的完整源码可以给我吗,谢了,Email:[email protected]
如何转换为图片,就不太清楚了。我觉得可能office没有这种接口,可能你也找别的东西用。
可以利用录制宏来查看脚本
你那个打印成pdf格式的方法我试了, 怎么不行啊, 我想如果能打印成位图也可以解决我的问题了, 完整源码可以给我吗,谢了,Email:[email protected]
你说的抓图是指抓屏吗, 我知道怎么做, 但我要做的是在后台打开Word转化成图片, 不显示Word界面的, 你说的这种方法是不行的, 我想要把每一页转化成一张图片, 这样一个文档转化成一系列图片, 能读出Word的信息也可以, 我可经在内存中完成这一操作, 现在我已可以读出文本内容, 但对图片和表格还不知道怎么处理, 你有办法吗?