200分!!!共享有价值的经验-----有高手乎??VC++操作WORD模板中的具体对象!!! 同感,与WORD交互我用的也是VB,用VC好象没那么方便 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 VC中应该也差不多啊,Word和Excel应该都是一样的。我倒是对Excel做过一些操作。 你可否操作WORD模板中的具体对象,例如模板中的 Label,图文框等呢?我有例子WORD模板,如需要可以EMAIL给你,试一下吧,这非常有价值! Word应该和Excel一样的,具体对象也一样啊,通过一个接口查询到相关接口,然后操作。 你可以将上面的VB例子,用VC++实现吗? awaker000(觉悟者) :把模板发给我,让我试一下![email protected] 图文框在哪里加的?我在Word里找不到! 用VC的MFC类包装的方法:首先在ClassWizard的"Add Class..."里选"From a type library...",在Office安装目录和系统System32/System目录下选MsoWordX.olb和Fm20.dll,加入MFC封装的_Application、 Documents、Selection、_Document、Frames、Frame、InlineShapes、InlineShape、OLEFormat OleObj、ILabelControl的对象。添加如下代码:(CMyClass是个对话框,OnButtonWord()是对话框上一个按钮的响应函数)BOOL CMyClass::RunWordApp(){ HKEY hKey; if(ERROR_SUCCESS!=RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("CLSID\\{000209FF-0000-0000-C000-000000000046}"), 0, KEY_QUERY_VALUE, &hKey)) { AfxMessageBox(_T("Open Word RegKey failed!")); return FALSE; } char lpData[255]; WORD cbData=255; if(ERROR_SUCCESS!=RegQueryValue(hKey, _T("LocalServer32"), lpData, (PLONG)&cbData)) { AfxMessageBox(_T("Query Word RegKey failed!")); ::RegCloseKey(hKey); return FALSE; } if(31>=WinExec(lpData,SW_SHOWNORMAL)) return FALSE; return TRUE;}void CMyClass::OnButtonWord() { _Application WordApp; Documents WordDocuments; Selection WordSelection; _Document WordActDoc; Frames WordFrames; Frame Frame1,Frame2; InlineShapes FrameInlineShapes; InlineShape InlineShapeLab; ILabelControl Lab; OLEFormat OleObj; // TODO: Add your control notification handler code here ::CoInitialize(NULL); // Translate server ProgID into a CLSID. ClsidFromProgID // gets this information from the registry. CLSID clsid; CLSIDFromProgID(L"Word.Application", &clsid); // Get an interface to the running instance, if any.. IUnknown *pUnk; HRESULT hr; hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk); if(FAILED(hr)) { if(!RunWordApp()) { AfxMessageBox(_T("Can't run Word Application!")); return; } else hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk); } // Get IDispatch interface for Automation... IDispatch *pDisp; hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pDisp); if(FAILED(hr)) { AfxMessageBox("找不到这个接口!"); return; } // Release the no-longer-needed IUnknown... pUnk->Release(); // ---------------------------------------------------- // Add automation code here- // ---------------------------------------------------- HWND hWnd=::FindWindow(_T("OpusApp"),NULL); ::SetForegroundWindow(hWnd); WordApp.AttachDispatch(pDisp); WordApp.SetVisible(TRUE); WordDocuments.AttachDispatch(WordApp.GetDocuments()); char pPathBuffer[255]; if(0==GetCurrentDirectory(255,pPathBuffer)) { AfxMessageBox(_T("Can't find current directory!")); return; } WordApp.ChangeFileOpenDirectory(pPathBuffer); CString cs; cs=pPathBuffer; strcat(pPathBuffer,_T("\\Doc7.dot")); VARIANT vtParam2, vtParam3, vtParam4, vtParam5, vtParam6, vtParam7, vtParam8, vtParam9, vtParam10; VariantInit(&vtParam2); VariantInit(&vtParam3); VariantInit(&vtParam4); VariantInit(&vtParam5); VariantInit(&vtParam6); VariantInit(&vtParam7); VariantInit(&vtParam8); VariantInit(&vtParam9); VariantInit(&vtParam10); COleVariant vtParam1(pPathBuffer); vtParam2.vt=VT_BOOL; vtParam2.boolVal = FALSE; vtParam3.vt=VT_BOOL; vtParam3.boolVal = FALSE; vtParam4.vt=VT_BOOL; vtParam4.boolVal = FALSE; vtParam5.vt=VT_BSTR; vtParam5.bstrVal = OLESTR(""); vtParam6.vt=VT_BSTR; vtParam6.bstrVal = OLESTR(""); vtParam7.vt=VT_BOOL; vtParam7.boolVal = FALSE; vtParam8.vt=VT_BSTR; vtParam8.bstrVal = OLESTR(""); vtParam9.vt=VT_BSTR; vtParam9.bstrVal = OLESTR(""); vtParam10.vt=VT_I2; vtParam10.iVal = 0; WordActDoc.AttachDispatch(WordDocuments.Open(&vtParam1,&vtParam2, &vtParam3,&vtParam4, &vtParam5,&vtParam6, &vtParam7,&vtParam8, &vtParam9,&vtParam10)); FrameInlineShapes.AttachDispatch(WordActDoc.GetInlineShapes()); InlineShapeLab.AttachDispatch(FrameInlineShapes.Item(1)); OleObj.AttachDispatch(InlineShapeLab.GetOLEFormat()); Lab.AttachDispatch(OleObj.GetObject()); Lab.SetCaption("姓名:Bottol"); Lab.DetachDispatch(); OleObj.DetachDispatch(); InlineShapeLab.DetachDispatch(); InlineShapeLab.AttachDispatch(FrameInlineShapes.Item(2)); OleObj.AttachDispatch(InlineShapeLab.GetOLEFormat()); Lab.AttachDispatch(OleObj.GetObject()); Lab.SetCaption("年龄:26"); Lab.DetachDispatch(); OleObj.DetachDispatch(); InlineShapeLab.DetachDispatch(); InlineShapeLab.AttachDispatch(FrameInlineShapes.Item(3)); OleObj.AttachDispatch(InlineShapeLab.GetOLEFormat()); Lab.AttachDispatch(OleObj.GetObject()); Lab.SetCaption("科别:手术内科"); Lab.DetachDispatch(); OleObj.DetachDispatch(); InlineShapeLab.DetachDispatch(); WordFrames.AttachDispatch(WordActDoc.GetFrames()); Frame1.AttachDispatch(WordFrames.Item(1)); Frame1.Select(); WordSelection.AttachDispatch(WordApp.GetSelection()); COleVariant vFalse((short)FALSE); COleVariant vTrue((short)TRUE); VARIANT vRange; vRange.vt=VT_DISPATCH; vRange.pdispVal=Frame1.GetRange(); FrameInlineShapes.AttachDispatch(WordSelection.GetInlineShapes()); cs+=_T("\\1.bmp"); FrameInlineShapes.AddPicture(cs.GetBuffer(cs.GetLength()),vTrue,vFalse,&vRange); FrameInlineShapes.DetachDispatch(); WordSelection.DetachDispatch(); Frame1.DetachDispatch(); Frame2.AttachDispatch(WordFrames.Item(2)); Frame2.Select(); WordSelection.AttachDispatch(WordApp.GetSelection()); vRange.pdispVal=Frame2.GetRange(); FrameInlineShapes.AttachDispatch(WordSelection.GetInlineShapes()); cs=cs.GetBufferSetLength(cs.GetLength()-3); cs+=_T("jpg"); FrameInlineShapes.AddPicture(cs.GetBuffer(cs.GetLength()),vTrue,vFalse,&vRange); FrameInlineShapes.DetachDispatch(); WordSelection.DetachDispatch(); Frame2.DetachDispatch(); WordSelection.DetachDispatch(); WordFrames.DetachDispatch(); WordDocuments.DetachDispatch(); WordActDoc.DetachDispatch(); WordApp.DetachDispatch(); VariantClear(&vtParam2); VariantClear(&vtParam3); VariantClear(&vtParam4); VariantClear(&vtParam5); VariantClear(&vtParam6); VariantClear(&vtParam7); VariantClear(&vtParam8); VariantClear(&vtParam9); VariantClear(&vtParam10); ::CoUninitialize();} 如何在一个无窗口程序中获取到系统消息? 关于SOAP TOOLKIT3 中名字空间的SOAPSDK前缀问题 求填充空间三角形的算法 高分求以下NDIS win32接口函数原型 如果在CWebBrowser2的DocumentComplete里面取得页面内容,并替换 如何用udp实现可靠传输?(我要代码) 加分贴 MFC中如何在本类调用其他类的成员变量? 有什么函数能够关掉CapsLock的指示灯? C++头文件相互引用问题 哪里有关于用VC++编网络程序的电子书? 请问如何实现模糊查询???
[email protected]
首先在ClassWizard的"Add Class..."里选"From a type library...",在Office安装目录和系统System32/System目录下选MsoWordX.olb和Fm20.dll,加入MFC封装的_Application、 Documents、Selection、_Document、Frames、Frame、InlineShapes、InlineShape、OLEFormat OleObj、ILabelControl的对象。
添加如下代码:(CMyClass是个对话框,OnButtonWord()是对话框上一个按钮的响应函数)
BOOL CMyClass::RunWordApp()
{
HKEY hKey;
if(ERROR_SUCCESS!=RegOpenKeyEx(HKEY_CLASSES_ROOT,
_T("CLSID\\{000209FF-0000-0000-C000-000000000046}"),
0,
KEY_QUERY_VALUE,
&hKey))
{
AfxMessageBox(_T("Open Word RegKey failed!"));
return FALSE;
}
char lpData[255];
WORD cbData=255;
if(ERROR_SUCCESS!=RegQueryValue(hKey, _T("LocalServer32"), lpData, (PLONG)&cbData))
{
AfxMessageBox(_T("Query Word RegKey failed!"));
::RegCloseKey(hKey);
return FALSE;
}
if(31>=WinExec(lpData,SW_SHOWNORMAL))
return FALSE;
return TRUE;
}
void CMyClass::OnButtonWord()
{
_Application WordApp;
Documents WordDocuments;
Selection WordSelection;
_Document WordActDoc;
Frames WordFrames;
Frame Frame1,Frame2;
InlineShapes FrameInlineShapes;
InlineShape InlineShapeLab;
ILabelControl Lab;
OLEFormat OleObj;
// TODO: Add your control notification handler code here
::CoInitialize(NULL); // Translate server ProgID into a CLSID. ClsidFromProgID
// gets this information from the registry.
CLSID clsid;
CLSIDFromProgID(L"Word.Application", &clsid); // Get an interface to the running instance, if any..
IUnknown *pUnk;
HRESULT hr;
hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);
if(FAILED(hr))
{
if(!RunWordApp())
{
AfxMessageBox(_T("Can't run Word Application!"));
return;
}
else
hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);
}
// Get IDispatch interface for Automation...
IDispatch *pDisp;
hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pDisp);
if(FAILED(hr))
{
AfxMessageBox("找不到这个接口!");
return;
} // Release the no-longer-needed IUnknown...
pUnk->Release(); // ----------------------------------------------------
// Add automation code here-
// ----------------------------------------------------
HWND hWnd=::FindWindow(_T("OpusApp"),NULL);
::SetForegroundWindow(hWnd);
WordApp.AttachDispatch(pDisp);
WordApp.SetVisible(TRUE);
WordDocuments.AttachDispatch(WordApp.GetDocuments());
char pPathBuffer[255];
if(0==GetCurrentDirectory(255,pPathBuffer))
{
AfxMessageBox(_T("Can't find current directory!"));
return;
}
WordApp.ChangeFileOpenDirectory(pPathBuffer);
CString cs;
cs=pPathBuffer;
strcat(pPathBuffer,_T("\\Doc7.dot"));
VARIANT vtParam2,
vtParam3,
vtParam4,
vtParam5,
vtParam6,
vtParam7,
vtParam8,
vtParam9,
vtParam10;
VariantInit(&vtParam2);
VariantInit(&vtParam3);
VariantInit(&vtParam4);
VariantInit(&vtParam5);
VariantInit(&vtParam6);
VariantInit(&vtParam7);
VariantInit(&vtParam8);
VariantInit(&vtParam9);
VariantInit(&vtParam10); COleVariant vtParam1(pPathBuffer);
vtParam2.vt=VT_BOOL; vtParam2.boolVal = FALSE;
vtParam3.vt=VT_BOOL; vtParam3.boolVal = FALSE;
vtParam4.vt=VT_BOOL; vtParam4.boolVal = FALSE;
vtParam5.vt=VT_BSTR; vtParam5.bstrVal = OLESTR("");
vtParam6.vt=VT_BSTR; vtParam6.bstrVal = OLESTR("");
vtParam7.vt=VT_BOOL; vtParam7.boolVal = FALSE;
vtParam8.vt=VT_BSTR; vtParam8.bstrVal = OLESTR("");
vtParam9.vt=VT_BSTR; vtParam9.bstrVal = OLESTR("");
vtParam10.vt=VT_I2; vtParam10.iVal = 0; WordActDoc.AttachDispatch(WordDocuments.Open(&vtParam1,&vtParam2,
&vtParam3,&vtParam4,
&vtParam5,&vtParam6,
&vtParam7,&vtParam8,
&vtParam9,&vtParam10)); FrameInlineShapes.AttachDispatch(WordActDoc.GetInlineShapes()); InlineShapeLab.AttachDispatch(FrameInlineShapes.Item(1));
OleObj.AttachDispatch(InlineShapeLab.GetOLEFormat());
Lab.AttachDispatch(OleObj.GetObject());
Lab.SetCaption("姓名:Bottol");
Lab.DetachDispatch();
OleObj.DetachDispatch();
InlineShapeLab.DetachDispatch(); InlineShapeLab.AttachDispatch(FrameInlineShapes.Item(2));
OleObj.AttachDispatch(InlineShapeLab.GetOLEFormat());
Lab.AttachDispatch(OleObj.GetObject());
Lab.SetCaption("年龄:26");
Lab.DetachDispatch();
OleObj.DetachDispatch();
InlineShapeLab.DetachDispatch(); InlineShapeLab.AttachDispatch(FrameInlineShapes.Item(3));
OleObj.AttachDispatch(InlineShapeLab.GetOLEFormat());
Lab.AttachDispatch(OleObj.GetObject());
Lab.SetCaption("科别:手术内科");
Lab.DetachDispatch();
OleObj.DetachDispatch();
InlineShapeLab.DetachDispatch(); WordFrames.AttachDispatch(WordActDoc.GetFrames());
Frame1.AttachDispatch(WordFrames.Item(1));
Frame1.Select();
WordSelection.AttachDispatch(WordApp.GetSelection());
COleVariant vFalse((short)FALSE);
COleVariant vTrue((short)TRUE);
VARIANT vRange;
vRange.vt=VT_DISPATCH;
vRange.pdispVal=Frame1.GetRange();
FrameInlineShapes.AttachDispatch(WordSelection.GetInlineShapes());
cs+=_T("\\1.bmp");
FrameInlineShapes.AddPicture(cs.GetBuffer(cs.GetLength()),vTrue,vFalse,&vRange);
FrameInlineShapes.DetachDispatch();
WordSelection.DetachDispatch();
Frame1.DetachDispatch(); Frame2.AttachDispatch(WordFrames.Item(2));
Frame2.Select();
WordSelection.AttachDispatch(WordApp.GetSelection());
vRange.pdispVal=Frame2.GetRange();
FrameInlineShapes.AttachDispatch(WordSelection.GetInlineShapes());
cs=cs.GetBufferSetLength(cs.GetLength()-3);
cs+=_T("jpg");
FrameInlineShapes.AddPicture(cs.GetBuffer(cs.GetLength()),vTrue,vFalse,&vRange);
FrameInlineShapes.DetachDispatch();
WordSelection.DetachDispatch();
Frame2.DetachDispatch(); WordSelection.DetachDispatch();
WordFrames.DetachDispatch();
WordDocuments.DetachDispatch();
WordActDoc.DetachDispatch();
WordApp.DetachDispatch(); VariantClear(&vtParam2);
VariantClear(&vtParam3);
VariantClear(&vtParam4);
VariantClear(&vtParam5);
VariantClear(&vtParam6);
VariantClear(&vtParam7);
VariantClear(&vtParam8);
VariantClear(&vtParam9);
VariantClear(&vtParam10);
::CoUninitialize();
}