80040154 Classe non enregistrée (Exception de HRESULT
EDIT: Ce programme est d'essayer de lire dans un fichier excel à l'aide de C#, puis ajouter les données à une table dans sql developer.
J'ai couru dans une erreur que je ne peux pas semblent comprendre. Lorsque j'essaie de charger des données excel dans une Boîte de Message que je reçois cette:
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)).
Cette erreur apparaît sur:
Microsoft.Office.Interop.Excel.Workbook workbook = new Microsoft.Office.Interop.Excel.Workbook();
J'ai fait des recherches sur cette erreur et nous avons essayé tout ce que j'ai trouvé. J'ai essayé de changer le Platform Target
dans les propriétés de x86
comme l'ont dit certains avec décochant Prefer 32-bit
et en laissant Platform Target
à Any CPU
. J'ai pensé que je pourrais être absent une référence importante, mais il a remarqué que j'ai déjà eu l' .NETMicrosoft.Office.Interop.Excel
et quand j'ai essayé d'ajouter le COM équivalent, il n'a pas aidé. Pour référence, je suis aide d'une version 32 bits de Windows OS.
Toute aide sur les raisons de cette erreur se produit serait grandement apprécié. Merci.
Voici le code complet de la classe:
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
{
}
}
- Vous avez installé Office?
- Oui, ce qui se passe au travail, où Bureau et VS ont été installés sur tous les ordinateurs.
Vous devez vous connecter pour publier un commentaire.
C'est un bug dans votre code. Vous ne pouvez pas créer de nouvelles instances de Classeur comme cela, vous doit utiliser le Application.Les classeurs.Ajouter() méthode à la place.
C'est l'équivalent d'un usine méthode, un modèle commun dans les logiciels d'ingénierie et Bureau d'interopérabilité en général. N'obtenant pas une erreur de compilation pour le indisponible constructeur est une COM interop responsabilité. Vous pouvez voir le frottement quand vous vous rendez compte que le Classeur est une interface, pas une classe. La cartographie qui fait la nouveau mot-clé le travail sur COM types d'interface est imparfaite.