【问题标题】:VSTO PowerPoint/Excel InteractionVSTO PowerPoint/Excel 交互
【发布时间】:2009-06-09 10:50:42
【问题描述】:

我想从 PowerPoint 幻灯片中提取数据,然后将它们粘贴到 Excel 工作簿,其中 PowerPoint 中的每张幻灯片对应于 Excel 工作簿,反之亦然(从 Excel 到 PowerPoint)。

我该怎么做?我提取了数据 PowerPoint 但现在我该如何制作它 将数据发送到 Excel?我有哪些选择/可能性?

我正在使用带有 C# 的 VSTO,请告诉我 Office 2003/2007 的解决方案

【问题讨论】:

    标签: c# .net excel vsto powerpoint


    【解决方案1】:

    这个示例主要是正确的,除了清理例程是错误的......

    部分

    // Cleanup:    
    GC.Collect();    
    GC.WaitForPendingFinalizers();
    

    需要像这样移动到这个方法的末尾..

    Marshal.FinalReleaseComObject(range);    
    Marshal.FinalReleaseComObject(worksheet);    
    workbook.Close(false, Type.Missing, Type.Missing);    
    Marshal.FinalReleaseComObject(workbook);    
    excelApp.Quit();    
    Marshal.FinalReleaseComObject(excelApp);
    
    // move deterministic call to garbage collector to AFTER release
    // of all COM objects.
    GC.Collect();    
    GC.WaitForPendingFinalizers();
    
    GC.Collect();
    

    这是因为在大多数 COM 对象被推入终结队列之前,尝试终结 COM 对象队列是没有意义的。同样,抢先调用 GC.Collect 只会导致额外遍历内存中的对象,这将对性能产生负面影响,并且不能保证对象被清除。

    此示例还有另一个问题,您为什么使用 Set_Value 和 get_Range 方法?这似乎没有必要。

    就问题而言,我认为您将需要添加一些 foreach 语句来遍历演示对象中的幻灯片,一旦您从每个幻灯片中收集了所需的数据,请在当前幻灯片迭代。

    foreach slide in Presentation.Slides()  
    { 
      string data = getData(slide);
      Excel.WorkSheet worksheet =  workbook.Sheets.Add(Type.Missing);
      worksheet.Range("A1").Value = data;
    }
    // you will need to write the getData method yourself...
    

    VB.NET 附带问题... 对于询问上述 VB.Net 示例的人...

    1. 删除分号。

    2. 将任何 Type.Missing 实例替换为 BLANK(即“无空格”)

    3. get_range()替换为.Range()

    4. set_value() 替换为.Value()

    5. 在班级顶部添加 Imports Excel = Microsoft.Office.Interop.Excel 语句。

    【讨论】:

    • 没问题,如果对你有帮助或者你认为它实际上是正确的,下次给个赞。
    【解决方案2】:

    他是曼祖尔,

    您的问题有点开放式,我不确定您尝试将哪种 PowerPoint 值放入 Excel,但您当然可以使用 Excel 自动化来实现您的目标。例如,像这样:

    void AutomateExcelExample()
    {
        Excel.Application excelApp = new Excel.Application();
        excelApp.Visible = true;
    
        Excel.Workbook workbook = excelApp.Workbooks.Add(Type.Missing);
        Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets[1];
        Excel.Range range = worksheet.get_Range("A1", Type.Missing);
    
        range.set_Value(Type.Missing, "Hello World");
    
        MessageBox.Show("Intentional pause so you can see the result.");
    
        // Cleanup:
        GC.Collect();
        GC.WaitForPendingFinalizers();
    
        Marshal.FinalReleaseComObject(range);
        Marshal.FinalReleaseComObject(worksheet);
    
        workbook.Close(false, Type.Missing, Type.Missing);
        Marshal.FinalReleaseComObject(workbook);
    
        excelApp.Quit();
        Marshal.FinalReleaseComObject(excelApp);
    }
    

    在上面的示例中,代码打开了一个新的 Excel 应用程序实例,使应用程序可见(您可能不想这样做,但在测试时很有用),打开一个新工作簿,然后分配字符串值将“Hello World”添加到工作簿中第一个工作表的单元格 A1。

    我不知道您检索的是哪种类型的 PowerPoint 数据,但 Excel 单元格可以处理大多数标准值类型,例如字符串、双精度、布尔值、日期时间等。

    此解决方案在有或没有 VSTO 的情况下都适用,并且适用于 Excel 2007 及更高版本以及 Excel 2003 及更低版本。

    这有助于您入门吗?

    迈克

    【讨论】:

      猜你喜欢
      • 2011-03-17
      • 2015-06-30
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      • 2016-05-10
      • 2015-03-30
      • 1970-01-01
      • 2017-11-26
      相关资源
      最近更新 更多