Cara mengotomatisasi Excel untuk membuat dan Format buku kerja baru menggunakan C++.NET dan MFC

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 308292 - Melihat produk di mana artikel ini berlaku.
Untuk Microsoft Visual Basic.NET versi ini Pasal, lihat 301982.
Untuk Microsoft Visual C# .NET versi artikel ini, lihat 302084.
Perbesar semua | Perkecil semua

Pada Halaman ini

Catatan Microsoft Visual C++.NET (2002) mendukung kedua kode dikelola model yang disediakan oleh Microsoft.NET Framework dan asli tidak dikelola Microsoft Windows kode model. Informasi di dalam artikel ini hanya berlaku untuk unmanaged Visual C++ kode.

RINGKASAN

Artikel ini menunjukkan cara membuat otomatisasi klien untuk Excel dengan menggunakan Microsoft Foundation Classes (MFC) dan Visual C++ .NET.

INFORMASI LEBIH LANJUT

Otomatisasi adalah proses yang memungkinkan aplikasi yang ditulis dalam bahasa seperti MFC untuk pemrograman mengendalikan lain aplikasi. Otomatisasi untuk Excel memungkinkan Anda untuk melakukan tindakan seperti membuat buku kerja baru, menambahkan data ke buku kerja, atau membuat grafik. Dengan Excel dan aplikasi Microsoft Office, hampir semua tindakan Anda dapat melakukan secara manual melalui antarmuka pengguna dapat juga dilakukan Pemrograman dengan menggunakan otomatisasi.

Excel memperlihatkan ini program fungsi ini melalui model objek. Model objek adalah kumpulan kelas dan metode yang berfungsi sebagai rekan-rekan untuk komponen logis Excel. Sebagai contoh, ada Aplikasi objek, Buku kerja objek, dan Lembar kerja objek, masing-masing berisi fungsi potongan-potongan Excel. Mengakses object model dari MFC dan Visual C++.NET, Anda dapat membuat kelas pembungkus MFC dari perpustakaan jenis Excel.

Artikel ini menunjukkan bagaimana untuk menggunakan kelas pembungkus yang dihasilkan oleh MFC untuk membuat dan format buku kerja baru dengan menggunakan Visual C++.NET.

