C# 80040154类未注册(HRESULT例外

C# 80040154类未注册(HRESULT例外,c#,com,import,runtime-error,C#,Com,Import,Runtime Error,编辑:此程序试图使用C#读入excel文件,然后将数据添加到sql developer中的表中 我遇到了一个似乎无法解决的错误。当我尝试将excel数据加载到消息框中时,我得到以下信息: Retrieving the COM class factory for component with CLSID {00020819-0000-0000-C000-000000000046} failed due to the following error: 80040154 Class not regis

编辑:此程序试图使用C#读入excel文件,然后将数据添加到sql developer中的表中

我遇到了一个似乎无法解决的错误。当我尝试将excel数据加载到消息框中时,我得到以下信息:

Retrieving the COM class factory for component with CLSID {00020819-0000-0000-C000-000000000046} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
此错误出现在:

Microsoft.Office.Interop.Excel.Workbook workbook = new Microsoft.Office.Interop.Excel.Workbook();
我已经对这个特定错误进行了研究,并尝试了我所发现的一切。我尝试了将属性中的
平台目标更改为
x86
,就像一些人所说的那样,同时取消选中
首选32位
,并将
平台目标
保留在
任何CPU
。我想我可能缺少一个重要参考资料,但注意到我已经有了.NET
Microsoft.Office.Interop.Excel
,当我尝试添加COM等效项时,它没有帮助。作为参考,我使用的是32位Windows操作系统

如果您能提供有关此错误发生原因的任何帮助,我们将不胜感激。谢谢

以下是课程中的完整代码:

namespace ReadExcel
{
    public partial class Form1 : Form
    {
    public Microsoft.Office.Interop.Excel._Application excelApp = new Microsoft.Office.Interop.Excel.Application() { DisplayAlerts = false, Visible = false };

    public List<Attorney> listOfAttys = Helpers.getAttorneys();

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        setAttyList();
    }


    private void setAttyList()
    {
        foreach (var item in listOfAttys.Select(x => x.Caption))
            cmbAtty.Items.Add(item);


    }


    private void btnRun_Click(object sender, EventArgs e)
    {
        Microsoft.Office.Interop.Excel.Workbook workbook = new Microsoft.Office.Interop.Excel.Workbook();
        //Microsoft.Office.Interop.Excel.Style style = new Microsoft.Office.Interop.Excel.Style();
        //Microsoft.Office.Interop.Excel.Worksheet worksheet = new Microsoft.Office.Interop.Excel.Worksheet();

        try
        {

            workbook = excelApp.Workbooks.Open(txtbxFilename.Text);
            Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets.get_Item(1);
            Microsoft.Office.Interop.Excel.Range xlRange = worksheet.UsedRange;

            int rowCount = xlRange.Rows.Count;
            int colCount = xlRange.Columns.Count;


            for(int i=1; i <= rowCount; i++)
            {
              for(int j=1; j <= colCount; j++)
              {
                MessageBox.Show(xlRange.Cells[i,j].Value2.ToString());
              }
            }


            if (validateHeader(worksheet))
            {




            }
        }
        catch (Exception ex)
        { 
        }


        excelApp.Quit();
    }

    private void btnLoad_Click(object sender, EventArgs e)
    {
        txtbxFilename.Text = null;

        System.IO.Stream myStream = null;
        OpenFileDialog openFileDialog1 = new OpenFileDialog();

        openFileDialog1.InitialDirectory = "C:\\";
        openFileDialog1.Filter = "Excel files (*.xlsx)|*.xlsx";
        openFileDialog1.FilterIndex = 2;
        openFileDialog1.RestoreDirectory = true;

        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            try
            {
                if ((myStream = openFileDialog1.OpenFile()) != null)
                {
                    txtbxFilename.Text = openFileDialog1.FileName;
                    myStream.Close();
                    myStream.Dispose();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
            }
        }
    }


    private bool validateHeader(Microsoft.Office.Interop.Excel.Worksheet Worksheet)
    {
        if (Worksheet == null)
            return false;

        bool isValid = false;

        //get header row
        //check all cell values

        return isValid;
    }

