VSTO PowerPoint / Excel交互

时间:2009-06-09 10:50:43

标签: c# .net excel vsto powerpoint

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

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

我在V#中使用VSTO,请告诉我Office 2003/2007的解决方案

2 个答案:

答案 0 :(得分:4)

这个样本主要是正确的,除了清理程序错误...

部分

// 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对象的队列是没有意义的。同样先发制人地调用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语句。

答案 1 :(得分:3)

Him Manzoor,

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

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单元格可以处理大多数标准值类型,如string,double,bool,DateTime等。

此解决方案既可以使用VSTO,也可以不使用VSTO,适用于Excel 2007及以上版本以及Excel 2003及以下版本。

这有助于您入门吗?

麦克