web-dev-qa-db-ja.com

「Microsoft.Office.Interop.Excel.ApplicationClass」タイプのCOMオブジェクトを「Microsoft.Office.Interop.Excel.Application」にキャストできません

これは、1つのC#コンソールアプリケーション内からExcelからデータをキャプチャする最初の試みです。

「タイプ 'Microsoft.Office.Interop.Excel.ApplicationClass'のCOMオブジェクトを 'Microsoft.Office.Interop.Excel.Application'にキャストできません」というエラーが表示されます。

このコードは「Microsoft Excel 12.0 Object Library」を使用し、Microsoft.Office.Interop.Excelへの参照を提供しました。

それでも、私はこのエラーを克服できませんでした-それには独自の迅速な解決策があると信じています。

私はこのサイトを少し掘り下げて、このソリューションに出会いました: 相互運用型を埋め込むことはできません

しかし、私は理解できなかったため、解決策として提案されたものを実装できませんでした。

私の.Netバージョンは4.5です。

どんな助けも大歓迎です。

前もって感謝します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;

using Excel = Microsoft.Office.Interop.Excel;

namespace deneme
{
class Program
{
    static void Main(string[] args)
    {

        Excel.Application xlApp = new Excel.Application();
        xlApp.Visible = true; // <-- Excel application
        xlApp.DisplayAlerts = false;

        // Open the workbook.
        Excel.Workbook wBook = xlApp.Workbooks.Open("C:\\FNN\\XLA\\fnnComTemplate.xlsx",
            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing);

        // get the sheet
        Excel.Worksheet wSheet = wBook.Sheets[0];
        // foreach (Excel.Worksheet sheet in wBook.Sheets) { if (sheet.Name == "templateSheet") { wSheet = sheet; } }

        Excel.Range rng = wSheet.get_Range("A1");

        aux = wSheet.Range["F6"].Value;

        Console.WriteLine("interop result:" + aux);
        Console.ReadLine();

    }

}
}
19
Aykut Saribiyik

これがコード関連のエラーでない場合は、指定されたキーをレジストリから削除してください。

手順:

スタート->実行-> regedit-> HKEY_CLASSES_ROOT-> TypeLib-> {00020813-0000-0000-C000-000000000046}-> 1.8/1.7(これを削除)

解決策:この問題は、上位バージョンのOfficeから残っている無効なレジストリキーを削除することで解決できます。上記の手順に従ってください。

原因:この問題は、Microsoft OfficeのバージョンをOffice 2010からOffice 2007に、またはOffice 2013からOffice 2010または2007にダウングレードした場合に残ったレジストリキーが原因で発生します。

この解決策が役に立たない場合はお知らせください

27
Jayesh Goyani

Microsoft Office 365

私はWindows 10でMicrosoft Office 365を実行しており、記載されている解決策を試してみましたが、レジストリキーは正常に削除されませんでした。

Office 365スイートを修復しようとしてコントロールパネルに移動しました。 enter image description here

クイック修復を選択しました enter image description here

私のプログラムを再試行し、すべてが機能しました!

15
Alex

この質問(および同様の質問)への回答は、レジストリの編集と、マシン上にないOfficeのバージョンへの古い参照の削除を提案していると確信しています正しい

私は現在自分自身を蹴っているので、この答えを追加するだけです。 2時間かけてレジストリ内のキーを探し、どこにも行かなかった。サイコロの最後のスローは、単純なMicrosoft Officeの修復を試すことでしたが、突然私のエラーはなくなりました。

...私は、レジストリを手動で編集することに深く入り込む前に修復を試みる価値があるように思えます。

7
hawbsl

レジストリに1.7と1.8の両方がありました。以下を削除することで解決しました:

HKEY_CLASSES_ROOT\TypeLib\{00020813-0000-0000-C000-000000000046}\1.8
0
Janis S.

マシンがOffice 2016 64ビットに更新され、32ビットアプリケーションから呼び出されたときにCOMインターフェイスが例外をスローしていました。 Jayeshの回答にあるような古いTypeLibエントリはありませんでした。

ProcessMonitorのトレースをOffice 2016の稼働中のマシンと比較すると、行き止まりのレジストリキーのように見える

HKEY_CLASSES_ROOT\Wow6432Node\TypeLib\{00024 ..

稼働中のマシンは、存在しないレジストリキーをチェックして戻ります

名前が見つかりません

障害が発生したマシンにはレジストリキーがありましたが、その後すぐに例外がスローされました。

レジストリキーの削除、トレースの再実行、次の失敗したキーの削除を繰り返した後、COMインターフェイス機能が復元されました。

0
bds