    //private int getWorkSheetLength(int startPoint, char column, Microsoft.Office.Interop.Excel.Worksheet sheet)
    //{
    //    int i = startPoint;

    //    while (sheet.Range(column + i).Text.ToString().Replace("/r", String.Empty).Replace("/n", String.Empty).Replace(" ", String.Empty) != String.Empty)
    //        i++;

    //    i--;
    //    return i;
    //}


}

public class Attorney
{
    public string AttorneyID { get; set; }
    public int OrganizationID { get; set; }
    public string AttorneyName { get; set; }
    public string Caption { get; set; }
}

public class LegalTransactionRec
{
    public string AccountNumber { get; set; }
    public decimal CostAmount { get; set; }
    public string SSN { get; set; }
    public int BatchID { get; set; }
    public Attorney Attorney { get; set; }
    public DateTime TransactionDate { get; set; }
    public string Description { get; set; }
    public int TransactionCode { get; set; }
}


public class ReviewOutput
{
}

public class ApprovedOutput
{ 
}

}
名称空间读取Excel
{
公共部分类Form1:Form
{
公共Microsoft.Office.Interop.Excel.\u应用程序excelApp=new Microsoft.Office.Interop.Excel.Application(){DisplayAlerts=false,Visible=false};
public List listOfAttys=Helpers.getAttorneys();
公共表格1()
{
初始化组件();
}
私有void Form1\u加载(对象发送方、事件参数e)
{
setAttyList();
}
私有void setAttyList()
{
foreach(listOfAttys.Select(x=>x.Caption)中的变量项)
cmbAtty.项目。添加(项目);
}
私有void btnRun\u单击(对象发送方,事件参数e)
{
Microsoft.Office.Interop.Excel.Workbook工作簿=新的Microsoft.Office.Interop.Excel.Workbook();
//Microsoft.Office.Interop.Excel.Style Style=新的Microsoft.Office.Interop.Excel.Style();
//Microsoft.Office.Interop.Excel.Worksheet Worksheet=新的Microsoft.Office.Interop.Excel.Worksheet();
尝试
{
工作簿=excelApp.Workbooks.Open(txtbxFilename.Text);
Microsoft.Office.Interop.Excel.Worksheet Worksheet=(Microsoft.Office.Interop.Excel.Worksheet)工作簿.Worksheets.get_项(1);
Microsoft.Office.Interop.Excel.Range xlRange=worksheet.UsedRange;
int rowCount=xlRange.Rows.Count;
int colCount=xlRange.Columns.Count;
对于(int i=1;i
这是代码中的一个错误。您不能像这样创建工作簿的新实例,您必须使用该方法

它相当于工厂方法,这是软件工程和Office互操作中的一种常见模式。不为不可用的构造函数获取编译时错误是COM互操作的责任。当您意识到工作簿是接口而不是类时,您可以看到摩擦。使新关键字在COM上工作的映射接口类型不完善

这是代码中的一个错误。您不能像这样创建工作簿的新实例,您必须使用该方法


它相当于工厂方法,这是软件工程和Office互操作中的一种常见模式。不为不可用的构造函数获取编译时错误是COM互操作的责任。当您意识到工作簿是接口而不是类时,您可以看到摩擦。使新关键字在COM上工作的映射接口类型不完善。

您安装了Office?是的,这发生在所有计算机上都安装了Office和VS的工作环境中。您安装了Office?是的,这发生在所有计算机上都安装了Office和VS的工作环境中。即使我不尝试在excel中创建新工作簿,也需要此语法?我没有ice我忘了指定这个程序应该做什么(最后)。我正在尝试使用C#读取excel文件,然后将数据添加到sql developer中的一个表中。那么,尝试创建一个新工作簿根本没有意义。请使用工作簿[“somename”]或工作簿[索引]获取对它的引用。即使我没有尝试在excel中创建新工作簿,也需要此语法?我没有注意到我忘记指定此程序应该执行的操作(最后)。我正在尝试使用C#读取excel文件,然后将数据添加到sql developer中的表中。那么,尝试创建新工作簿毫无意义。请使用工作簿[“somename”]或工作簿[索引]获取对它的引用。
  var workbook = new Microsoft.Office.Interop.Excel.Workbook();