MFC VC 操作Excel,word的OLE对象

声明:上次写这篇文章的时候用的是截图,导致看不见东西,不是故意的。

本文的内容有两部分:

第一部分是手动打开一个excel表格以后,Ctrl+C复制表格中的内容,点击程序中的一个按钮,跳到OnTreePop_CopyForExcelOle()函数中。走的是

ExcelCopyObject()接口。该函数是把刚才复制的excel表格以Microsoft Excel 工作表 对象插入到一个临时建立的word文件中,在该函数中,需要把对象粘贴到richEdit控件中,但是直接粘贴只能显示一部分。只有在word中把对象转换成嵌入型以后才能全部粘贴到richEdit控件中。所以进行了环绕方式的转换。

第二部分是手动打开一个word文件,里面有组织结构图等不能直接复制到richEdit控件中的图形。为了把这些图形复制到richEdit控件中,需要先把其转换成OLE对象。同样复制以后,点击按钮跳到OnTreePop_CopyForWordOle()函数中。走WordCopyObject()和PasteOleToWord(flag)接口。第一个接口是把图片复制到word临时文件中。第二个接口是把临时文件以OLE对象插入到另一个临时word文件。最后把这个OLE对象粘贴到richEdit控件中



//word  1
void CMainFrame::OnTreePop_CopyForWordOle()
{
TreePop_CopyForOle( 1 );
}


//excel  0
void CMainFrame::OnTreePop_CopyForExcelOle()
{
TreePop_CopyForOle( 0 );
}


//visio  2
void CMainFrame::OnTreePop_CopyForVisioOle()
{
TreePop_CopyForOle( 2 );
}


