VSTO PowerPoint / Excel交互
我想从PowerPoint幻灯片中提取数据,然后将其粘贴到Excel工作簿中,其中PowerPoint中的每个幻灯片对应于Excel工作簿中的工作表,反之亦然(从Excel到PowerPoint)。
我该怎么做呢? 我提取了数据PowerPoint,但现在如何使它发送到Excel的数据? 我有什么select/可能性?
我在C#中使用VSTO,请告诉我Office 2003/2007的解决scheme
他Manzoor,
你的问题是一个开放的结局,我不确定你试图把什么样的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应用程序实例,使应用程序可见(您可能不希望这样做,但在testing时可能会有用),打开一个新工作簿,然后将string值“Hello World “放入工作簿中第一个工作表的单元格A1中。
我不知道您正在检索什么样的PowerPoint数据,但Excel单元格可以处理大多数标准值types,如string,double,bool,DateTime等。
这个解决scheme可以在有或没有VSTO的情况下工作,并且可以用于Excel版本2007及更高版本,以及Excel版本2003和更低版本。
这有助于你开始吗?
麦克风
这个例子主要是正确的,除了清理程序是错误的…
那个部分
// 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上面的问题的人问…
-
删除分号。
-
用BLANKreplaceType.Missing的任何实例(即“无空格”)
-
用
get_range()
replace.Range()
-
用
.Value()
replaceset_value()
.Value()
- 将一个
Imports Excel = Microsoft.Office.Interop.Excel
语句添加到您的类的顶部。