VC2010 操作 MSWORD

每隔一二年就要用一次 WORD 或其它 MSOffice 组件,好多次了,每次都忘的一干二净,从头google,这次又要用,顺便记下来,以备不时之需,同时分享给大家。开发环境 WIN7-X64, VC2010, MSOffice2010。

1. 在VC2010项目名称上右击,选择类向导...


2.在右上角的添加类中选择“类库中的MFC类”

3. 在新对话框中选择文件,点击右边的“...”按钮,按图示选择MSWORD.OLD文件。

4. 按需要选择一些常用的类,完成

5. 把新生成的 .h 文件顶部的 #import "E:\\TTMv8\\Debug\\MSWORD.OLB" no_namespace 这一行注释掉,否则编译时会出现一大堆错误,网上有别的解决办法,我觉得注掉这个办法最好。出现的错误代码如下:

//#import "E:\\TTMv8\\Debug\\MSWORD.OLB" no_namespace
/* 编译时出一大堆错,把上面这一句注消就好了!!!!!!!,可能还能保证各word版本的兼容性
1>e:\ttmv8\ttmv8\capplication.h(3): warning C4278: “ExitWindows”: 类型库“E:\\TTMv8\\Debug\\MSWORD.OLB”中的标识符已经是宏;使用“rename”限定符
1>e:\ttmv8\ttmv8\capplication.h(3): error C2872: “Font”: 不明确的符号
1>          可能是“c:\program files (x86)\microsoft visual studio 10.0\vc\include\comdef.h(312) : Font”
1>          或       “c:\program files (x86)\microsoft sdks\windows\v7.0a\include\gdiplusheaders.h(244) : Gdiplus::Font”
1>e:\ttmv8\ttmv8\capplication.h(3): error C2872: “Font”: 不明确的符号
1>          可能是“c:\program files (x86)\microsoft visual studio 10.0\vc\include\comdef.h(312) : Font”
1>          或       “c:\program files (x86)\microsoft sdks\windows\v7.0a\include\gdiplusheaders.h(244) : Gdiplus::Font”
*/

6. 添加代码,以下是实际使用的代码,功能是用指定的 word 模板新建一个文档,在预设的书签位置插入文字和图片。

// 将当前所有打开的图像窗口导出到word中, 最多输出6个

void ViewImagesFrame::OnReportimg()
{
	CDocument0 cdoc;	// Word 文档类
	
	if( m_bViewmax )	// 最大化时导出一幅活动图像
	{
		// word 图表报告模板文件
		CString str;
		str.Format( L"%s\\imgreport1.dotx", theApp.appPath); // 取对应模板 
		if( ! wordopen(  str, cdoc ) )
			return;

		// 插入文字信息
		insertinfo( cdoc );

		// 插入图像信息
		str.Format(L"%s/reportimg0.png", theApp.appPath);
		m_pView->OnExportimg( str );
		insertimg(str, cdoc, L"v8img_image0");
	}
	else	//否则
	{
		int n = m_arViews.GetSize();
		if( !n )
			return;

		if( n > 6 )
			n = 6;	//最多输出6个

		// word 图表报告模板文件
		CString str;
		str.Format( L"%s\\imgreport%i.dotx", theApp.appPath, n); // 取对应模板 
		if( ! wordopen(  str, cdoc ) )
			return;

		// 插入文字信息
		insertinfo( cdoc );

		// 插入图像信息
		for( int i = 0; i < n; i++ )
		{
			str.Format(L"%s/reportimg%i.png", theApp.appPath, i);
			m_arViews[i]->OnExportimg( str );
			CString str2;
			str2.Format(L"v8img_image%i", i);
			insertimg(str, cdoc, str2);
		}
	}
}

// 将当前所有打开的图像窗口导出到word中, 最多输出6个, LPCTSTR dotxname 指定的模板, CDocument0 &cdoc out 返回新建的文档。
bool ViewImagesFrame::wordopen( LPCTSTR dotxname, CDocument0 &cdoc )
{
	COleVariant
		covTrue((short)TRUE),
		covFalse((short)FALSE),
		covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR),
		//covFileName(_T("E:\\temp\\ac\\Debug\\imgreport.dotx"));
		covFileName(dotxname);

	CApplication capp;
	CDocuments cdocs;
	if(FALSE == capp.CreateDispatch(_T("word.application"), NULL)){
		return false;
	}

	capp.put_Visible(TRUE);

	CString version = capp.get_Version();
	CString name = capp.get_Name();
	CString cap1 = capp.get_Caption();

	LPDISPATCH disp = capp.get_Documents();

	if(NULL == disp){
		return false;
	}

	cdocs.AttachDispatch(disp);

	if(NULL == cdocs.m_lpDispatch){
		return false;
	}

	cdoc.AttachDispatch(cdocs.Add(
		covFileName,
		covFalse,
		covFalse,
		covTrue
		));

	if(NULL == cdoc.m_lpDispatch){
		return false;
	}

	return true;
}

// 向word中加入文件信息
void ViewImagesFrame::insertinfo( CDocument0 &cdoc )
{
	myimg * pim =  m_arViews[0]->pimg;	// 取第一个图像的信息

	insertstr(cdoc, L"v8img_name", pim->name );

	CString str;
	str.Format(L"%i", pim->m_nAge);
	insertstr(cdoc, L"v8img_age", str );

	insertstr(cdoc, L"v8img_sex", pim->m_strSex );

	insertstr(cdoc, L"v8img_subject", pim->subject );	// 检查方法

	str = pim->scanday.Format( _T("%Y-%m-%d") );
	insertstr(cdoc, L"v8img_scandate", str );	// 扫描日期

	insertstr(cdoc, L"v8img_sick", pim->sickid );	// 扫描编号

	Cdasys ds;
	insertstr(cdoc, L"v8img_company", ds.getvalue(L"CompanyName") );	// 单位
	insertstr(cdoc, L"v8img_address", ds.getvalue(L"CompanyAddress") );	// 单位
	insertstr(cdoc, L"v8img_telephone", ds.getvalue(L"CompanyTelephone") );	// 单位
}

// 插入字符串,  CDocument0 &cdoc 文档, LPCTSTR strMark 书签名, LPCTSTR strValue,插入的值
void ViewImagesFrame::insertstr( CDocument0 &cdoc, LPCTSTR strMark, LPCTSTR strValue )
{
	CBookmarks bms = cdoc.get_Bookmarks();

	COleVariant bm( strMark );
	CBookmark0 bk = bms.Item(bm);
	CRange rang = bk.get_Range();
	rang.InsertAfter(strValue);
}

// 向word中加入图像, PCTSTR imgname 图像文件名, CDocument0 &cdoc 文档word, LPCTSTR mark 书签名
void ViewImagesFrame::insertimg( LPCTSTR imgname, CDocument0 &cdoc, LPCTSTR mark )
{
	CBookmarks bms = cdoc.get_Bookmarks();

	COleVariant bm0( mark );
	CBookmark0 bk = bms.Item(bm0);
	CRange rang = bk.get_Range();
	CnlineShapes shape = cdoc.get_InlineShapes();
	shape.AddPicture(imgname, COleVariant((short)FALSE), COleVariant((short)TRUE), &_variant_t(rang));
}


你可能感兴趣的:(VC2010 操作 MSWORD)