COMException C#Microsoft.Office.Interop.Excel

时间:2014-09-22 23:46:49

标签: c# excel comexception

我正在尝试用COMException来解决我遇到的问题。这是我的代码:

错误发生在Workbook Original = new Workbook(result [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);
        }



    }


    }
 }

现在..虽然上面的代码可能无法正常工作,但我收到的错误是

&#39; System.Runtime.InteropServices.COMException&#39;发生在mscorlib.dll

附加说明信息

HRESULT:0x80040154(REGDB_E_CLASSNOTREG))

谷歌搜索了很长一段时间后,我已经下载了依赖性walker并输出了以下内容:

enter image description here

我不知道我在做什么,一些帮助将不胜感激!谢谢

编辑:HKEY CLASSES_ROOT的REGEDIT图片(如果需要)

enter image description here

EDIT2:错误图片

enter image description here

1 个答案:

答案 0 :(得分:2)

遗憾的是,这个错误是一个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

另外,只是为了添加更多信息:你可能会问:“但等等,ryrich,Application也是一个界面!为什么我可以实例化但不是{{1 }} - “

我也想知道这一点。显然这是有效的,因为它装饰有Workbook(和一些其他属性)。有关此问题的更多详细信息,请参阅 this 堆栈溢出帖子。