读取 Excel 文件时出现 C# 错误,这是一个奇怪的错误
C# error when read Excel file, this is a strange error
当我在 C# 中读取 (*.xls) 文件时出现错误。
我在 SO 中看到很多关于 "DCOM Access Denied Problem" 的主题和相关问题的配置,但没有一个解决了我的问题。检查所有权限和管理员帐户。这是错误图片:
更新:这是应用程序记录的错误:
Error : The remote procedure call failed. (Exception from HRESULT: 0x800706BE)
Stack Trace : at Microsoft.Office.Interop.Excel.Workbooks.Open(String Filename, Object UpdateLinks, Object ReadOnly, Object Format, Object Password, Object WriteResPassword, Object IgnoreReadOnlyRecommended, Object Origin, Object Delimiter, Object Editable, Object Notify, Object Converter, Object AddToMru, Object Local, Object CorruptLoad)
at Pardic.WebProcess.frmGetPrice.worker_DoWork(Object sender, DoWorkEventArgs e)
^^-------------------------------------------------------------------^^
Source : Microsoft.Office.Interop.Excel
Method : Quit
Date : 02:21:19 ب.ظ
Time : 07/03/1398
Computer : DESKTOP-2QPBGQ1
Error : Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
Stack Trace : at Microsoft.Office.Interop.Excel.ApplicationClass.Quit()
at Pardic.WebProcess.frmGetPrice.worker_DoWork(Object sender, DoWorkEventArgs e)
这是事件 Windows 日志:
Log Name: Application
Source: Application Error
Date: 5/28/2019 2:16:11 PM
Event ID: 1000
Task Category: (100)
Level: Error
Keywords: Classic
User: N/A
Computer: DESKTOP-2QPBGQ1
Description:
Faulting application name: EXCEL.EXE, version: 15.0.4420.1017, time stamp: 0x506741b5
Faulting module name: ntdll.dll, version: 10.0.14393.2214, time stamp: 0x5ac2f612
Exception code: 0xc0000005
Fault offset: 0x000000000004961c
Faulting process id: 0x1934
Faulting application start time: 0x01d5153a29e7eeb5
Faulting application path: C:\Program Files\Microsoft Office\Office15\EXCEL.EXE
Faulting module path: C:\Windows\SYSTEM32\ntdll.dll
Report Id: 9910317c-cd4c-49b2-8869-76f88b722123
Faulting package full name:
Faulting package-relative application ID:
Event Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="Application Error" />
<EventID Qualifiers="0">1000</EventID>
<Level>2</Level>
<Task>100</Task>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2019-05-28T09:46:11.052916900Z" />
<EventRecordID>20076</EventRecordID>
<Channel>Application</Channel>
<Computer>DESKTOP-2QPBGQ1</Computer>
<Security />
</System>
<EventData>
<Data>EXCEL.EXE</Data>
<Data>15.0.4420.1017</Data>
<Data>506741b5</Data>
<Data>ntdll.dll</Data>
<Data>10.0.14393.2214</Data>
<Data>5ac2f612</Data>
<Data>c0000005</Data>
<Data>000000000004961c</Data>
<Data>1934</Data>
<Data>01d5153a29e7eeb5</Data>
<Data>C:\Program Files\Microsoft Office\Office15\EXCEL.EXE</Data>
<Data>C:\Windows\SYSTEM32\ntdll.dll</Data>
<Data>9910317c-cd4c-49b2-8869-76f88b722123</Data>
<Data>
</Data>
<Data>
</Data>
</EventData>
</Event>
这是已安装程序的列表:
public static System.Collections.Generic.List<Pardic.DataAwareCtrls.Progress.InsuranceDrugInfo> ReadResult(string fileAddress)
{
List<Pardic.DataAwareCtrls.Progress.InsuranceDrugInfo> retList = new List<Pardic.DataAwareCtrls.Progress.InsuranceDrugInfo>();
Microsoft.Office.Interop.Excel.Application oXL;
oXL = new Microsoft.Office.Interop.Excel.Application();
try
{
Microsoft.Office.Interop.Excel.Workbook theWorkbook = oXL.Workbooks.Open(fileAddress);
Microsoft.Office.Interop.Excel.Sheets sheets = theWorkbook.Worksheets;
Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)sheets.get_Item(1);
foreach (Microsoft.Office.Interop.Excel.Worksheet item in sheets)
{
if (item.Name.Contains("Main"))
{
Microsoft.Office.Interop.Excel.Range ShtRange = item.UsedRange;
int CodeColumnNum = 0;
int PriceColumnNum = 0;
int NameColumnNum = 0;
int num = 0;
for (num = 1; num <= ShtRange.Columns.Count; num++)
{
try
{
string temp = string.Empty;
try
{
temp = ShtRange.Cells[1, num].Value2.ToString();
}
catch
{
temp = string.Empty;
}
if (temp.Contains("كد دارو"))
CodeColumnNum = num;
if (temp.Contains("تغيير قيمت"))
PriceColumnNum = num;
if (temp.Contains("نام دارو"))
NameColumnNum = num;
}
catch (Exception ex)
{
if (CodeColumnNum > 0 && PriceColumnNum > 0 && NameColumnNum > 0)
break;
oXL.Quit();
throw ex;
}
}
for (num = 2; num <= ShtRange.Rows.Count; num++)
{
Pardic.DataAwareCtrls.Progress.InsuranceDrugInfo drug = new Pardic.DataAwareCtrls.Progress.InsuranceDrugInfo();
string Codetemp = string.Empty;
try
{
Codetemp = ShtRange.Cells[num, CodeColumnNum].Value2.ToString();
}
catch
{
Codetemp = string.Empty;
}
string Pricetemp = string.Empty;
try
{
Pricetemp = ShtRange.Cells[num, PriceColumnNum].Value2.ToString();
}
catch
{
Pricetemp = string.Empty;
}
drug.Drug_Code = CodeAnalize(Codetemp);
drug.Drug_Price = PriceAnalize(Pricetemp);
drug.Drug_Name = ShtRange.Cells[num, NameColumnNum].Value2;
if (drug.Drug_Price != string.Empty && drug.Drug_Code != string.Empty)
retList.Add(drug);
}
}
}
theWorkbook.Save();
return retList;
}
catch //(Exception ex)
{
return null;
}
finally
{
oXL.Quit();
}
}
这个问题是我重装windows和office时出现的。安装office是2013(office和win都是64位)
更新:
避免互操作,除非你真的需要它!
对于 Excel,您可以使用 EPPlus,这是一个很棒的 C# 库,适用于 read/write Excel-Files。
它工作正常,不需要 Excel 在 PC 上安装。
编辑:由于从 Interop 更改为 EPPlus 对作者来说不是一个选项,并且由于额外提供的错误信息,我想将 folowwing 添加到我的答案中。
错误是"Access Denied"。所以我可以想到两个原因:
用户权限不足,无法打开该工作簿或启动 excel 进程。
另一个进程正在使用该工作簿(Excel, ...)
对于 1:检查执行用户是否可以访问工作簿并被允许启动 excel。请注意,对于 IIS-Webapplication,用户是 "IIS Application pool User" 而不是管理员。
对于2:这是Hans之前提到的。确保没有 Excel 的其他实例是 运行.
经过大量提示、工作和提示后,我卸载了 Foxit Reader 软件,现在 xls 文件可以正常工作了。为什么 Microsoft 无法检测到此错误。
当我在 C# 中读取 (*.xls) 文件时出现错误。
我在 SO 中看到很多关于 "DCOM Access Denied Problem" 的主题和相关问题的配置,但没有一个解决了我的问题。检查所有权限和管理员帐户。这是错误图片:
更新:这是应用程序记录的错误:
Error : The remote procedure call failed. (Exception from HRESULT: 0x800706BE)
Stack Trace : at Microsoft.Office.Interop.Excel.Workbooks.Open(String Filename, Object UpdateLinks, Object ReadOnly, Object Format, Object Password, Object WriteResPassword, Object IgnoreReadOnlyRecommended, Object Origin, Object Delimiter, Object Editable, Object Notify, Object Converter, Object AddToMru, Object Local, Object CorruptLoad)
at Pardic.WebProcess.frmGetPrice.worker_DoWork(Object sender, DoWorkEventArgs e)
^^-------------------------------------------------------------------^^
Source : Microsoft.Office.Interop.Excel
Method : Quit
Date : 02:21:19 ب.ظ
Time : 07/03/1398
Computer : DESKTOP-2QPBGQ1
Error : Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
Stack Trace : at Microsoft.Office.Interop.Excel.ApplicationClass.Quit()
at Pardic.WebProcess.frmGetPrice.worker_DoWork(Object sender, DoWorkEventArgs e)
这是事件 Windows 日志:
Log Name: Application
Source: Application Error
Date: 5/28/2019 2:16:11 PM
Event ID: 1000
Task Category: (100)
Level: Error
Keywords: Classic
User: N/A
Computer: DESKTOP-2QPBGQ1
Description:
Faulting application name: EXCEL.EXE, version: 15.0.4420.1017, time stamp: 0x506741b5
Faulting module name: ntdll.dll, version: 10.0.14393.2214, time stamp: 0x5ac2f612
Exception code: 0xc0000005
Fault offset: 0x000000000004961c
Faulting process id: 0x1934
Faulting application start time: 0x01d5153a29e7eeb5
Faulting application path: C:\Program Files\Microsoft Office\Office15\EXCEL.EXE
Faulting module path: C:\Windows\SYSTEM32\ntdll.dll
Report Id: 9910317c-cd4c-49b2-8869-76f88b722123
Faulting package full name:
Faulting package-relative application ID:
Event Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="Application Error" />
<EventID Qualifiers="0">1000</EventID>
<Level>2</Level>
<Task>100</Task>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2019-05-28T09:46:11.052916900Z" />
<EventRecordID>20076</EventRecordID>
<Channel>Application</Channel>
<Computer>DESKTOP-2QPBGQ1</Computer>
<Security />
</System>
<EventData>
<Data>EXCEL.EXE</Data>
<Data>15.0.4420.1017</Data>
<Data>506741b5</Data>
<Data>ntdll.dll</Data>
<Data>10.0.14393.2214</Data>
<Data>5ac2f612</Data>
<Data>c0000005</Data>
<Data>000000000004961c</Data>
<Data>1934</Data>
<Data>01d5153a29e7eeb5</Data>
<Data>C:\Program Files\Microsoft Office\Office15\EXCEL.EXE</Data>
<Data>C:\Windows\SYSTEM32\ntdll.dll</Data>
<Data>9910317c-cd4c-49b2-8869-76f88b722123</Data>
<Data>
</Data>
<Data>
</Data>
</EventData>
</Event>
这是已安装程序的列表:
public static System.Collections.Generic.List<Pardic.DataAwareCtrls.Progress.InsuranceDrugInfo> ReadResult(string fileAddress)
{
List<Pardic.DataAwareCtrls.Progress.InsuranceDrugInfo> retList = new List<Pardic.DataAwareCtrls.Progress.InsuranceDrugInfo>();
Microsoft.Office.Interop.Excel.Application oXL;
oXL = new Microsoft.Office.Interop.Excel.Application();
try
{
Microsoft.Office.Interop.Excel.Workbook theWorkbook = oXL.Workbooks.Open(fileAddress);
Microsoft.Office.Interop.Excel.Sheets sheets = theWorkbook.Worksheets;
Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)sheets.get_Item(1);
foreach (Microsoft.Office.Interop.Excel.Worksheet item in sheets)
{
if (item.Name.Contains("Main"))
{
Microsoft.Office.Interop.Excel.Range ShtRange = item.UsedRange;
int CodeColumnNum = 0;
int PriceColumnNum = 0;
int NameColumnNum = 0;
int num = 0;
for (num = 1; num <= ShtRange.Columns.Count; num++)
{
try
{
string temp = string.Empty;
try
{
temp = ShtRange.Cells[1, num].Value2.ToString();
}
catch
{
temp = string.Empty;
}
if (temp.Contains("كد دارو"))
CodeColumnNum = num;
if (temp.Contains("تغيير قيمت"))
PriceColumnNum = num;
if (temp.Contains("نام دارو"))
NameColumnNum = num;
}
catch (Exception ex)
{
if (CodeColumnNum > 0 && PriceColumnNum > 0 && NameColumnNum > 0)
break;
oXL.Quit();
throw ex;
}
}
for (num = 2; num <= ShtRange.Rows.Count; num++)
{
Pardic.DataAwareCtrls.Progress.InsuranceDrugInfo drug = new Pardic.DataAwareCtrls.Progress.InsuranceDrugInfo();
string Codetemp = string.Empty;
try
{
Codetemp = ShtRange.Cells[num, CodeColumnNum].Value2.ToString();
}
catch
{
Codetemp = string.Empty;
}
string Pricetemp = string.Empty;
try
{
Pricetemp = ShtRange.Cells[num, PriceColumnNum].Value2.ToString();
}
catch
{
Pricetemp = string.Empty;
}
drug.Drug_Code = CodeAnalize(Codetemp);
drug.Drug_Price = PriceAnalize(Pricetemp);
drug.Drug_Name = ShtRange.Cells[num, NameColumnNum].Value2;
if (drug.Drug_Price != string.Empty && drug.Drug_Code != string.Empty)
retList.Add(drug);
}
}
}
theWorkbook.Save();
return retList;
}
catch //(Exception ex)
{
return null;
}
finally
{
oXL.Quit();
}
}
这个问题是我重装windows和office时出现的。安装office是2013(office和win都是64位)
更新:
避免互操作,除非你真的需要它!
对于 Excel,您可以使用 EPPlus,这是一个很棒的 C# 库,适用于 read/write Excel-Files。
它工作正常,不需要 Excel 在 PC 上安装。
编辑:由于从 Interop 更改为 EPPlus 对作者来说不是一个选项,并且由于额外提供的错误信息,我想将 folowwing 添加到我的答案中。
错误是"Access Denied"。所以我可以想到两个原因:
用户权限不足,无法打开该工作簿或启动 excel 进程。
另一个进程正在使用该工作簿(Excel, ...)
对于 1:检查执行用户是否可以访问工作簿并被允许启动 excel。请注意,对于 IIS-Webapplication,用户是 "IIS Application pool User" 而不是管理员。
对于2:这是Hans之前提到的。确保没有 Excel 的其他实例是 运行.
经过大量提示、工作和提示后,我卸载了 Foxit Reader 软件,现在 xls 文件可以正常工作了。为什么 Microsoft 无法检测到此错误。