如何到使用 MFC 来创建 MicrosoftExcel 图表

本文讨论如何使用随 Microsoft Visual C++® 版本 5.0 和 6.0 安装 Microsoft 基础类 (MFC) 库的版本 4.2 使 MicrosoftExcel, 以便将填充工作表与数据并创建图表。

更多信息

<script type="text/javascript">loadTOCNode(1, 'moreinformation');</script>
您可将代码本文中复制到消息处理函数的 MFC .cpp 文件中定义的事件。 但是, 的代码目的是为了说明使用 IDispatch 接口和成员函数 Excel 类型库中定义的过程。 主要优点来自阅读并理解代码以便您可修改示例, 或使 Microsoft Excel 97、 Excel 2000 或 Excel 2002 从头编写代码。

备注对于自动化 Microsoft Excel 2000 及更高版本:

对于 Microsoft Excel 2000 及以后更改某些方法和属性。 有关使用与 Microsoft Excel 2000 和以后类型库, 本文示例代码请参见下列文章 Microsoft 知识库文章:
224925 (http://support.microsoft.com/kb/224925/EN-US/) INFO: 用于 Office 类型库可能更改与新版本

步骤来创建项目

<script type="text/javascript">loadTOCNode(2, 'moreinformation');</script>
1.MicrosoftExcel, 中创建名为 Test.xls 新工作簿并将其保存在驱动器 C 的根目录
2.请按步骤 1 到 12 以创建示例项目使用 IDispatch 接口和成员函数 Excel 类型库中定义了以下 Microsoft 知识库文章中:
178749 (http://support.microsoft.com/kb/178749/EN-US/) 如何创建自动化项目使用 MFC 和类型库
3.在添加到 AutoProjectDlg.cpp, 顶部添加以下行:   #include "excel8.h" // excel9.h for Excel 2000, excel.h for Excel 2002
4.

以下代码添加到 CAutoProjectDlg:: OnRun () AutoProjectDLG.cpp 文件中。 

    try
      {
       _Application app;  // app is the Excel _Application object.
       _Workbook book;
       _Worksheet sheet;
       _Chart chart;

       Workbooks books;
       Worksheets sheets;
       Range range;
       ChartObjects chartobjects;
       Charts charts;
       LPDISPATCH lpDisp;

       // Common OLE variants. These are easy variants to use for
       // calling arguments.
       COleVariant
                  covTrue((short)TRUE),
                  covFalse((short)FALSE),
                  covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

       // Start Excel and get the Application object.
       if(!app.CreateDispatch("Excel.Application"))
       {
        AfxMessageBox(
             "Couldn't start Excel and get an application 0bject");
        return;
       }

       // Set visible.
       app.SetVisible(TRUE);

       // Get Workbooks collection.
       lpDisp = app.GetWorkbooks();  // Get an IDispatch pointer.
       ASSERT(lpDisp);
       books.AttachDispatch( lpDisp );  // Attach the IDispatch pointer
                                        // to the books object.
          // Open a workbook.
          lpDisp = books.Open("C://Test",
                      covOptional, covOptional, covOptional, covOptional,
                      covOptional, covOptional, covOptional, covOptional,
                      covOptional, covOptional, covOptional, covOptional,
                      covOptional, covOptional, covOptional); // Excel 2000 requires only 13 arguments
          ASSERT(lpDisp);  // It should have worked.

       // Attach to a Workbook object.
       book.AttachDispatch( lpDisp );  // Attach the IDispatch pointer
                                       // to the Workbook object.

       // Get sheets.
       lpDisp = book.GetSheets();
       ASSERT(lpDisp);
       sheets.AttachDispatch(lpDisp);

       lpDisp = sheets.GetItem( COleVariant((short)(1)) );
       ASSERT(lpDisp);

       // Attach the lpDisp pointer to a Worksheet object.
       sheet.AttachDispatch(lpDisp);

       lpDisp = sheet.GetRange(COleVariant("A1"), COleVariant("W40"));
                               // The range is from A1 to W40.
       ASSERT(lpDisp);
       range.AttachDispatch(lpDisp);  // Attach the IDispatch pointer
                                      // to the range object.
       range.Clear();  // Could be ClearContents().

       ::Sleep(500); // So you can see it happen.

       lpDisp = sheet.GetRange(COleVariant("A3"), COleVariant("A3"));
                                                 // From A3 to A3.
       ASSERT(lpDisp);
       range.AttachDispatch(lpDisp);  // Attach the IDispatch pointer
                                      // the range object.
       range.SetValue(COleVariant("March")); // Excel 97 & Excel 2000.

range.SetValue2(COleVariant("March")); // Insert March into range.


       // Following is a series of repetitive steps to populate the
       // worksheet's cells with a series of Months and values to be
       // used in the Chart object, which is yet to be constructed.

       lpDisp = sheet.GetRange(COleVariant("B3"), COleVariant("B3"));

       ASSERT(lpDisp);
       range.AttachDispatch(lpDisp);
       range.SetValue(COleVariant("12")); // 97 & 2000

range.SetValue2(COleVariant("12")); //  Value for March.


       lpDisp = sheet.GetRange(COleVariant("A4"), COleVariant("A4"));
            // Months will be in column A, values in column B.
       ASSERT(lpDisp);
       range.AttachDispatch(lpDisp);
       range.SetValue(COleVariant("April"));// Excel 97 & Excel 2000

range.SetValue2(COleVariant("April")); // Excel 2002


       lpDisp = sheet.GetRange(COleVariant("B4"), COleVariant("B4"));
       ASSERT(lpDisp);
       range.AttachDispatch(lpDisp);
       range.SetValue(COleVariant("8")); // Excel 97 & Excel 2000

range.SetValue2(COleVariant("8")); // Excel 2002

       lpDisp = sheet.GetRange(COleVariant("A5"), COleVariant("A5"));
       ASSERT(lpDisp);
       range.AttachDispatch(lpDisp);
       range.SetValue(COleVariant("May"));

range.SetValue2(COleVariant("May"));

       lpDisp = sheet.GetRange(COleVariant("B5"), COleVariant("B5"));
       ASSERT(lpDisp);
       range.AttachDispatch(lpDisp);
       range.SetValue(COleVariant("2"));

range.SetValue2(COleVariant("2"));

       lpDisp = sheet.GetRange(COleVariant("A6"), COleVariant("A6"));
       ASSERT(lpDisp);
       range.AttachDispatch(lpDisp);
       range.SetValue(COleVariant("June"));

range.SetValue2(COleVariant("June"));

       lpDisp = sheet.GetRange(COleVariant("B6"), COleVariant("B6"));
       ASSERT(lpDisp);
       range.AttachDispatch(lpDisp);
       range.SetValue(COleVariant("11"));

range.SetValue2(COleVariant("11"));

       lpDisp = sheet.GetRange(COleVariant("A7"), COleVariant("A7"));
       ASSERT(lpDisp);
       range.AttachDispatch(lpDisp);
       range.SetValue(COleVariant("July"));

range.SetValue2(COleVariant("July"));

       lpDisp = sheet.GetRange(COleVariant("B7"), COleVariant("B7"));
       ASSERT(lpDisp);
       range.AttachDispatch(lpDisp);
       range.SetValue(COleVariant("16"));

range.SetValue2(COleVariant("16"));

       // The cells are populated. To start the chart,
       // declare some long variables and site the chart.
       long left, top, width, height;
       left = 100;
       top = 10;
       width = 350;
       height = 250;

       lpDisp = sheet.ChartObjects(covOptional);

       ASSERT(lpDisp);
       chartobjects.AttachDispatch(lpDisp); // Attach the lpDisp pointer
                                  // for ChartObjects to the chartobjects
                                  // object.
       ChartObject chartobject = chartobjects.Add(left, top, width, height);
                                //defines the rectangle,
                                // adds a new chart at that rectangle and
                                // assigns its object reference to a
                                // ChartObject variable named chartobject
       chart.AttachDispatch(chartobject.GetChart()); // GetChart() returns
                                         // LPDISPATCH, and this attaches
                                         // it to your chart object.

       lpDisp = sheet.GetRange(COleVariant("A3"), COleVariant("B7"));
                         // The range containing the data to be charted.
       ASSERT(lpDisp);
       range.AttachDispatch(lpDisp);

       VARIANT var; // ChartWizard needs a Variant for the Source range.
       var.vt = VT_DISPATCH; // .vt is the usable member of the tagVARIANT
                             // Struct. Its value is a union of options.
       var.pdispVal = lpDisp; // Assign IDispatch pointer
                              // of the Source range to var.

       chart.ChartWizard(var,                    // Source.
                        COleVariant((short)11),  // Gallery: 3d Column.
                        covOptional,             // Format, use default.
                        COleVariant((short)1),   // PlotBy: xlRows.
                        COleVariant((short)0),   // CategoryLabels.
                        COleVariant((short)1),   // SeriesLabels.
                        COleVariant((short)TRUE),  // HasLegend.
                        COleVariant("Use by Month"),  // Title.
                        COleVariant("Month"),    // CategoryTitle.
                        COleVariant("Usage in Thousands"),  // ValueTitles.
                        covOptional              // ExtraTitle.
                        );
       // The return is void.
       ::Sleep(3000);
       chartobject.Delete();  // Removes the first chartobject, sets the
       // ChartObjects.Item() count to 0. The next chart will restore the
       // item count to 1.
       ::Sleep(3000);  // Set the selected range to be erased.
       range.Clear();  // Erase the usage data.

       // Beginning of chart 2.
       lpDisp = sheet.GetRange(COleVariant("B3"), COleVariant("B3"));
                                      // From B3 to B3.
       ASSERT(lpDisp);
       range.AttachDispatch(lpDisp);  // Attach the IDispatch pointer
                                      // to the range object.
       range.SetValue(COleVariant("Chocolate")); // Insert Chocolate into
                                                 // the range object.
range.SetValue2(COleVariant("Chocolate")); // Insert Chocolate

       // Following is a series of repetitive steps to populate the
       // worksheet's cells with a series of Flavors and values to be
       // used in the chart object, your second chart.

       lpDisp = sheet.GetRange(COleVariant("B4"), COleVariant("B4"));
       ASSERT(lpDisp);
       range.AttachDispatch(lpDisp);
       range.SetValue(COleVariant("12")); // Value for Chocolate.

range.SetValue2(COleVariant("12")); // Value for Chocolate.

       lpDisp = sheet.GetRange(COleVariant("C3"), COleVariant("C3"));
            // Flavors will be in row 3, values in row 4.
       ASSERT(lpDisp);
       range.AttachDispatch(lpDisp);
       range.SetValue(COleVariant("Vanilla"));

range.SetValue2(COleVariant("Vanilla"));

       lpDisp = sheet.GetRange(COleVariant("C4"), COleVariant("C4"));

       ASSERT(lpDisp);
       range.AttachDispatch(lpDisp);
       range.SetValue(COleVariant("8"));

range.SetValue2(COleVariant("8"));

       lpDisp = sheet.GetRange(COleVariant("D3"), COleVariant("D3"));
       ASSERT(lpDisp);
       range.AttachDispatch(lpDisp);
       range.SetValue(COleVariant("Orange"));

range.SetValue2(COleVariant("Orange"));

       lpDisp = sheet.GetRange(COleVariant("D4"), COleVariant("D4"));
       ASSERT(lpDisp);
       range.AttachDispatch(lpDisp);
       range.SetValue(COleVariant("6"));

range.SetValue2(COleVariant("6"));

       // The cells are populated. To start the chart,
       // define the bounds, and site the chart.

       left = 250;
       top = 40;
       width = 300;

       height = 300;

       lpDisp = sheet.ChartObjects(covOptional);

       ASSERT(lpDisp);
       chartobjects.AttachDispatch(lpDisp); // Attach the lpDisp pointer
                                   // for ChartObjects to the chartobjects
                                   // object.
       chartobjects.Add(left, top, width, height); // Adds 1 to item count.

       //**************************************
       lpDisp = chartobjects.Item( COleVariant((short)(1)) );  // It was
           // zero, but just added one at a new location,
           // with new left, top, width, and height.
       ASSERT(lpDisp);
       chartobject.AttachDispatch(lpDisp); // Use definition of new chart
                                           // site.
       chart.AttachDispatch(chartobject.GetChart());
       //**************************************

       lpDisp = sheet.GetRange(COleVariant("B3"), COleVariant("D4"));
                         // Range containing the data to be charted.
       ASSERT(lpDisp);
       range.AttachDispatch(lpDisp);

       var.pdispVal = lpDisp; // Contains IDispatch pointer
                              // to the Source range.

       chart.ChartWizard(var,                    // Source.
                        COleVariant((short)11),  // Gallery = 3D Column.
                        covOptional,             // Format, use default.
                        COleVariant((short)2),   // PlotBy xlColumns.
                        COleVariant((short)0),   // CategoryLabels.
                        COleVariant((short)1),   // SeriesLabels.
                        COleVariant((short)TRUE),  // HasLegend.
                        COleVariant("Use by Flavor"),  // Title.
                        COleVariant("Flavor"),    // CategoryTitle.
                        COleVariant("Usage in Barrells"),  // ValueTitles.
                        covOptional              // ExtraTitle.
                        );
       // The return is void.
       ::Sleep(3000);

       //Show the chart in Print Preview.
       chart.PrintOut(COleVariant((short)1),     // From (page #).
                      COleVariant((short)1),     // To (page #).
                      COleVariant((short)1),     // Copies.
                      COleVariant((short)TRUE),  // Preview.
                      covOptional,               // ActivePrinter.
                      covFalse,                  // PrintToFile.
                      covFalse                   // Collate.
                      covOptional                // PrToFileName // 2002 only
                      );

       book.SetSaved(TRUE); // Avoids the 'Save changes?' dialog box.
       app.Quit(); // Excel departs.

       // By default, the pointer references for the objects
       // range, book, chart, chartobjects, sheet, and app
       // are automatically released when they go out of scope.
       // ReleaseDispatch()s are unnecessary.

       ::Sleep(1000);
       AfxMessageBox("Just executed App.Quit()");

      }  // End of processing logic.

      catch(COleException *e)
      {
        char buf[1024];

        sprintf(buf, "COleException. SCODE: %08lx.", (long)e->m_sc);
        ::MessageBox(NULL, buf, "COleException", MB_SETFOREGROUND | MB_OK);
      }

      catch(COleDispatchException *e)
      {
       char buf[1024];
       sprintf(buf,
               "COleDispatchException. SCODE: %08lx, Description: /"%s/".",
               (long)e->m_wCode,
               (LPSTR)e->m_strDescription.GetBuffer(1024));
       ::MessageBox(NULL, buf, "COleDispatchException",
                    MB_SETFOREGROUND | MB_OK);
      }

      catch(...)
      {
       ::MessageBox(NULL, "General Exception caught.", "Catch-All",
                    MB_SETFOREGROUND | MB_OK);
      }
    

5.您可能需要修改代码 CAutoProjectDlg::OnRun() 以指示工作簿 Test.xls 的正确路径中。 工作簿引用下列行中:
      lpDisp = books.open("C://Test", . . .);
					
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值