none
MFC操作EXCEL的时候,调试的过程中,可以看到生成了chart,但是运行完后,这个chart就消失了,没有保存下来。 RRS feed

  • 问题

  • 使用MFC 操作excel的时候,

    我是使用 Visual C++的类向导机制,从Office类型库生成包装类

    操作excel的步骤如下:
    1:打开对应的excel,并取出需要的数据,取出一个数据,写一个数据,下一个数据写在上一个数据的下一列
    2:新建chart,把刚才写的一列数据作为数据源,
    3:该数据源在chart中生成折现表

    在单步调试模式下,可以看到折现表是生成了的,但是在关闭相关workbook和sheet后,该图表消失了(代码中出现在 第四步:数据分析完成,释放相关资源 这里开始)。

    有问题的代码如下:
     //新建一个嵌入式图表
     lpDisp = sheet.ChartObjects(covOptional);
     ASSERT(lpDisp);
     chartobjects.AttachDispatch(lpDisp); // Attach the lpDisp pointer
     ChartObject chartobject = chartobjects.Add(chart_left, chart_top, chart_width, chart_height);
     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); // Attach the lpDisp pointer
       
     lpDisp=chartobject.GetChart();
     chart.AttachDispatch(lpDisp); // GetChart() returns

     lpDisp =sheet.GetRange(COleVariant("L1"), COleVariant("L6"));// 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.

     CString name=itemToBeAnalysed;
     //定义新建图表的属性
     chart.ChartWizard(var,      // Source.默认数据的话,会选择当前激活的源数据,即sheet.GetRange中选中的数据
      COleVariant((short)4),  // Gallery: 4折线.
      covOptional,            // Format, use default.
      COleVariant((short)2),  // PlotBy: xlColumns.
      COleVariant((short)0),  // CategoryLabels.
      COleVariant((short)1),   // SeriesLabels.
      COleVariant((short)TRUE),  // HasLegend.
      COleVariant(name),  // Title.                      
      COleVariant("test count"),    // CategoryTitle.
      COleVariant("test data"),  // ValueTitles.
      covOptional              // ExtraTitle.
      );

     Sleep(10000);
     /************************************************************
     第四步:数据分析完成,释放相关资源
     **************************************************************/ 
     //release related resource
     book.SetSaved(TRUE);
     //book.Close(COleVariant((short)TRUE),covOptional,covOptional);
     books.Close();
      app.Quit();
     book.ReleaseDispatch();
     books.ReleaseDispatch(); 
     sheet.ReleaseDispatch(); 
     sheets.ReleaseDispatch();   
     app.ReleaseDispatch();


    • 已编辑 zifeiyuuuu 2011年6月14日 10:07 表述有误
    2011年6月14日 9:34

答案

  • 用SaveAs可以指定保存的格式

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2011年6月14日 16:27
    版主

全部回复

  •  book.SetSaved(TRUE);
     //book.Close(COleVariant((short)TRUE),covOptional,covOptional);
     books.Close();

    注销这段代码的时候,还可以看到excel提示是否保存,

    保存为 microsoft office excel 工作簿就可以看到chart

    保存为 文本文件(制表符分隔),就看不到chart

    但是打开这2个保存的文件都可以看到是excel模式的。

    不知道是不是因为 装了 excel2007的关系?

    2011年6月14日 10:25
  • 不知道如何操作 才能默认保存为 microsoft office excel 工作簿 这种格式,

    2011年6月14日 10:34
  • 使用MFC 操作excel的时候,

    我是使用 Visual C++的类向导机制,从Office类型库生成包装类

    操作excel的步骤如下:
    1:打开对应的excel,并取出需要的数据,取出一个数据,写一个数据,下一个数据写在上一个数据的下一列
    2:新建chart,把刚才写的一列数据作为数据源,
    3:该数据源在chart中生成折现表

    在单步调试模式下,可以看到折现表是生成了的,但是在关闭相关workbook和sheet后,该图表消失了(代码中出现在 第四步:数据分析完成,释放相关资源 这里开始)。

     /************************************************************
     第四步:数据分析完成,释放相关资源
     **************************************************************/ 
     //release related resource
     book.SetSaved(TRUE);
     //book.Close(COleVariant((short)TRUE),covOptional,covOptional);
     books.Close();
      app.Quit();
     book.ReleaseDispatch();
     books.ReleaseDispatch(); 
     sheet.ReleaseDispatch(); 
     sheets.ReleaseDispatch();   
     app.ReleaseDispatch();

    初步怀疑处理后的excel默认保存为 文本文件(制表符分隔),就没有chart了,因为我如果让excel提示我保存的话,直接保存为microsoft excel工作簿就可以看到chart了

    2011年6月14日 10:42
  • Save没被调用?

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2011年6月14日 14:20
    版主
  • 用SaveAs可以指定保存的格式

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2011年6月14日 16:27
    版主