2014-09-22 4 views
1

Я пытаюсь решить проблему, с которой я сталкиваюсь с COMException. Это мой код:COMException C# Microsoft.Office.Interop.Excel

Ошибка возникает в Workbook Original = новая рабочая книга (результат [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))

После прибегая к помощи в течение некоторого времени я скачал dependen су ходунки и имеют следующий вывод:

enter image description here

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

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

enter image description here

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

enter image description here

+0

В какой строке вы видите ошибку? Из кода я вижу одну ошибку здесь: for (int i = 1; i <= result.Length; i ++) '. Я думаю, что это должно быть 'for (int i = 1; i

+0

Ошибка указана в строке 74 @ Workbook Original = новая рабочая книга (результат [0]); Я считаю, что в моей системе нет должным образом зарегистрированного. Когда я пытаюсь выполнить regsvr32 в Microsoft.Office.Interop.Excel.dll, я получаю сообщение об ошибке. Кроме того, я размещаю изображение regedit в значении HKEY CLASSES_ROOT – Pmike86

+0

Кстати, эти типы исключений, как правило, возникают, когда вы используете Office Interop. Возможно, вы захотите переключиться на что-то [Open Office XML SDK] (http://msdn.microsoft.com/en-us/library/office/bb448854 (v = office.15) .aspx) или [EPPlus] (http: //epplus.codeplex.com/), поскольку они полностью находятся в платформе .NET и не полагаются на COM для связи с внешними библиотеками. – mason

ответ

2

Эта ошибка является COM Interop ошибка, к сожалению. В противном случае вы получите ошибку компиляции, так как 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 перед его использованием, чтобы убедиться, что пользователь действительно что-то открыл.
  • Измените условия цикла на i < result.Length; в противном случае, вы получите IndexOutOfRangeException

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

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

+0

@MichaelPetch нормально, я добавлю, что в. – ryrich

+2

Выглядит хорошо. Между нами обоими мы рассмотрели все это в вашем ответе. Я удалил мой (хотя у него были аплодисменты). Мы можем сосредоточиться на вашем ответе. –