Membuat klien otomasi untuk Microsoft Excel

  1. Ikuti langkah-langkah dalam "Membuat otomatisasi klien" bagian dari artikel Basis Pengetahuan Microsoft berikut untuk menciptakan dasar Klien otomasi:
    307473 Cara menggunakan perpustakaan jenis untuk kantor otomatisasi dari Visual C++.NET
    Pada langkah 4 d artikel, pilih berikut antarmuka:

    • _Application
    • Buku kerja
    • _Workbook
    • Lembar Kerja
    • _Worksheet
    • Kisaran
    • Font
    • Interior
    • Perbatasan
    • Perbatasan

    Pada langkah 6 (di mana Anda menambahkan artikel # termasuk pernyataan untuk masing-masing kelas yang Anda dibuat pembungkus), diketahui bahwa file untuk Font kelas adalah CFont0.h dan file untuk Interior kelas adalah Cnterior.h.
  2. Dalam IDD_AUTOPROJECT_DIALOG kotak dialog, klik kanan Menjalankan dan pilih Tambahkan event handler. Dalam Event Handler Wizard, pilih BN_CLICKED jenis pesan dan kemudian klik Menambahkan dan mengedit. Tambahkan kode berikut dalam handler untuk mengotomatisasi Excel:
    void CAutoProjectDlg::OnBnClickedRun()
    {
       // Commonly used OLE variants.
       COleVariant
          covTrue((short)TRUE),
          covFalse((short)FALSE),
          covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    
       CApplication app;
       CWorkbooks books;
       CWorkbook book;
       CWorksheets sheets;
       CWorksheet sheet;
       CRange range;
       CFont0 font;
       CRange cols;
       CRange resizedrange;
       Cnterior interior;
       CBorders borders;
       CBorder bottomborder;
    
       // Start Excel and get an Application object.
       if(!app.CreateDispatch("Excel.Application"))
       {
          AfxMessageBox("Couldn't start Excel and get Application object.");
          return;
       }
    
       //Get a new workbook.
       books = app.get_Workbooks();
       book = books.Add (covOptional);
    
       //Get the first sheet.
       sheets =book.get_Sheets();
       sheet = sheets.get_Item(COleVariant((short)1));
    
       //Fill cells A1, B1, C1, and D1 one cell at a time with "headers".
       range = sheet.get_Range(COleVariant("A1"),COleVariant("A1"));
       range.put_Value2(COleVariant("First Name"));
       range = sheet.get_Range(COleVariant("B1"),COleVariant("B1"));
       range.put_Value2(COleVariant("Last Name"));
       range = sheet.get_Range(COleVariant("C1"),COleVariant("C1"));
       range.put_Value2(COleVariant("Full Name"));
       range = sheet.get_Range(COleVariant("D1"),COleVariant("D1"));
       range.put_Value2(COleVariant("Salary"));
    
       //Format A1:D1 as bold, vertical alignment = center.
       range = sheet.get_Range(COleVariant("A1"), COleVariant("D1"));
       font = range.get_Font();
       font.put_Bold(covTrue);
       range.put_VerticalAlignment(
          COleVariant((short)-4108));   //xlVAlignCenter = -4108
    
       //Fill A2:B6 with an array of values (First & Last Names).
       {
          COleSafeArray saRet;
          DWORD numElements[]={5,2};   //5x2 element array
          saRet.Create(VT_BSTR, 2, numElements);
    
    
          //Fill the 5x2 SafeArray with the following data:
          //   John      Smith
          //   Tom       Brown
          //   Sue       Thomas
          //   Jane      Jones
          //   Adam      Johnson
    
          FillSafeArray(L"John", 0, 0, &saRet);
          FillSafeArray(L"Smith", 0, 1, &saRet);
          FillSafeArray(L"Tom", 1, 0, &saRet);
          FillSafeArray(L"Brown", 1, 1, &saRet);
          FillSafeArray(L"Sue", 2, 0, &saRet);
          FillSafeArray(L"Thomas", 2, 1, &saRet);
    
          FillSafeArray(L"Jane", 3, 0, &saRet);
          FillSafeArray(L"Jones", 3, 1, &saRet);
          FillSafeArray(L"Adam", 4, 0, &saRet);
          FillSafeArray(L"Johnson", 4, 1, &saRet);
    
          range = sheet.get_Range(COleVariant("A2"), COleVariant("B6"));
          range.put_Value2(COleVariant(saRet));
    
          saRet.Detach();
       }
    
       //Fill C2:C6 with a relative formula (=A2 & " " & B2).
       range = sheet.get_Range(COleVariant("C2"), COleVariant("C6"));
       range.put_Formula(COleVariant("=A2 & \" \" & B2"));
    
       //Fill D2:D6 with a formula(=RAND()*100000) and apply a number
       //format.
       range = sheet.get_Range(COleVariant("D2"), COleVariant("D6"));
       range.put_Formula(COleVariant("=RAND()*100000"));
       range.put_NumberFormat(COleVariant("$0.00"));
    
       //AutoFit columns A:D.
       range = sheet.get_Range(COleVariant("A1"), COleVariant("D1"));
       cols = range.get_EntireColumn();
       cols.AutoFit();
    
       //Manipulate a variable number of columns for Quarterly Sales Data.
       {
          short NumQtrs;
          CString msg;
    
          //Determine how many quarters to display data for.
          for(NumQtrs=1;NumQtrs<=3;NumQtrs++)
          {
             msg.Format("Enter sales data for %d quarter(s)?", NumQtrs);
             if(AfxMessageBox(msg,MB_YESNO)==IDYES)
             {
                break;
             }
          }
          msg.Format("Displaying data for %d quarters.", NumQtrs);
          AfxMessageBox(msg);
    
          //Starting at E1, fill headers for the number of columns selected.
          range = sheet.get_Range(COleVariant("E1"), COleVariant("E1"));
          resizedrange = range.get_Resize(covOptional, COleVariant(NumQtrs));
          resizedrange.put_Formula(
             COleVariant("=\"Q\" & COLUMN()-4 & CHAR(10) & \"Sales\""));
          //Change the Orientation and WrapText properties for the headers.
          resizedrange.put_Orientation(COleVariant((short)38));
          resizedrange.put_WrapText(covTrue);
          //Fill the interior color of the headers.
          interior = resizedrange.get_Interior();
          interior.put_ColorIndex(COleVariant((short)36));
    
          //Fill the columns with a formula and apply a number format.
          range = sheet.get_Range(COleVariant("E2"), COleVariant("E6"));
          resizedrange = range.get_Resize(covOptional, COleVariant(NumQtrs));
          resizedrange.put_Formula(COleVariant("=RAND()*100"));
          resizedrange.put_NumberFormat(COleVariant("$0.00"));
    
          //Apply borders to the Sales data and headers.
          range = sheet.get_Range(COleVariant("E1"), COleVariant("E6"));
          resizedrange= range.get_Resize(covOptional, COleVariant(NumQtrs));
          borders = resizedrange.get_Borders();
          borders.put_Weight(COleVariant((short)2));   //xlThin = 2
    
          //Add a Totals formula for the Quarterly sales data and apply a
          //border.
          range = sheet.get_Range(COleVariant("E8"), COleVariant("E8"));
          resizedrange = range.get_Resize(covOptional, COleVariant(NumQtrs));
          resizedrange.put_Formula(COleVariant("=SUM(E2:E6)"));
          borders = resizedrange.get_Borders();
          {
             bottomborder = borders.get_Item((long)9);
             bottomborder.put_LineStyle(
                COleVariant((short)-4119));   //xlDouble = -4119
             bottomborder.put_Weight(
                COleVariant((short)4));       //xlThick = 4
          }
       }
    
       //Make the application visible and give the user control of
       //Excel.
       app.put_Visible(TRUE);
       app.put_UserControl(TRUE);
    }
    					
  3. Tambahkan kode berikut persis di atas OnBnClickedRun metode. Kode ini menyederhanakan menciptakan array yang digunakan untuk mengirim data ke Excel:
    void FillSafeArray(OLECHAR FAR* sz, int iRow, int iCol,
                       COleSafeArray* sa)
    {
    
       VARIANT v;
       long index[2];
    
       index[0] = iRow;
       index[1] = iCol;
    
       VariantInit(&v);
       v.vt = VT_BSTR;
       v.bstrVal = SysAllocString(sz);
       sa->PutElement(index, v.bstrVal);
       SysFreeString(v.bstrVal);
       VariantClear(&v);
    
    }
    					
  4. Tekan F5 untuk membangun dan menjalankan klien otomasi.
  5. Ketika kotak dialog muncul, klik Menjalankan.

    Klien otomasi mulai Excel dan menciptakan buku kerja sampel. Excel tetap berjalan bahkan ketika klien otomasi berakhir karena pengguna telah diberikan kontrol aplikasi.

Pemecahan Masalah

Jika Anda menambahkan kelas pembungkus untuk Excel perpustakaan objek dengan menggunakan The 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 galat berikut pesan Anda membangun aplikasi sampel Anda, mengubah "Varian DialogBox" di CRange.h untuk "Varian _DialogBox":
peringatan C4003: tidak cukup sebenarnya parameter untuk makro 'DialogBoxA'
Untuk informasi lebih lanjut tentang penyebab kesalahan ini, lihat artikel Basis Pengetahuan berikut:
311407 BUG: MFC Wizard tidak menyelesaikan penamaan konflik dengan API makro

REFERENSI

Untuk informasi tambahan mengenai mengotomatisasi Excel dengan menggunakan MFC dan Visual C++.NET, klik nomor artikel di bawah ini untuk melihat artikel di Basis Pengetahuan Microsoft:
308407 Cara mengotomatisasi Excel dari C++.NET dan MFC untuk mengisi atau memperoleh Data dalam berbagai menggunakan array

Properti

ID Artikel: 308292 - Kajian Terakhir: 24 September 2011 - Revisi: 2.0
Berlaku bagi:
  • 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: 
kbautomation kbhowto kbmt KB308292 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:308292

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