#c# #excel #file #interop
#c# #excel #файл #взаимодействие
Вопрос:
Я пытаюсь прочитать из файла EXCEL и отобразить то, что я получаю.
Вот мой класс Excel.
class Excel
{
private string path = "";
_Application excel = new _Excel.Application();
Workbook workbook;
Worksheet worksheet;
public Excel(string path, int sheet)
{
this.path = path;
workbook = excel.Workbooks.Open(path);
worksheet = workbook.Worksheets[sheet];
}
public string ReadCell(int row, int column)
{
row ;
column ;
if (worksheet.Cells[row, column].Value2 != null)
{
return worksheet.Cells[row, column].Value2;
}
else
{
return "";
}
}
}
Вот как я это называю
string pathToFile = @"K:hourstracking.xlsx";
Excel excel = new Excel(pathToFile, 1);
MessageBox.Show(excel.ReadCell(0, 0));
Вот мое исключение
System.Runtime.Службы взаимодействия.COMException HResult=0x80040154 Сообщение = Получение фабрики COM-классов для компонента с CLSID {00024500-0000-0000-C000-000000000046} не удалось из-за следующей ошибки: класс 80040154 не зарегистрирован (исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)). Источник=mscorlib StackTrace: в System.Runtime.Удаленное подключение.Удаленные сервисы.AllocateUninitializedObject(RuntimeType ObjectType) в System.Runtime.Удаленное подключение.Активация.ActivationServices.CreateInstance(RuntimeType ServerType) в System.Runtime.Удаленное подключение.Активация.ActivationServices.IsCurrentContextOK(RuntimeType ServerType, Object[] props, логическое значение bNewObj) в System.RuntimeTypeHandle.CreateInstance (тип RuntimeType, Boolean publicOnly, Boolean noCheck, Booleanamp; canBeCached, RuntimeMethodHandleInternalamp; ctor, Booleanamp; bNeedSecurityCheck) в System.RuntimeType.Создайте instanceslow(логическое значение publicOnly, логическое значение skipCheckThis, логическое значение fillCache, StackCrawlMarkamp; stackMark) в System.RuntimeType.Создайте instancedefaultctor (логическое значение publicOnly, логическое значение skipCheckThis, логическое значение fillCache, StackCrawlMark amp; stackMark) в системе.Активатор.CreateInstance(тип type, логическое значение непублично) в системе.Активатор.CreateInstance (введите type) в working_hours.Excel..ctor(путь к строке, лист Int32) в K:programmingvisual_studio_projectsworking_hoursworking_hoursworking_hoursExcel.cs:line 14 в working_hours.Program.Main(строка[] аргументов) в K:programmingvisual_studio_projectsworking_hoursworking_hoursworking_hoursProgram.cs:line 31
Я проверил, правильный ли путь, и это так.
Я думаю, что это может иметь отношение к ссылкам, которые я только что реализовал, но я не совсем уверен.
Я добавил
System.Windows.Forms.dll
и Microsoft.Office.Interop.Excel.dll
Если у кого-нибудь есть какие-либо идеи, пожалуйста, дайте мне знать.
Спасибо.
Комментарии:
1. Не используйте interop для анализа Excel.
2. Любое другое предложение и почему?
3. Потому что вам это больше не нужно.
.xlsx
файлы теперь используют OpenXML, открытый и стандартный формат, и вы можете легко их анализировать. Я использовалEPPlus
недавно, но там есть тонна библиотеки (LinqToExcel, ClosedXML, …)4. COM-взаимодействие — это то, чего вы хотели бы придерживаться как можно дальше. Поверьте мне. Если только вы не являетесь специалистом по c и не любите отлаживать утечку памяти, ошибку seg, нарушение доступа, повреждение кучи и т.д. с помощью windbg
5. Обычно мне не нравится, когда кто-то говорит не делать то, что вы пытаетесь сделать, вместо того, чтобы помочь вам это сделать. Но в этом случае я должен согласиться. Взаимодействие — это выгребная яма страданий, и когда вы решите эту проблему, она вознаградит вас злом. Это будет проклинать вас на протяжении поколений. Если вы переключитесь на EPPlus, вы решите эту проблему и предотвратите множество других.