我有一个excel文件,其中包含4个工作表。外部系统每天发送excel文件,我的程序读取然后将数据存储到db。我有3个文件可能已被损坏当我的程序尝试读取它给出错误“外部表不是预期的格式”的文件。当我尝试在办公室界面中打开文件时,它返回Excel Excel文件中找到不可读的内容。您要恢复此工作簿的内容吗?等...
当我使用office excel修复文件并重新保存后启动程序时,它可以工作。但我需要在程序开始读取之前修复这些文件。有办法修复办公室等excel文件吗?
我正在使用Microsoft.ACE.OLEDB.12.0;
答案 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");
}
}
答案 2 :(得分:0)
在使用Microsoft.Office.Interop.Excel库时遇到了类似的问题。 Serkan的答案是完全正确的,它为我指明了正确的方向,但并不能解决我的问题。在浏览一些Microsoft博客后,我发现了this solution。 Open()方法可以为最后一个参数采用3个不同的常量。
对我来说,第三个有效。我必须打开几种不同类型的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;
}