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

时间:2011-06-08 17:58:40

标签: c# excel vsto openxml

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

 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社区,你是我唯一的希望。

更新:以下是答案人:

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

您需要在每次复制后执行保存以获取最终确定的粘贴。感谢您的投入。

4 个答案:

答案 0 :(得分:2)

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

例如,你有:

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

答案 1 :(得分:1)

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

祝你好运!

答案 2 :(得分:0)

我没有答案,但我可以给你一些指示。首先,这不是一个openxml问题,这是一个vsto问题。其次,图像和图表附在电子表格中,它们并不满足于它(一种微妙的区别)。可能存在所有图表的属性以及附在表格上的所有图像之一。复制它。

(我使用IExtensibility接口而不是VSTO,所以我知道底层API中有什么,但不知道属性名称 - 抱歉。)

答案 3 :(得分: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 {}
}
}