COMException C # Microsoft.Office.Interop.Excel

Я пытаюсь решить возникшую проблему с помощью COMException. Это мой код:

Ошибка возникает в Workbook Original = new Workbook (результат [0]);

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using MahApps.Metro.Controls;
using MahApps.Metro;
using Microsoft.Win32;
using System.Windows.Forms;

using System.Data;
using Microsoft.Office.Interop.Excel;




namespace KPI_Generator_v3
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : MetroWindow
{

    string [] result;
    Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();


    public MainWindow()
    {
        InitializeComponent();
    }

    private void exit_Click(object sender, RoutedEventArgs e)
    {
        this.Close();

    }

    private void browse_Click(object sender, RoutedEventArgs e)
    {

        // Create OpenFileDialog 
        instructionslbl.Visibility = Visibility.Hidden;
        dlg.Multiselect = true;
        dlg.ShowDialog();
        result = dlg.FileNames;
        dlg.DefaultExt = ".xls";
        dlg.Filter = "XLS Files (*.xls)|*.xls";

        foreach (string fileName in result)
        {
            displayFilesBox.Text += fileName + System.Environment.NewLine;

        }

        SelectedFileslbl.Visibility = Visibility.Visible;
        displayFilesBox.Visibility = Visibility.Visible;
        generateBtn.Visibility = Visibility.Visible;

    }

    private void generate_Click(object sender, RoutedEventArgs e)
    {
        Workbook Original = new Workbook(result[0]);
        for (int i = 1; i <= result.Length; i++)
        {

            Workbook next = new Workbook(result[i]);
            Worksheet newOGsheet = Original.Worksheets.Add();
            Worksheet nextSheet = next.Worksheets[0];
            nextSheet.Copy(newOGsheet);
        }



    }


    }
 }

Теперь ... Хотя приведенный выше код, вероятно, не будет работать, я получаю сообщение об ошибке

Ошибка System.Runtime.InteropServices.COMException в mscorlib.dll

с дополнительной информацией говоря

HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))

После того, как я погуглил довольно долгое время, я скачал dependency walker и получил следующий результат:

введите описание изображения здесь

Я понятия не имею, что делаю, и я был бы очень признателен за некоторую помощь! Спасибо

EDIT: REGEDIT изображение HKEY CLASSES_ROOT (при необходимости)

введите описание изображения здесь

EDIT2: изображение ошибки

введите описание изображения здесь


person Paul L    schedule 22.09.2014    source источник
comment
На какой строке вы видите ошибку? Из кода я вижу здесь одну ошибку for (int i = 1; i <= result.Length; i++). Я думаю, что необходимо for (int i = 1; i < result.Length; i++) уведомление <= изменить на <. Вы превышаете массив результатов на 1.   -  person Michael Petch    schedule 23.09.2014
comment
Ошибка находится в строке 74 @ Workbook Original = new Workbook (результат [0]); Я считаю, что в моей системе что-то не зарегистрировано должным образом. Когда я пытаюсь regsvr32 Microsoft.Office.Interop.Excel.dll, я получаю сообщение об ошибке. Кроме того, я публикую изображение regedit в значении HKEY CLASSES_ROOT   -  person Paul L    schedule 23.09.2014
comment
Между прочим, эти типы исключений обычно возникают при использовании Office Interop. Возможно, вы захотите переключиться на что-нибудь Open Office XML SDK или EPPlus, поскольку они полностью находятся в платформе .NET и не полагаются на на COM для связи с внешними библиотеками.   -  person mason    schedule 23.09.2014
comment
Вы не можете создавать объекты WorkBook самостоятельно, вы должны использовать фабричную функцию. Вместо этого используйте Application.WorkBooks.Add (). Кстати, очень часто встречается в объектной модели Office. Существует множество примеров кода, которые помогут избежать подобных простых ошибок.   -  person Hans Passant    schedule 23.09.2014


Ответы (1)


К сожалению, эта ошибка является недостатком COM-взаимодействия. В противном случае вы получите ошибку компиляции, поскольку Workbook является интерфейсом и не имеет конструктора. Этот интерфейс не предназначен для создания экземпляров, поэтому вы получаете это исключение. (Не уверен, почему вы также передаете здесь имя файла ...)

Чтобы исправить это, используйте Microsoft.Office.Interop.Excel.Application:

using Microsoft.Office.Interop.Excel;

Application excelApp = new Application();
excelApp.Workbooks.Open(result[0]);

Прочие примечания:

  • Вы должны вызвать dlg.ShowDialog() последним - тогда ваши фильтры вступят в силу.
  • Для вашего фильтра я предлагаю добавить параметр для файлов .xlsx, чтобы поддерживать более новые файлы Excel.
  • Добавьте result.Length > 0 перед его использованием, чтобы убедиться, что пользователь действительно что-то открыл.
  • Измените условие цикла for на i < result.Length; в противном случае вы получите IndexOutOfRangeException

Кроме того, просто для того, чтобы добавить больше информации: вы можете спросить: «Но подожди, Райрих, Application - это тоже интерфейс! Почему я могу создать экземпляр его, но не Workbook ??»

Я тоже задавался вопросом. По-видимому, это работает, потому что он украшен CoClassAttribute (и некоторыми другими атрибутами). Для получения более подробной информации об этом см. это сообщение о переполнении стека.

person ryrich    schedule 23.09.2014
comment
@MichaelPetch, хорошо, я добавлю это. - person ryrich; 23.09.2014
comment
Выглядит неплохо. Мы вдвоем осветили все это в вашем ответе. Я удалил свой (хотя за него были положительные голоса). Мы можем сосредоточиться на вашем ответе. - person Michael Petch; 23.09.2014