2009-06-09 102 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