2011-06-08 94 views
4

我們的應用程序具有分發功能。它需要幾個Excel 2007電子表格,將它們複製到一張表中,然後通過電子郵件發送給用戶。問題是圖像和圖表不能複製。我已經嘗試了一切,我可以在這裏找到各種其他來源,但遺憾的是,似乎沒有任何工作。我們的應用程序使用VSTO編寫,我也嘗試過OpenXML,但似乎沒有任何工作。實際上,試圖在OpenXML中進行復制會嚴重破壞文件,使Excel無法讀取或恢復文件。這裏是我們使用的代碼(注意:我們有ExcelWrapper只需調用Excel應用程序中的相同功能,但隱藏了所有可選項目)。如何將Excel工作表複製到新工作簿中並帶來所有圖表,圖像等?

private void CreateWorkbook(string filePath, string batchReportsPath) 
    { 
     //place the xlsx file into a workbook. 
     //call getfilesnames 

     Excel.Workbook bookToCopy; 
     Excel.Workbook newWorkbook; 
     Excel.Worksheet tempSheet = new Excel.Worksheet(); 

     newWorkbook = ExcelWrapper.WorkbooksAdd(ExcelApp.Workbooks); 

     if (File.Exists(filePath)) 
      File.Delete(filePath); 

     ExcelWrapper.WorkbookSaveAs(newWorkbook, filePath); 

     List<string> filePaths = new List<string>(Directory.GetFiles(batchReportsPath)); 
     filePaths.ForEach(delegate(string reportPath) 
     { 
      string reportPathAndName = reportPath; 

      bookToCopy = ExcelWrapper.WorkbooksOpen(ExcelApp.Workbooks, reportPathAndName); 

      int nextSheetNumber = newWorkbook.Sheets.Count; 
      ((Excel.Worksheet)sheetToSend.Sheets[1]).Copy(Type.Missing, newWorkbook.Sheets[nextSheetNumber]); 


      ExcelWrapper.WorkbookClose(bookToCopy); 
     }); 


     newWorkbook.Save(); 
     ExcelWrapper.WorkbookClose(newWorkbook); 
     bookToCopy= null; 
     tempSheet = null; 
     newWorkbook = null; 

     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
    } 

我都想盡前途的選擇和搜索兩個VSTO和OpenXML的對象模型和我難倒。請stackoverflow社區,你是我唯一的希望。

UPDATE:答案在這裏的鄉親:

//Copy all the images, Charts, shapes 
    foreach (Excel.Shape o in copySheet.Shapes) 
    { 
     if (o.Type == Microsoft.Office.Core.MsoShapeType.msoPicture) 
      o.CopyPicture(); 
     else 
      o.Copy(); 

     newWorkbook.Save(); 
    } 

你需要做的每個副本後保存獲得粘貼來完成。感謝您的輸入。

+1

不要你的意思是「救救我,計算器社區,你是我唯一的希望」 ... DarinH 2011-06-08 20:44:22

回答

2

你需要檢查你的工作表的工作表對象希望複製,然後遍歷所有「* Objects」屬性,並且對於每個集合,編寫代碼以手動將該集合中的所有元素複製到新工作表。

例如,你有:

ChartObjects ListObjects OleObjects 形狀(這可能會與板一起被複制,我不知道)。

1

也許你可以通過複製/粘貼到達那裏?下面是一個複製單元格數據,圖表和圖像的示例:MSDN

祝你好運!

+0

我以前看過那個。我無法弄清楚他是如何選擇圖像的,但它確實給了我一個提示。謝謝你提醒我。 – Erick 2011-06-10 01:13:15

0

我沒有答案,但我可以給你一些指示。首先,這不是一個openxml問題,這是一個vsto問題。其次,圖像和圖表附加到電子表格中,它們並不滿足(細微的區別)。可能有所有圖表的屬性以及附在表格中的所有圖像之一。將其複製。

(我用的是IExtensibility接口而不是VSTO所以我知道什麼是底層的API中,而不是屬性名稱 - 對不起)

0

這是我要做的事 - 從源工作簿整個工作表移動到一個全新的工作簿:

public static void MoveWorksheet() 
{ 
public static Excel.Application oXL; 
public static Excel._Worksheet ws; 
if (File.Exists(Global.Variables.GlobalVariables.recap)) 
{ 
//workbookToOpen is location and name 
oXL.Workbooks.Open(workbookToOpen, Missing.Value, true); 
object ws = null; 
try 
{ 
    ws = wb.Sheets["Sheet 1"]; 
    if (ws != null) 
    { 
     ((Worksheet)ws).UsedRange.Interior.ColorIndex = Constants.xlNone; 
     ((Worksheet)ws).Copy(); 
     oXL.ActiveWorkbook.SaveAs("SaveAsFileName" + ".xlsx"); 
     oXL.ActiveWorkbook.Close(true); 
    } 
} 
catch {} 
} 
}