Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Este artigo descreve como incorporar o Microsoft Excel folha de cálculo para um objecto de vista numa aplicação MFC SDI.
Este artigo inclui instruções passo a passo para incorporar a folha de cálculo e adicionar texto a célula A1, bem como comentários explicando cada passo.
Apesar do código de exemplo deste artigo pode ser retirado e colocar na sua aplicação, a vantagem real provêm de ler e compreender o exemplo código .
A Microsoft fornece exemplos de programação apenas, para fins sem garantia expressa ou implícita. Isto inclui, mas não está limitado a, as garantias implícitas de comercialização ou adequação a um fim específico. Este artigo pressupõe que está familiarizado com a linguagem de programação apresentada e as ferramentas que são utilizadas para criar e depurar procedimentos. Os técnicos de suporte da Microsoft podem ajudar a explicar a funcionalidade de um determinado procedimento. No entanto, não modificarão estes exemplos para proporcionarem funcionalidades adicionais nem criarão procedimentos adaptados às necessidades específicas do utilizador.
Para criar a aplicação MFC, siga estes passos:
Utilizar o AppWizard para criar um novo MFC AppWizard (EXE) projecto com o nome "Embed_Excel."
Seleccione um documento como o tipo de aplicação para criar e, seleccione o contentor como o tipo de suporte de documento composto para incluir. Aceite todas as outras predefinições.
As seguintes classes geradas:
aplicação : CEmbed_ExcelApp Embed_Excel.h e Embed_Excel.cpp
moldura : CMainFrame MainFrm.h e MainFrm.cpp
documento : CEmbed_ExcelDoc Embed_ExcelDoc.h e Embed_ExcelDoc.cpp
vista : CEmbed_ExcelView Embed_ExcelView.h e Embed_ExcelView.cpp
item de contentor : CEmbed_ExcelCntrItem CntrItem.h e CntrItem.cpp
No menu Ver , clique em ClassWizard . Clique no separador automatização , clique em Adicionar classe e seleccionar a partir de uma biblioteca de tipos . Localize a biblioteca de tipos Microsoft Excel e adicionar todas as classes na biblioteca de tipos ao projecto. Para o Excel 97, a biblioteca de tipos está localizada na Excel8.olb. Para o Excel 2000 a biblioteca de tipos está localizada na Excel9.olb, e para o Excel 2002 e posterior, a biblioteca de tipos localizado no ficheiro Excel.exe.
Adicione a seguinte linha para CntrItem.h:
LPDISPATCH GetIDispatch();
Em seguida, adicione o método GetIDispatch para CntrItem.cpp:
Sample Code
-----------
/*******************************************************************
* This method returns the IDispatch* for the application linked to
* this container.
********************************************************************/
LPDISPATCH CEmbed_ExcelCntrItem::GetIDispatch()
{
//The this and m_lpObject pointers must be valid for this function
//to work correctly. The m_lpObject is the IUnknown pointer to
// this object.
ASSERT_VALID(this);
ASSERT(m_lpObject != NULL);
LPUNKNOWN lpUnk = m_lpObject;
//The embedded application must be running in order for the rest
//of the function to work.
Run();
//QI for the IOleLink interface of m_lpObject.
LPOLELINK lpOleLink = NULL;
if (m_lpObject->QueryInterface(IID_IOleLink,
(LPVOID FAR*)&lpOleLink) == NOERROR)
{
ASSERT(lpOleLink != NULL);
lpUnk = NULL;
//Retrieve the IUnknown interface to the linked application.
if (lpOleLink->GetBoundSource(&lpUnk) != NOERROR)
{
TRACE0("Warning: Link is not connected!\n");
lpOleLink->Release();
return NULL;
}
ASSERT(lpUnk != NULL);
}
//QI for the IDispatch interface of the linked application.
LPDISPATCH lpDispatch = NULL;
if (lpUnk->QueryInterface(IID_IDispatch, (LPVOID FAR*)&lpDispatch)
!=NOERROR)
{
TRACE0("Warning: does not support IDispatch!\n");
return NULL;
}
//After assuring ourselves it is valid, return the IDispatch
//interface to the caller.
ASSERT(lpDispatch != NULL);
return lpDispatch;
}
Adicione a seguinte linha para Embed_ExcelView.h:
void EmbedAutomateExcel();
Em seguida, adicione o método EmbedAutomateExcel para Embed_ExcelView.cpp:
Sample Code
-----------
/********************************************************************
* This method encapsulates the process of embedding an Excel
* Worksheet in a View object and automating that worksheet to add
* some text to cell A1.
********************************************************************/
void CEmbed_ExcelView::EmbedAutomateExcel()
{
//Change the cursor so the user knows something exciting is going
//on.
BeginWaitCursor();
CEmbed_ExcelCntrItem* pItem = NULL;
TRY
{
//Get the document associated with this view, and be sure it's
//valid.
CEmbed_ExcelDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//Create a new item associated with this document, and be sure
//it's valid.
pItem = new CEmbed_ExcelCntrItem(pDoc);
ASSERT_VALID(pItem);
// Get Class ID for Excel sheet.
// This is used in creation.
CLSID clsid;
if(FAILED(::CLSIDFromProgID(L"Excel.sheet",&clsid)))
//Any exception will do. We just need to break out of the
//TRY statement.
AfxThrowMemoryException();
// Create the Excel embedded item.
if(!pItem->CreateNewItem(clsid))
//Any exception will do. We just need to break out of the
//TRY statement.
AfxThrowMemoryException();
//Make sure the new CContainerItem is valid.
ASSERT_VALID(pItem);
// Launch the server to edit the item.
pItem->DoVerb(OLEIVERB_SHOW, this);
// As an arbitrary user interface design, this sets the
// selection to the last item inserted.
m_pSelection = pItem; // set selection to last inserted item
pDoc->UpdateAllViews(NULL);
//Query for the dispatch pointer for the embedded object. In
//this case, this is the Excel worksheet.
LPDISPATCH lpDisp;
lpDisp = pItem->GetIDispatch();
//Add text in cell A1 of the embedded Excel sheet
_Workbook wb;
Worksheets wsSet;
_Worksheet ws;
Range range;
_Application app;
//set _Workbook wb to use lpDisp, the IDispatch* of the
//actual workbook.
wb.AttachDispatch(lpDisp);
//Then get the worksheet's application.
app = wb.GetApplication();
//Then get the first worksheet in the workbook
wsSet = wb.GetWorksheets();
ws = wsSet.GetItem(COleVariant((short)1));
//From there, get a Range object corresponding to cell A1.
range = ws.GetRange(COleVariant("A1"), COleVariant("A1"));
//Fill A1 with the string "Hello, World!"
range.SetValue(COleVariant("Hello, World!"));
//NOTE: If you are automating Excel 2002, the Range.SetValue method has an
//additional optional parameter specifying the data type. Because the
//parameter is optional, existing code will still work correctly, but new
//code should use the new convention. The call for Excel2002 should look
//like the following:
//range.SetValue( C<?xm-insertion_mark_start author="v-thomr" time="20070326T121607-0600"?>O<?xm-insertion_mark_end?><?xm-deletion_mark author="v-thomr" time="20070326T121606-0600" data="o"?>leVariant( (long)DISP_E_PARAMNOTFOUND, VT_ERROR ),
// COleVariant("Hello, World!"));
}
//Here, we need to do clean up if something went wrong.
CATCH(CException, e)
{
if (pItem != NULL)
{
ASSERT_VALID(pItem);
pItem->Delete();
}
AfxMessageBox(IDP_FAILED_TO_CREATE);
}
END_CATCH
//Set the cursor back to normal so the user knows exciting stuff
//is no longer happening.
EndWaitCursor();
}
Adicione a seguinte linha para Embed_ExcelView.h:
#include "excel8.h"
N ote se estiver a automatizar o Excel 2000, o ficheiro de cabeçalho é "excel9.h." Se estiver a automatizar o Excel 2002 ou uma versão posterior do Excel, o ficheiro de cabeçalho é "excel.h."
Observe o método OnInsertObject() da classe ver. É interessante note que este método e o método que acabou de escrever, são notavelmente semelhantes. Na realidade, o código que escreveu é apenas um especial caso de OnInsertObject(), que permite ao utilizador seleccionar de uma lista de OLE disponível objectos para inserir a aplicação. Porque apenas pretendemos automatizar a folha de cálculo do Excel, é substituir este comportamento. Para a aplicação, remova todo o código do interior de InsertObject() e substitua-através de uma chamada para EmbedAutomateExcel().
Compilar e executar a aplicação.
No menu Editar , clique em Inserir novo objecto .
Resultados: Folha de cálculo Microsoft Excel está incorporada para a vista. Além disso, a célula A1 é povoada com "Hello, World!" através de automatização.
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 184663
(http://support.microsoft.com/kb/184663/en-us/
)
Quanto esforço foi necessário para seguir os procedimentos deste artigo?
Muito baixo
Baixo
Moderado
Alto
Muito alto
O que podemos fazer para melhor estas informações?
Para proteger a sua privacidade, não inclua as informações de contacto nos comentários.
Obrigado! Os seus comentários serão utilizados para nos ajudar a melhorar o conteúdo do suporte. Para obter mais opções de assistência, visite a Home Page da Ajuda e Suporte.