在VC中如何将数据导入Word中
在给企业开发的项目中,客户经常要求将数据汇总显示并打印。站在程序员的立场上,简单数据的汇总打印可以采用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函数时会出现不确定现象(如果你知道为什么的话请告诉我)。如果你需要绘制表格,不要用程序来动态形成,绘制表格的代码是很繁琐的,而且在页眉中绘制单元格是很难控制的。可以先在模版中绘出你要的表格格式,然后用程序复制单元格或者直接使用模版中的单元格。由于我做的项目表格的行数不确定,我采用的是复制单元格的方式(速度比较慢,谁有更好的方法?)。
vc调用Word写出怎么修改文件初始
vc6。
0Microsoft Office Word方法/步骤1打开vc6。0,新建一个MFC的基本对话框工程,我这里随便给它命名为1_12点击查看,建立类向导,点击Add Class,选择From a type library。
选择Microsoft Office安装目录下的MSWORD。 OLE文件(我的默认路径是C:\Program Files\Microsoft Office\OFFICE11\MSWORD。
OLE),打开。弹出一个增加类的界面,按shift全选(在程序设计的过程中,我们会知道哪些类是必要的,这里不管它),OK3在类视图区,会发现增加了很多类。
下面我们首先进行COM组建的初始化,在应用程序的InitInstance函数中增加以下代码:if(CoInitialize(NULL)!=S_OK){AfxMessageBox(“初始化COM组件失败!“);return FALSE;}4接下来自己新建一个类,用来封装操作Word的API函数。 点击插入,新建类,class type选择Generic Class(没有基类的),类名为CMeOffice。
5打开文件视图区,编译头文件MeOffice。h,在其中加入:#include“comdef。
h“#include“atlbase。 h“#include“msword。
h“和public:_Application m_wdApp; Documents m_wdDocs;_Document m_wdDoc;Selection m_wdSel;BOOL CreateApplication(); //创建ApplicationBOOL CreateDocument(); //创建Document文档BOOL WriteText(LPSTR szStr);//向文档中写入数据6编辑MeOffice。 cpp文件,加入自定义函数的实现(下面的代码的逻辑其实很好懂、看函数名就基本能明白函数的功能)://这个函数打开一个没有文档的应用程序界面BOOL CMeOffice::CreateApplication(){if(FALSE==m_wdApp。
CreateDispatch(“Word。Application“)){AfxMessageBox(“创建Application失败!“);return FALSE;}m_wdApp。
SetVisible(TRUE); //是否显示return TRUE;}BOOL CMeOffice::CreateDocument(){if(!m_wdApp。 m_lpDispatch){AfxMessageBox(“Application没有成功创建!“);return FALSE;}m_wdDocs。
AttachDispatch(m_wdApp。GetDocuments());if(!m_wdApp。
m_lpDispatch){AfxMessageBox(“AttachDispatch失败“);return FALSE;}CComVariant Template(““);CComVariant NewTemplate(false),DocumentType(0),Visible;m_wdDocs。 Add(&Template,&NewTemplate,&DocumentType,&Visible);//上面的代码足够新建一个文档m_wdDoc=m_wdApp。
GetActiveDocument();if(!m_wdDoc。m_lpDispatch){AfxMessageBox(“GetActiveDocument失败“);return FALSE;}m_wdSel=m_wdApp。
GetSelection();if(!m_wdSel。m_lpDispatch){AfxMessageBox(“GetSelection失败“);return FALSE;}return TRUE;}BOOL CMeOffice::WriteText(LPSTR szStr){m_wdSel。
TypeText(szStr);return TRUE;}7好了,类我们已经封装好了。现在我们可以调用封装的函数,实现操作word的功能。
在对话框类中新建一个成员变量 CMeOffice m_meOffice;在对话框初始化函数中加入下面的代码:m_meOffice。 CreateApplication();m_meOffice。
CreateDocument();m_meOffice。WriteText(“我是中国人民的儿子,我深深地爱着我的祖国!“);8运行程序,就自动新建了一个Application,里面有一个Document,上面显示“我是中国人民的儿子,我深深地爱着我的祖国!”。
在VC6.0下,如何调用WORD并且绘制一个自定义的表格,同时将数据
刚好前段时间弄过。我把大致的代码粘上你看下吧。是C#的。
和你说下思路吧,先在WORD中画好要打印的表,并且设置好,横向的可以在“文件”->;“页面设置”里设置。然后把要绑定数据库的部分插入书签。打印的时候调用设计好的那个WORD文件把数据库的内容绑定到书签就行了。
首先要在程序中引入COM组件中的Microsoft Word 11。
安装的word中要包括.net编程组件和Interop(默认是不安装的)。
public void bindAndPrint()
{ //绑定Work和数据库
Microsoft.Office.Interop.Word.Application app = null;
Microsoft.Office.Interop.Word.Document doc = null;
object missing = System.Reflection.Missing.Value;
object templateFile = Application.StartupPath + @"\word模板.doc";
try
{
app = new Microsoft.Office.Interop.Word.ApplicationClass();
doc = app.Documents.Add(ref templateFile, ref missing, ref missing, ref missing);
try
{
foreach (Microsoft.Office.Interop.Word.Bookmark bm in doc.Bookmarks)
{
bm.Select();
string item = bm.Name;
if (item.Equals("title")) //word中的书签名"title"
{
bm.Range.Text = title; //title为要替换书签的变量,
//即可以将数据库中的值读入title中
}
}
}
catch
{ }
//打印
doc.PrintOut(ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing);
}
catch (Exception exp)
{
MessageBox.Show(exp.Message, this.Text);
}
//结束word进程
finally
{
object saveChange = Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges;
if (doc != null) doc.Close(ref saveChange, ref missing, ref missing);
if (app != null) app.Quit(ref missing, ref missing, ref missing);
}
break;
}
希望能帮到你!
蔑视奥可马的普亨大帝