テンプレート チャートを含むスプレッドシートがあります。以前はコピー/貼り付け機能を使用していましたが、コードと同時に何かをクリップボードにコピーするとエラーが発生することがあり、それを避けたいと思います。そこで、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;
}
最善の方法ではないかもしれませんが、うまくいきます。