如何修复excel文件

本文关键字:文件 excel 何修复 | 更新日期: 2023-09-27 18:00:09

我有一个excel文件,其中包含4个工作表。外部系统每天发送excel文件,我的程序读取并将数据存储到数据库中。我有3个文件,当我的程序尝试读取这些文件时,它可能已损坏,并给出错误"外部表不是预期格式"。当我尝试在office界面中打开文件时,会返回文件中Excel可获取的内容。.xlsx是否恢复此工作簿的内容?等等。

当我用office excel修复文件并再次保存后启动程序时,它就工作了。但我需要在程序开始读取之前修复这些文件。有没有像office那样修复excel文件的方法?

我使用的是Microsoft.ACE.OLEDB.12.0;

如何修复excel文件

您可以使用Excel Interop打开文件并像Excel一样进行修复。但是,如果没有微软办公软件,你就无法在机器上使用你的程序。您可以尝试第三方库,如:

  • http://closedxml.codeplex.com/
  • http://code.google.com/p/excellibrary/
  • http://simpleooxml.codeplex.com/

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);

由于文件来自外部源,因此作为安全预防措施,它可能会被阻止。解决方案可能是以编程方式解锁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");
    }
}

根据以下回答:从.net 4 c#中取消阻止文件

我在使用Microsoft.Office.Interop.Excel库时遇到了类似的问题。塞尔坎的回答是完全正确的,它为我指明了正确的方向,但它并没有解决我的问题。在浏览了一些微软博客后,我找到了这个解决方案。Open()方法可以为最后一个参数使用3个不同的常量。

  • xl正常负载
  • 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;
        }

您可以使用以下代码创建一个宏

Sub OpenAndRepairWorkbook()
Dim oWB As Workbook
On Error GoTo Err_Open
  Application.DisplayAlerts = False
  Set oWB = Workbooks.Open(Filename:="C:'ShasurData'ExcelVBA'VBE Tools 2007.xlam", CorruptLoad:=XlCorruptLoad.xlRepairFile)
  Application.DisplayAlerts = True
  Exit Sub
Err_Open:
  MsgBox Err.Number & " - " & Err.Description
  Err.Clear
  Application.DisplayAlerts = True
End Sub

我在这里找到了这个解决方案。