您的位置:首页 > 其它

MFC VC 操作Excel,word的OLE对象

2015-01-23 17:40 483 查看
声明:上次写这篇文章的时候用的是截图,导致看不见东西,不是故意的。

本文的内容有两部分:

第一部分是手动打开一个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.
b613
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息