2009-06-09 88 views
1

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

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

我使用VSTO用C#,请告诉我的解决方案为Office 2003/2007

回答

3

他曼苏尔,

你的问题是有点开放式的,我真的不知道什么样的您尝试将其放入Excel中的PowerPoint值,但您肯定可以使用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和更低版本。

这有助于您开始吗?

迈克

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的任何实例(即 “没有空间”)

  3. 更换get_range().Range()

  4. 更换set_value().Value()

  5. 添加Imports Excel = Microsoft.Office.Interop.Excel声明顶端你的班级。
+0

嘿谢谢!欣赏它! – Justin 2009-07-29 19:26:30