如何修复excel文件?

时间:2013-02-18 13:47:29

标签: c# excel

我有一个excel文件,其中包含4个工作表。外部系统每天发送excel文件,我的程序读取然后将数据存储到db。我有3个文件可能已被损坏当我的程序尝试读取它给出错误“外部表不是预期的格式”的文件。当我尝试在办公室界面中打开文件时,它返回Excel Excel文件中找到不可读的内容。您要恢复此工作簿的内容吗?等...

当我使用office excel修复文件并重新保存后启动程序时,它可以工作。但我需要在程序开始读取之前修复这些文件。有办法修复办公室等excel文件吗?

我正在使用Microsoft.ACE.OLEDB.12.0;

3 个答案:

答案 0 :(得分:8)

您可以使用 Excel Interop 打开文件并按Excel执行修复。但是,如果没有MS Office,您无法在计算机上使用您的程序。您可以尝试第三方库,如:

Excel Interop的代码如下:

Missing missing = Missing.Value;
Application excel = new Application();
Workbook workbook = excel.Workbooks.Open(sourceFilePath,
    missing, missing, missing, missing, missing,
    missing, missing, missing, missing, missing,
    missing, missing, missing, XlCorruptLoad.xlRepairFile);
workbook.SaveAs(savedFile, XlFileFormat.xlWorkbookDefault,
    missing, missing, missing, missing,
    XlSaveAsAccessMode.xlExclusive, missing,
    missing, missing, missing, missing);
workbook.Close(true, missing, missing);

答案 1 :(得分:3)

由于您的文件来自外部来源,因此可能会阻止其作为安全预防措施。 解决方案可能是以编程方式解锁Excel文件,如下所示:

public class FileUnblocker {
    [DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool DeleteFile(string name);

    public bool Unblock(string fileName) {
        return DeleteFile(fileName + ":Zone.Identifier");
    }
}

取自这个答案: Unblock File from within .net 4 c#

答案 2 :(得分:0)

在使用Microsoft.Office.Interop.Excel库时遇到了类似的问题。 Serkan的答案是完全正确的,它为我指明了正确的方向,但并不能解决我的问题。在浏览一些Microsoft博客后,我发现了this solution。 Open()方法可以为最后一个参数采用3个不同的常量。

  • xlNormalLoad
  • xlRepairFile
  • xlExtractData

对我来说,第三个有效。我必须打开几种不同类型的excel文件,有些会引发此错误,有些则不会,因此我将所有内容包装在try / catch中,以处理引发COMException的情况。您可能会遇到一个不同的异常,但是值得尝试一下我上面提到的每个常量,看看是否可以解决问题。

        ExcelApp.Workbook excelBook;
        ExcelApp._Worksheet excelSheet;
        ExcelApp.Range excelRange;
        
        try
        {
            excelBook = excelApp.Workbooks.Open(path);
            excelSheet = excelBook.Sheets[1];
            excelRange = excelSheet.UsedRange;
        }
        catch(COMException)
        {
            excelBook = excelApp.Workbooks.Open(path, CorruptLoad: 
                       ExcelApp.XlCorruptLoad.xlExtractData);
            excelSheet = excelBook.Sheets[1];
            excelRange = excelSheet.UsedRange;
        }