Τρόπος ενσωμάτωσης και αυτοματοποίηση ενός φύλλου εργασίας του Microsoft Excel με MFC

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 184663 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Περίληψη

Αυτό το άρθρο περιγράφει πώς μπορείτε να ενσωματώσετε ένα Microsoft Excel φύλλων σε ένα αντικείμενο View της εφαρμογής SDI MFC.

Αυτό το άρθρο περιέχει οδηγίες βήμα προς βήμα για την ενσωμάτωση στο φύλλο εργασίας και να προσθέσετε κάποιο κείμενο στο κελί A1, καθώς και τα σχόλια εξηγώντας κάθε βήμα.

Παρόλο που μπορεί να ληφθεί και να τεθεί σε εφαρμογή σας του δείγματος κώδικα σε αυτό το άρθρο, το πραγματικό όφελος προέρχεται από την ανάγνωση και την κατανόηση του δείγματοςΚωδικός.

Περισσότερες πληροφορίες

Η Microsoft παρέχει παραδείγματα προγραμματισμού μόνο για λόγους επεξήγησης, χωρίς να παρέχει καμία εγγύηση, σιωπηρή ή ρητή. Σε αυτά περιλαμβάνονται, ενδεικτικά, οι σιωπηρές εγγυήσεις εμπορευσιμότητας ή/και καταλληλότητας για συγκεκριμένο σκοπό. Αυτό το άρθρο προϋποθέτει ότι είστε εξοικειωμένοι με τη γλώσσα προγραμματισμού που παρουσιάζεται, καθώς και με τα εργαλεία που χρησιμοποιούνται για τη δημιουργία και τον εντοπισμό σφαλμάτων κώδικα διαδικασιών. Οι μηχανικοί υποστήριξης της Microsoft μπορούν να σας εξηγήσουν τη λειτουργικότητα μιας συγκεκριμένης διαδικασίας. Ωστόσο, δεν θα τροποποιήσουν αυτά τα παραδείγματα για να παράσχουν πρόσθετες λειτουργίες, ούτε θα δημιουργήσουν διαδικασίες, για να καλύψουν τις συγκεκριμένες απαιτήσεις σας.

Για τη δημιουργία της εφαρμογής MFC, ακολουθήστε τα εξής βήματα:
  1. Χρησιμοποιήστε το AppWizard για να δημιουργήσετε ένα νέο AppWizard MFC (EXE) έργου με το όνομα "Embed_Excel".
  2. Επιλογή ενός εγγράφου με τον τύπο της εφαρμογής για τη δημιουργία και επιλέξτε το κοντέινερ ως υποστήριξη σύνθετων εγγράφων ώστε να περιλαμβάνει τον τύπο. Αποδοχή όλων των άλλων προεπιλεγμένων ρυθμίσεων.

    Δημιουργούνται οι ακόλουθες κλάσεις:

    Εφαρμογή: CEmbed_ExcelApp Embed_Excel.h και Embed_Excel.cpp

    Καρέ: CMainFrame MainFrm.h και MainFrm.cpp

    Έγγραφο: CEmbed_ExcelDoc Embed_ExcelDoc.h και Embed_ExcelDoc.cpp

    View: CEmbed_ExcelView Embed_ExcelView.h και Embed_ExcelView.cpp

    Στοιχείο κοντέινερ: CEmbed_ExcelCntrItem CntrItem.h και CntrItem.cpp
  3. Στο διακομιστήViewμενού, κάντε κλικ στο κουμπίClassWizard. Κάντε κλικ στην καρτέλαΑυτοματισμούκαρτέλα, κάντε κλικ στο κουμπίΠροσθήκη κατηγορίας, και επιλέξτε την εντολήΑπό μια βιβλιοθήκη τύπων. Εντοπίστε το φάκελοΒιβλιοθήκη τύπων του Microsoft Excel, και να προσθέσετε όλες τις κλάσεις στη βιβλιοθήκη τύπων για το έργο σας. Για το Excel 97, η βιβλιοθήκη τύπων βρίσκεται στο Excel8.olb. Για το Excel 2000 τη βιβλιοθήκη τύπων βρίσκεται στο Excel9.olb και για το Excel 2002και νεότερες εκδόσεις, η βιβλιοθήκη τύπων αυτό βρίσκεται σε Excel.exe.
  4. Προσθέστε την ακόλουθη γραμμή CntrItem.h:
    LPDISPATCH GetIDispatch();
    					
  5. Στη συνέχεια, προσθέστε τη μέθοδο GetIDispatch 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;
          }
    					
  6. Προσθέστε την ακόλουθη γραμμή Embed_ExcelView.h:
          void EmbedAutomateExcel();
    					
  7. Στη συνέχεια, προσθέστε τη μέθοδο EmbedAutomateExcel 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();
            }
    
    					
  8. Προσθέστε την ακόλουθη γραμμή Embed_ExcelView.h:
          #include "excel8.h"
    						
    NoteΕάν αυτοματοποιείτε το Excel 2000, το αρχείο κεφαλίδας είναι "excel9.h". Εάν αυτοματοποιείτε το Excel 2002 ή νεότερη έκδοση του Excel, το αρχείο κεφαλίδας είναι "excel.h".
  9. Δείτε τη μέθοδο OnInsertObject() της κλάσης προβολής. Είναι ενδιαφέρον να σημειωθεί ότι αυτή η μέθοδος και η μέθοδος μας μόλις έχετε εγγραφεί, μοιάζουν strikingly. Στην πραγματικότητα, ο κώδικας που μας έχετε εγγραφεί είναι απλώς μια ειδική περίπτωση του OnInsertObject(), το οποίο επιτρέπει στο χρήστη να επιλέξει από μια λίστα διαθέσιμων OLE αντικείμενα για να εισαγάγετε στην εφαρμογή. Επειδή θέλουμε να αυτοματοποιήσετε το φύλλο εργασίας του Excel, εμείς να παρακάμψετε αυτήν τη συμπεριφορά. Για την εφαρμογή, καταργήστε τον κωδικό από το εσωτερικό του InsertObject() και αντικαταστήστε τη με μια κλήση στο EmbedAutomateExcel().
  10. Μεταγλώττιση και εκτέλεση της εφαρμογής.
  11. Στο διακομιστήΕπεξεργαστείτε τη διαδρομήμενού, κάντε κλικ στο κουμπίΕισαγωγή νέου αντικειμένου.
Αποτελέσματα: Ένα φύλλο εργασίας του Microsoft Excel είναι ενσωματωμένη στην προβολή. Επιπλέον, το κελί A1 συμπληρώνεται με "Hello, World!" μέσω της αυτοματοποίησης.

Ιδιότητες

Αναγν. άρθρου: 184663 - Τελευταία αναθεώρηση: Παρασκευή, 24 Σεπτεμβρίου 2010 - Αναθεώρηση: 3.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft Office Excel 2007
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Foundation Class Library 4.2
  • Microsoft Office XP Developer Edition
  • Microsoft Office 2000 Developer Edition
Λέξεις-κλειδιά: 
kbprogramming kbautomation kbhowto kbinterop kbmt KB184663 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:184663

Αποστολή σχολίων

 

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