【发布时间】:2015-11-18 14:27:53
【问题描述】:
我正在使用 C# Excel 互操作,我想从一个工作表创建一个图表的副本,但我希望这个副本在另一张工作表上。我尝试了以下方法:
Excel.ChartObject chartTemplate = (Excel.ChartObject)sheetSource.ChartObjects("chart 1");
object o = chartTemplate.Duplicate();
Excel.ChartObject chart = (Excel.ChartObject)sheetSource.ChartObjects("chart 2");
chart.Name = "Skew" + expiry.ToString("MMMyy");
range = sheetDestination.Range["T" + chartRowCoutner.ToString()];
chart.Chart.Location(Excel.XlChartLocation.xlLocationAsObject, range);
但是当我尝试这个时,最后一行会抛出一个错误:
在 projectname.exe 中发生了“System.Exception”类型的未处理异常
附加信息:读取 Excel 文件 C:\ 时出错...文件路径...\template.xlsx:值不在 预期范围。
我也尝试过传入工作表而不是范围:
chart.Chart.Location(Excel.XlChartLocation.xlLocationAsObject, sheetDestination);
但这给出了同样的错误。我无法理解错误的原因或如何修复/绕过它。
我试图避免将剪贴板带入其中,但即使我尝试复制和粘贴,我仍然只能将其粘贴为图像,这确实不理想:
Excel.ChartArea chartArea = chart.ChartArea;
chartArea.Copy();
range = sheetDestination.Range["T" + chartRowCoutner.ToString()]; // Note that chart is not on the sheet sheetDestination
range.PasteSpecial(Excel.XlPasteType.xlPasteAll);
我现在能想到的唯一其他解决方案是在 VBA 中执行此操作,然后通过互操作执行宏。但可以肯定的是,只需使用不带剪贴板的互操作,它就可以以一种干净的方式完成。
【问题讨论】:
-
你能给那个范围对象写一些随机值吗?
-
@MatthewD 是的。我刚刚测试了用
range.Value = "TESTING";替换错误行,它工作正常。 -
嘿,好像有一个 chart.copy 方法。 msdn.microsoft.com/en-us/library/…
-
这是图表区域的另一个选项。 stackoverflow.com/questions/25120862/…
-
@MatthewD 作为最后的手段,我会尝试这样做,但如果我可以将剪贴板排除在外,我更愿意这样做。在我看来,
.Location()method 是为跨工作表移动图表而设计的,但我找不到任何示例。
标签: c# excel charts excel-interop