Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用C语言读取损坏的excel#_C#_Asp.net_Excel_C# 4.0_Oledbconnection - Fatal编程技术网

C# 用C语言读取损坏的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.

我想使用C#console应用程序打开并读取损坏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),而不是可读性?