1

我有一个包含模板图表的电子表格。过去我使用过复制/粘贴功能,但有时我会遇到一个错误,我将某些内容复制到剪贴板上,同时我的代码是,我想避免这种情况。所以我研究了 Duplicate 方法。下面的代码应该工作吗?该图表确实可以很好地复制。

我遇到的问题是我不确定如何在复制图表对象后获取它。在这条线上:

ChartObject chart = (ChartObject)o;

我收到此错误:无法将类型为“System.__ComObject”的 COM 对象转换为接口类型“Microsoft.Office.Interop.Excel.ChartObject”。这是我的代码:

string file = @"D:\test.xlsx";

Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
app.Visible = true;
ApplicationClass temp = new ApplicationClass();

Microsoft.Office.Interop.Excel.Workbook oBook;
Microsoft.Office.Interop.Excel.Worksheet oSheet;

oBook = app.Workbooks.Open(file, 0, false, 1, "", "", true, XlPlatform.xlWindows, "\t", false, false, 0, true, true, XlCorruptLoad.xlNormalLoad);
oSheet = oBook.Worksheets["template"] as Worksheet;

object o = ((ChartObject)oSheet.ChartObjects("template")).Duplicate();
ChartObject chart = (ChartObject)o;
chart.Name = "TEST";

我可以得到 ChartObjects 的数量吗?如果我在宏中执行此操作,我可以使用这条线来获取最后一张图表

oSheet.ChartObjects(oSheet.ChartObjects.Count)

有什么建议么?我真诚地感谢任何帮助。

谢谢,尼克

如果有人对我最终如何做到这一点感兴趣。假设您有一个名为“模板”的工作表,并且在该工作表上您还有一个名为“模板”的图表。

Microsoft.Office.Interop.Excel.Worksheet oTemplate = oBook.Worksheets["template"] as Worksheet;
Microsoft.Office.Interop.Excel.Worksheet oOutput = oBook.Worksheets["output"] as Worksheet;

// duplicate template chart
ChartObject chartTemplate = (ChartObject)oTemplate.ChartObjects("template");
object o = chartTemplate.Duplicate();
ChartObject chart = (ChartObject)oTemplate.ChartObjects(GetChartCount(oTemplate));

public static int GetChartCount(Microsoft.Office.Interop.Excel.Worksheet oSheet)
{
    int x = 0;
    foreach (Microsoft.Office.Interop.Excel.Shape s in oSheet.Shapes)
    {
        if (s.HasChart == MsoTriState.msoTrue)
            x++;
    }
    return x;
}

也许不是最好的方法,但它确实有效。

4

0 回答 0