Cara untuk menanamkan dan mengotomatisasi lembar kerja Excel dengan menggunakan MFC dan Visual C++ 2005 atau Visual C++.NET

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 311546 - Melihat produk di mana artikel ini berlaku.
Untuk versi Microsoft Visual C++ 6.0 ini Pasal, lihat 184663.
Catatan Microsoft Visual c ++ 2005, Microsoft Visual C++.NET 2003, dan Microsoft Visual C++.NET 2002 mendukung kedua kode dikelola model yang disediakan oleh Microsoft.NET Framework dan tidak dikelola asli Microsoft Windows kode model. Informasi di dalam artikel ini hanya berlaku untuk tidak dikelola Visual C++ kode.
Perbesar semua | Perkecil semua

Pada Halaman ini

RINGKASAN

Artikel ini selangkah demi selangkah menjelaskan bagaimana meng-embed Excel lembar kerja dalam Lihat objek dalam dokumen satu antarmuka (SDI) Microsoft Foundation Kelas (MFC) aplikasi dengan menggunakan Visual C++ 2005 atau Visual C++.NET.

Membuat aplikasi MFC yang komprehensif lembar kerja Excel

Langkah-langkah berikut menggambarkan bagaimana menggabungkan lembar kerja dan mengotomatisasi lembar kerja untuk menambahkan data ke sel.
  1. Mulai Microsoft Visual Studio.NET. Pada Berkas menu, klik Baru, lalu klik Project. Di bawah Jenis proyek Klik Visual C++ proyek, lalu klik Aplikasi MFC di bawah Pola acu. Nama proyek Embed_Excel.

    Catatan Dalam Visual C++ 2005, klik Visual C++ Melainkan Visual C++ proyek.
  2. Ketika Wisaya aplikasi MFC muncul, ikuti langkah-langkah:
    1. Klik Tipe aplikasi kemudian pilih Dokumen tunggal.
    2. Klik Senyawa dokumen dukungan kemudian pilih Wadah.
    3. Klik Menyelesaikan untuk menerima semua pengaturan default.
  3. Menambahkan antarmuka dari perpustakaan objek Excel. Untuk melakukan hal ini, Ikuti langkah berikut:
    1. Pada Project menu, klik Menambahkan kelas.
    2. Pilih MFC kelas dari TypeLib dari daftar template dan klik Terbuka. Menambahkan kelas dari TypeLib Wisaya muncul.

      Catatan Dalam Visual C++ 2005, klik Tambahkan Melainkan Terbuka.
    3. Dalam daftar jenis tersedia perpustakaan, mencari Microsoft Excel Versi Perpustakaan objek. Untuk Excel 2000, versi adalah 9.0, Excel 2002 Versi 10.0, dan untuk Microsoft Office Excel 2003, versi 11,0.
    4. Tambahkan antarmuka berikut:
      • _Application
      • _Workbook
      • _Worksheet
      • Kisaran
      • Buku kerja
      • Lembar Kerja
    5. Klik Menyelesaikan.
  4. Tambahkan baris berikut ke Cntritem.h sebagai anggota publik fungsi CEmbed_ExcelCntrItem kelas:
    LPDISPATCH GetIDispatch();
  5. Tambahkan GetIDispatch metode untuk Cntritem.cpp, sebagai berikut:
    /*******************************************************************
    *   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 you verify that it is valid, return the IDispatch
    	//interface to the caller.
    	ASSERT(lpDispatch != NULL);
    	return lpDispatch;
    }
    					
    Catatan Dalam Visual C++ 2005, Anda harus menambahkan common language runtime dukungan kompiler pilihan)/CLR:oldSyntax) untuk berhasil mengkompilasi kode sampel sebelumnya. Untuk menambahkan runtime bahasa umum dukungan opsi kompiler, ikuti langkah berikut:
    1. Klik Project, lalu klikProjectName Properti.

      Catatan ProjectName adalah sebuah tempat untuk nama proyek.
    2. Memperluas Konfigurasi properti, lalu klikGeneral.
    3. Dalam pane kanan, klik untuk memilih Common Language Runtime Support, sintaks tua (/ clr:oldSyntax) dalamCommon Language Runtime dukungan Seting Proyek.
    4. KlikMenerapkan, lalu klik Oke.
    Untuk informasi lebih lanjut tentang common language runtime mendukung opsi kompiler, kunjungi Web site Microsoft Developer Network (MSDN) berikut:
    http://msdn2.Microsoft.com/en-us/library/k8d11d4s.aspx
    Langkah-langkah berikut berlaku untuk seluruh artikel.
  6. Tambahkan baris berikut ke Embed_excelview.h sebagai publik metode CEmbed_ExcelView kelas:
    void EmbedAutomateExcel();
    					
  7. Tambahkan baris berikut ke Embed_excelview.cpp:
    #include "CApplication.h"
    #include "CWorkbook.h"
    #include "CWorksheet.h"
    #include "CRange.h"
    #include "CWorksheets.h"
    #include "CWorkbooks.h"
    
    /********************************************************************
    *   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 that the user knows that something exciting is going
    	//on.
    	BeginWaitCursor();
    
    	CEmbed_ExcelCntrItem* pItem = NULL;
    	TRY
    	{
    		//Get the document associated with this view, and be sure that it is
    		//valid.
    		CEmbed_ExcelDoc* pDoc = GetDocument();
    		ASSERT_VALID(pDoc);
    
    		//Create a new item associated with this document, and be sure that 
    		//it is valid.
    		pItem = new CEmbed_ExcelCntrItem(pDoc);
    		ASSERT_VALID(pItem);
    
    		// Get a Class ID for the Excel sheet.
    		// This is used in creation.
    		CLSID clsid;
    		if(FAILED(::CLSIDFromProgID(L"Excel.sheet",&clsid)))
    			//Any exception will do. You just need to break out of the
    			//TRY statement.
    			AfxThrowMemoryException();
    
    		// Create the Excel embedded item.
    		if(!pItem->CreateNewItem(clsid))
    			//Any exception will do. You just need to break out of the
    			//TRY statement.
    			AfxThrowMemoryException();
    
    		//Make sure the new CContainerItem is valid.
    		ASSERT_VALID(pItem);
    
    		// Start 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.
    		CWorkbook wb;
    		CWorksheets wsSet;
    		CWorksheet ws;
    		CRange CRange;
    		CApplication app;
    
    		//Set CWorkbook wb to use lpDisp, the IDispatch* of the
    		//actual workbook.
    		wb.AttachDispatch(lpDisp);
    
    		//Get the application for the worksheet.
    		app = wb.get_Application();
    
    		//Get the first worksheet in the workbook.
    		wsSet = wb.get_Worksheets();
    		ws = wsSet.get_Item(COleVariant((short)1));
    
    		//Get a CRange object that corresponds to cell A1.
    		CRange = ws.get_Range(COleVariant("A1"), COleVariant("A1"));
    
    		//Fill A1 with the string "Hello, World!"
    		CRange.put_Value2(COleVariant("Hello, World!"));
    
    		//NOTE: If you are automating Excel 2002, the CRange.SetValue method has an 
    		//additional optional parameter that specifies 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  
    		//resemble the following:
    
    		//CRange.SetValue( ColeVariant( (long)DISP_E_PARAMNOTFOUND, VT_ERROR ), 
    		//                COleVariant("Hello, World!"));
    	}
    
    	//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 that the user knows that exciting stuff
    		//is no longer happening.
    		EndWaitCursor();
    }
    					
  8. Mengganti kode untuk CEmbed_ExcelView::OnInsertObject dalam Embed_excelview.cpp dengan berikut:
    void CEmbed_ExcelView::OnInsertObject()
    {
    	EmbedAutomateExcel();
    }
    						
    CATATAN: EmbedAutomateExcel hanya kasus khusus dari OnInsertObject, yang memungkinkan pengguna untuk memilih dari daftar tersedia OLE objek untuk memasukkan ke dalam aplikasi. Anda akan menggantikan perilaku ini karena itu tidak diperlukan untuk demonstrasi ini.

Menguji aplikasi

  1. Tekan F5 untuk membangun dan menjalankan aplikasi.
  2. Pada Mengedit Klik menu aplikasi, Menyisipkan objek baru.
  3. Memeriksa hasil. Lembar kerja Excel baru dimasukkan ke dalam The Lihat objek, dengan teks "Hello, World!" di sel A1.

Pemecahan Masalah

  • Jika Anda menambahkan kelas pembungkus untuk Excel perpustakaan objek oleh menggunakan Berkas pilihan dalam kelas dari TypeLib Wisaya Penambahan, Anda akan menerima pesan galat ketika Anda browsing ke perpustakaan objek. Untuk menghindari masalah ini, Ketik penuh lintasan dan nama berkas untuk perpustakaan objek bukannya browsing ke berkas.Untuk informasi tambahan, klik nomor artikel di bawah ini untuk melihat artikel di dalam Basis Pengetahuan Microsoft:
    311408 BUG: 'Read-Only' peringatan ketika menambahkan MFC kelas dari perpustakaan
  • Jika Anda menerima pesan galat berikut ketika Anda membangun Anda sampel aplikasi, mengubah "Varian DialogBox" dalam CRange.h "varian _DialogBox":
    peringatan C4003: parameter sebenarnya tidak cukup untuk makro 'DialogBoxA'
    Untuk informasi lebih lanjut tentang penyebab ini kesalahan, lihat artikel Basis Pengetahuan berikut:
    311407 BUG: MFC Wizard tidak menyelesaikan penamaan konflik dengan API makro

REFERENSI

Untuk selengkapnya, lihat Microsoft berikut pengembang Situs Web Network (MSDN):
Microsoft Office Development with Visual Studio
.aspx http://msdn2.Microsoft.com/en-us/library/aa188489 (office.10)
Untuk informasi tambahan tentang Excel otomatisasi, lihat artikel Basis Pengetahuan berikut:
308407 Cara mengotomatisasi Excel dari C++.NET dan MFC untuk mengisi atau memperoleh Data dalam berbagai menggunakan array
308292 Cara mengotomatisasi Excel untuk membuat dan Format buku kerja baru menggunakan C++.NET dan MFC

Properti

ID Artikel: 311546 - Kajian Terakhir: 24 September 2011 - Revisi: 1.0
Berlaku bagi:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
Kata kunci: 
kbcontainer kbhowtomaster kbmt KB311546 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:311546

Berikan Masukan

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com