繁体   English   中英

COMException C#Microsoft.Office.Interop.Excel

[英]COMException C# Microsoft.Office.Interop.Excel

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

错误发生在原始工作簿=新工作簿(结果[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);
        }



    }


    }
 }

现在..尽管上面的代码可能无法正常工作,但我收到一条错误消息,指出

mscorlib.dll中发生了'System.Runtime.InteropServices.COMException'

加上其他信息说

HRESULT:0x80040154(REGDB_E_CLASSNOTREG))

谷歌搜索一段时间后,我下载了依赖行者,并获得以下输出:

在此处输入图片说明

我不知道我在做什么,将不胜感激! 谢谢

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

在此处输入图片说明

EDIT2:错误图片

在此处输入图片说明

不幸的是,此错误是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也是一个接口!我怎么能实例化它,而不能实例化Workbook ?”

我也想知道。 显然,这是CoClassAttribute因为它装饰有CoClassAttribute (和其他一些属性)。 有关更详细的信息,请参阅堆栈溢出职位。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM