如何将Excel工作表复制到新的工作簿中,并将所有图表,图像等?

我们的应用程序有分配function 它需要几个Excel 2007电子表格,将它们复制到一张表中,然后通过电子邮件发送给用户。 问题是图像和图表不能复制。 我尝试了一切,我可以find在这里和其他各种来源,但遗憾的是似乎没有任何工作。 我们的应用程序是使用VSTO编写的,我也尝试过OpenXML,但似乎没有任何工作。 事实上,在OpenXML中进行复制会导致文件严重损坏,导致Excel无法读取或恢复文件。 这里是我们使用的代码(注意:我们有ExcelWrapper只是调用Excel应用程序的相同function,但隐藏所有可选项目)。

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(); } 

我已经尝试了每个有希望的选项,并searchVSTO和OpenXML对象模型,我很难过。 请stackoverflow社区,你是我唯一的希望。

更新:这是答案人:

  //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(); } 

您需要在每个副本完成后进行保存以获取粘贴以最终确定。 感谢您的input。

您需要检查要复制的工作表的WORKSHEET对象,然后遍历所有“* Objects”属性,并为每个集合编写代码以手动将该集合中的所有元素复制到新的表格。

例如,你有:

ChartObjects ListObjects OleObjects形状(可能会与表单一起复制,我不确定)。

也许你可以通过复制/粘贴到达那里? 以下是一个复制单元格数据,图表和图像的示例: MSDN

祝你好运!

我没有答案,但我可以给你一些指示。 首先,这不是一个openxml问题,这是一个问题。 其次,图像和图表被附加到电子表格中,它们不在其中(细微的区别)。 有可能是所有图表的属性和附加到表单的所有图像之一。 复制那个。

(我使用IExtensibility接口而不是VSTO,所以我知道底层的API是什么,但不是属性名称 – 对不起。)

这就是我的做法 – 将整个工作表从源工作簿移动到一个全新的工作簿:

 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 {} } }