Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用C在Excel中复制图表_C#_Excel - Fatal编程技术网

C# 使用C在Excel中复制图表

C# 使用C在Excel中复制图表,c#,excel,C#,Excel,我有一个包含模板图表的电子表格。在过去,我使用了复制/粘贴功能,但有时我会遇到一个错误,即我在复制代码的同时将某些内容复制到剪贴板上,我希望避免这种情况。所以我研究了复制方法。下面的代码应该工作吗?这张图表复制得很好 我遇到的问题是,我不确定复制后如何获取图表对象。在这一行: ChartObject chart = (ChartObject)o; 我收到以下错误:无法将“System.\u ComObject”类型的COM对象强制转换为“Microsoft.Office.Interop.Exc

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

我遇到的问题是,我不确定复制后如何获取图表对象。在这一行:

ChartObject chart = (ChartObject)o;
我收到以下错误:无法将“System.\u 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)
有什么建议吗?我真诚地感谢任何帮助

谢谢, 尼克

如果有人对我最后是怎么做的感兴趣的话。假设您有一个名为template的工作表,并且在该工作表上还有一个名为template的图表

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

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

复制chartobject时,返回类型似乎是Shape:如果无法将其强制转换为chartobject,则可以尝试类似chartobject chart=ChartObjectoSheet.ChartObjectso.Name;谢谢你的帮助。我现在正在作弊,并在每个形状上添加了一个foreach循环。然后我检查它是否是图表。然后我用这个数字得到最后一个。我也会试试你的建议。再次感谢。