C# 用C语言读取损坏的excel#
我想使用C#console应用程序打开并读取损坏excel中的数据。我尝试使用以下代码:C# 用C语言读取损坏的excel#,c#,asp.net,excel,c#-4.0,oledbconnection,C#,Asp.net,Excel,C# 4.0,Oledbconnection,我想使用C#console应用程序打开并读取损坏excel中的数据。我尝试使用以下代码: public System.Data.DataTable EXc(string path, string savedFile) { try { Missing missing = Missing.Value; Excel.Application excel = new Excel.
public System.Data.DataTable EXc(string path, string savedFile)
{
try
{
Missing missing = Missing.Value;
Excel.Application excel = new Excel.Application();
Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Open(path,
missing, missing, missing, missing, missing,
missing, missing, missing, missing, missing,
missing, missing, missing, Microsoft.Office.Interop.Excel.XlCorruptLoad.xlRepairFile);
workbook.Close(true, missing, missing);
if (workbook != null)
{
workbook.SaveAs(savedFile, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookDefault,
missing, missing, missing, missing,
Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, missing,
missing, missing, missing, missing);
}
但我有个例外
指定的强制转换无效
一致
workbook.SaveAs(savedFile, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookDefault,
missing, missing, missing, missing,
Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, missing,
missing, missing, missing, missing);
你能帮我一下吗?我意识到我的错误: 我试图保存一个已关闭的工作簿,可能是因为这个原因,我得到了那个异常 指定的强制转换无效 使用互操作打开损坏的excel后,我们可以使用oledb连接并将该数据复制到datatable或dataset中,然后可以使用 public System.Data.DataTable CorruptedExcel(字符串路径,字符串保存文件) {
try
{
Missing missing = Missing.Value;
Excel.Application excel = new Excel.Application();
Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Open(path, CorruptLoad: Microsoft.Office.Interop.Excel.XlCorruptLoad.xlRepairFile);
var connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + path + ";Extended Properties=\"Excel 8.0;HDR=YES;TypeGuessRows=0;ImportMixedTypes=Text\"";
//var connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=\"Excel 12.0;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text\""; ;
using (var conn = new OleDbConnection(connectionString))
{
conn.Open();
var sheets = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT * FROM [" + sheets.Rows[0]["TABLE_NAME"].ToString() + "] ";
var adapter = new OleDbDataAdapter(cmd);
adapter.Fill(dt);
}
}
return dt;
}
catch (Exception e)
{
throw new Exception("ReadingExcel: Excel file could not be read! Check filepath.\n"
+ e.Message + e.StackTrace);
}
}
你有堆栈跟踪吗?你没有强制转换任何东西,所以看起来它正在更深层次发生。@JamesJenkinson:异常在这一行被捕获,我的意思是在方法调用中。发布堆栈跟踪。如果你使用的是C#4(以及足够新版本的互操作程序集),您可以使用命名和可选参数,而不是到处乱发
缺少的,以使这样的代码更具可读性。也就是说,工作簿.Open(path,CorruptLoad:XlCorruptLoad.xlRepairFile)
@jeroenmoster:I更改了它,使用此代码的优点是什么:Workbooks.Open(路径,CorruptLoad:XlCorruptLoad.xlRepairFile),而不是可读性?