void CMainFrame::TreePop_CopyForOle( int flag )
{
int res;
if (flag == 0)
res = ExcelCopyObject();
else if (flag == 1)
{
res = WordCopyObject();
if (res != -1)
PasteOleToWord(flag);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//


//  从word文件中按下Ctrl + C后,复制到a.docx中,并且保存。每次复制时,a.docx都会清空,保证a.docx中保存的是最新复制的内容
//
//  2015年1月6日10:43:05   hjz








int CMainFrame::ExcelCopyObject()
{
char pFileName[MAX_PATH]; 
int nPos = GetCurrentDirectory( MAX_PATH, pFileName); 
CString csFullPath(pFileName);  
CString csFullPathA = csFullPath + "\\System\\Module\\CopyForWord.docx";
//查找是否有CopyForWord.docx,如果有删除它
HANDLE h;
LPWIN32_FIND_DATA pFD=new WIN32_FIND_DATA;
BOOL bFound = FALSE;
if(pFD)
{
h=FindFirstFile(csFullPathA, pFD);
bFound=(h!=INVALID_HANDLE_VALUE);
if(bFound)
{
FindClose(h);
DeleteFile(csFullPathA);
}
delete pFD;
}


CWordApplication wordapp;
CWordDocuments docs;
CWordDocument doc;
if (!wordapp.CreateDispatch(_T("Word.application")))
{
AfxMessageBox(_T("Word初始化时出错!"));
return -1;
}


wordapp.SetVisible(FALSE);
docs = wordapp.GetDocuments();


CComVariant Template(_T(""));
CComVariant NewTemplate(false),DocumentType(0),Visible;
doc = docs.Add(&Template, &NewTemplate);
if(!doc.m_lpDispatch)
{
AfxMessageBox(_T("创建新文档失败!"));
return -1;
}




//设置粘贴图片/插入为:嵌入型
CWordOptions options = wordapp.GetOptions();
options.SetPictureWrapType((long)0);


COleVariant vTrue((short)TRUE), vFalse(short(FALSE)), vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
CWordSelection sel = wordapp.GetSelection();
try
{
sel.WholeStory();
sel.TypeBackspace();
sel.TypeParagraph();


COleVariant vOptUint((long)7), vOptCount((long)1), vOptExtend((long)0);
sel.MoveUp(vOptUint, vOptCount, vOptExtend);


COleVariant vOptPlecement(long(0)),  IconFileName(_T("")), IconLabel(_T("") );


COleVariant vOptIconIndex = vtFalse, vOptLink = vtFalse, vOptPlacement((short)1), vOptDisplayAsIcon = vtFalse, vOptDataType((short)0), vOptIconFileName = vtNull, vOptIconLabel = vtNull;
CWordRange wordRange = sel.GetRange();
sel.PasteSpecial(&vOptIconIndex, &vOptLink, &vOptPlacement, &vOptDisplayAsIcon, &vOptDataType, vOptIconFileName, vOptIconLabel );


CWordShapeRange shapeRange = sel.GetShapeRange();
COleVariant vOptReplace = vtTrue;
shapeRange.Select(&vOptReplace);
shapeRange.ConvertToInlineShape();
sel.WholeStory();
sel.Copy();


CWnd* pWnd = m_wndSplitter.GetPane(0, 1);
CResZtbInfoView* pZtbView = DYNAMIC_DOWNCAST(CResZtbInfoView, pWnd);
CRes_Dialog* pEditInfo = (CRes_Dialog*)pZtbView->GetCurViewDlg();
CRichEditControl50W& editInfoCtrl = ((CD_EditInfo*)pEditInfo)->m_EditInfoCtrl;
//粘贴OLE对象
editInfoCtrl.Paste();
editInfoCtrl.PasteSpecial(CF_TEXT);
doc.SaveAs(COleVariant(csFullPathA), vtMiss, vtMiss, vtMiss, vtMiss, vtMiss, vtMiss, vtMiss, vtMiss, vtMiss, vtMiss);


wordapp.Quit(vFalse, vTrue, vFalse);
options.DetachDispatch();
doc.DetachDispatch();
docs.DetachDispatch();
wordapp.DetachDispatch();


options.ReleaseDispatch();
sel.ReleaseDispatch();
doc.ReleaseDispatch();
docs.ReleaseDispatch();
wordapp.ReleaseDispatch();




}
catch (CException* e)
{
e->ReportError();
wordapp.Quit(vFalse, vTrue, vFalse);
doc.DetachDispatch();
docs.DetachDispatch();
wordapp.DetachDispatch();
sel.ReleaseDispatch();
doc.ReleaseDispatch();
docs.ReleaseDispatch();
wordapp.ReleaseDispatch();
return -1;
}
return 0;  //excel返回0
}




int CMainFrame::WordCopyObject()






{
char pFileName[MAX_PATH]; 
int nPos = GetCurrentDirectory( MAX_PATH, pFileName); 
CString csFullPath(pFileName);  
CString csFullPathA = csFullPath + "\\System\\Module\\CopyForWord.docx";


//查找是否有CopyForWord.docx,如果有删除它
HANDLE h;
LPWIN32_FIND_DATA pFD=new WIN32_FIND_DATA;
BOOL bFound = FALSE;
if(pFD)
{
h=FindFirstFile(csFullPathA, pFD);
bFound=(h!=INVALID_HANDLE_VALUE);
if(bFound)
{
FindClose(h);
DeleteFile(csFullPathA);
}
delete pFD;
}


CWordApplication wordapp;
CWordDocuments docs;
CWordDocument doc;


if (!wordapp.CreateDispatch(_T("Word.application")))
{
AfxMessageBox(_T("Word初始化时出错!"));
return -1;
}
wordapp.SetVisible(FALSE);
docs = wordapp.GetDocuments();


CComVariant Template(_T(""));
CComVariant NewTemplate(false),DocumentType(0),Visible;
doc = docs.Add(&Template, &NewTemplate);
if(!doc.m_lpDispatch)
{
AfxMessageBox(_T("创建新文档失败!"));
return -1;
}


COleVariant vTrue((short)TRUE), vFalse((short)FALSE), vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
CWordSelection sel = wordapp.GetSelection();
try
{
sel.WholeStory();
sel.TypeBackspace();
sel.TypeParagraph();
COleVariant vOptUint((long)7), vOptCount((long)1), vOptExtend((long)0);
sel.MoveUp(vOptUint, vOptCount, vOptExtend);


sel.Paste();
doc.SaveAs(COleVariant(csFullPathA), vtMiss, vtMiss, vtMiss, vtMiss, vtMiss, vtMiss, vtMiss, vtMiss, vtMiss, vtMiss);
wordapp.Quit(vFalse, vTrue, vFalse);
doc.DetachDispatch();
docs.DetachDispatch();
wordapp.DetachDispatch();


sel.ReleaseDispatch();
doc.ReleaseDispatch();
docs.ReleaseDispatch();
wordapp.ReleaseDispatch();


}
catch (CException* e)
{
e->ReportError();
wordapp.Quit(vFalse, vTrue, vFalse);
doc.DetachDispatch();
docs.DetachDispatch();
wordapp.DetachDispatch();


sel.ReleaseDispatch();
doc.ReleaseDispatch();
docs.ReleaseDispatch();
wordapp.ReleaseDispatch();
return -1;
}


return 1;  //word 返回1
}




bool CMainFrame::PasteOleToWord( int flag )








{
////创建b.docx用于把a.docx以OLE对象插入, 能够复制
char pFileName[MAX_PATH]; 
int nPos = GetCurrentDirectory( MAX_PATH, pFileName); 
CString csFullPath(pFileName);  
CString csFullPathA;
CWordApplication wordapp1;
CWordDocuments docs1;
CWordDocument doc1;
CWordInlineShapes inlineShapes;
CWordInlineShape inlineSpape;
COleVariant vTrue((short)TRUE), vFalse((short)FALSE), vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR), vZ((short)0), vOptFormat((long)0);
if (!wordapp1.CreateDispatch(_T("Word.application")))
{
AfxMessageBox(_T("Word初始化时出错!"));
return FALSE;
}
wordapp1.SetVisible(FALSE);
docs1 = wordapp1.GetDocuments();


CComVariant Template(_T(""));
CComVariant NewTemplate(false),DocumentType(0),Visible;
doc1 = docs1.Add(&Template,&NewTemplate); 




if (!doc1.m_lpDispatch) 
{
AfxMessageBox(_T("Document获取失败!"));
return FALSE;
}


////把文件a.docx当做ole对象插入到b.docx
//docs1.Open(COleVariant(csFullPathB), vFalse, vFalse, vFalse, vOpt, vOpt, vOpt, vOpt, vOpt, vOptFormat);
////docs1.Open(COleVariant(csFullPathB), vFalse, vFalse, vFalse, vOpt, vOpt, vOpt, vOpt, vOpt, vOptFormat, vOpt, vOpt, vOpt, vZ, vOpt, vOpt);
//清空word内容
CWordSelection sel1 = wordapp1.GetSelection();
sel1.WholeStory();
sel1.TypeBackspace();
sel1.TypeParagraph();
COleVariant vOptUint((long)7), vOptCount((long)1), vOptExtend((long)0);
sel1.MoveUp(vOptUint, vOptCount, vOptExtend);
inlineShapes = sel1.GetInlineShapes();
CComVariant range = sel1.GetRange();


//加载OLE对象
//if ( flag == 0 )
//{
// csFullPathA = csFullPath + "\\System\\Module\\CopyForExcel.xlsx";
// CWordShapes wordShapes = doc1.GetShapes();
// wordShapes.AddOLEObject(COleVariant(_T("Excel.Application")), COleVariant( csFullPathA ), &vFalse, &vFalse, &vOpt, &vFalse, &vOpt, &vOpt, &vOpt, &vOpt, &vOpt, &range);
//}
//else if ( flag == 1 )
//{
csFullPathA = csFullPath + "\\System\\Module\\CopyForWord.docx";
inlineSpape = (CWordInlineShape)inlineShapes.AddOLEObject(COleVariant(_T("word.application")), COleVariant( csFullPathA ), &vOpt, &vFalse, &vOpt, &vOpt, &vOpt, &range);
//}
CString csFullPathB = csFullPath + "\\System\\Module\\PasteToWord.docx";








//sel1.InsertFile( csFullPathA, &range, vFalse, vFalse, vFalse);
try
{
//复制OLE对象


sel1.WholeStory();
sel1.Copy();
CWnd* pWnd = m_wndSplitter.GetPane(0, 1);
CResZtbInfoView* pZtbView = DYNAMIC_DOWNCAST(CResZtbInfoView, pWnd);
CRes_Dialog* pEditInfo = (CRes_Dialog*)pZtbView->GetCurViewDlg();
CRichEditControl50W& editInfoCtrl = ((CD_EditInfo*)pEditInfo)->m_EditInfoCtrl;
//粘贴OLE对象
editInfoCtrl.Paste();
editInfoCtrl.PasteSpecial(CF_TEXT);


doc1.SaveAs(COleVariant(csFullPathB), vtMiss, vtMiss, vtMiss, vtMiss, vtMiss, vtMiss, vtMiss, vtMiss, vtMiss, vtMiss);
doc1.Close(vOpt,vOpt,vOpt);
wordapp1.Quit(vFalse, vTrue, vFalse);
inlineSpape.DetachDispatch();
inlineShapes.DetachDispatch();
sel1.DetachDispatch();
doc1.DetachDispatch();
docs1.DetachDispatch();
wordapp1.DetachDispatch();


inlineSpape.ReleaseDispatch();
inlineShapes.ReleaseDispatch();
sel1.ReleaseDispatch();
doc1.ReleaseDispatch();
docs1.ReleaseDispatch();
wordapp1.ReleaseDispatch();
}
catch (CException* e)
{
e->ReportError();
doc1.SaveAs(COleVariant(csFullPathB), vtMiss, vtMiss, vtMiss, vtMiss, vtMiss, vtMiss, vtMiss, vtMiss, vtMiss, vtMiss);
doc1.Close(vOpt,vOpt,vOpt);
wordapp1.Quit(vFalse, vTrue, vFalse);
inlineSpape.DetachDispatch();
inlineShapes.DetachDispatch();
sel1.DetachDispatch();
doc1.DetachDispatch();
docs1.DetachDispatch();
wordapp1.DetachDispatch();


inlineSpape.ReleaseDispatch();
inlineShapes.ReleaseDispatch();
sel1.ReleaseDispatch();
doc1.ReleaseDispatch();
docs1.ReleaseDispatch();
wordapp1.ReleaseDispatch();
}


//删除临时word、excel文件
HANDLE h;
HANDLE h1;
LPWIN32_FIND_DATA pFD = new WIN32_FIND_DATA;
LPWIN32_FIND_DATA pFD1 = new WIN32_FIND_DATA;
BOOL bFound = FALSE, bFound1 = FALSE;
if(pFD)
{
h=FindFirstFile(csFullPathB, pFD);
bFound = (h!=INVALID_HANDLE_VALUE);
if(bFound)
{
FindClose(h);
DeleteFile(csFullPathB);
}
delete pFD;
}
if(pFD1)
{
h1 = FindFirstFile(csFullPathA, pFD1);
bFound1 = (h1!=INVALID_HANDLE_VALUE);
if(bFound1)
{
FindClose(h1);
DeleteFile(csFullPathA);
}
delete pFD1;
}
return TRUE;
}




你可能感兴趣的:(C++,excel,MFC,VC,编程语言,计算机,OLE对象,word,Word,Excel,Ole对象,MFC,VC,RichEdit控件)