如何修复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 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
我在这里找到了这个解决方案。