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