3

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

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

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

4

3 回答 3

9

您可以使用Excel 互操作来打开文件并像 Excel 一样进行修复。但是你不能在没有 MS Office 的机器上使用你的程序。您可以尝试第三方库,例如:

Excel 互操作的代码如下:

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);
于 2013-02-18T15:11:09.610 回答
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#

于 2013-02-18T14:06:44.680 回答
1

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

  • xlNormalLoad
  • xl修复文件
  • 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;
        }
于 2020-12-17T22:08:41.950 回答