2013-02-18 116 views
2

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

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

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

+0

你可以发布您的代码? – 2013-02-18 13:57:18

+1

请不要只问我们为你解决问题。告诉我们你是如何试图自己解决问题的,然后向我们展示结果是什么,并告诉我们为什么你觉得它不起作用。请参阅“[您尝试过什么?](http://whathaveyoutried.com/)”,以获得一篇您最近需要阅读的优秀文章。 – 2013-02-18 14:10:37

+0

我对这样的办公室操作完全陌生,我不能说我在这种情况下尝试了一些东西。唯一的事情,我试图在MS Excel中打开并保存像这样一个[这里](http://stackoverflow.com/questions/6608228/ssis-excel-connection-error-external-table-is-not-in-the -expected-format) – fealin 2013-02-18 14:38:33

回答

7

您可以使用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); 
+0

这正是我想要做的。 – fealin 2013-02-18 15:38:29

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#

+0

我试过解决方案,但是当我使用解锁功能时,它返回了错误我正在使用Windows 7 x64,可能这个函数在x64中不起作用,或者替代流不存在。你对这个功能还有什么想法吗? – fealin 2013-02-18 14:34:54

+0

你能证实问题是被阻止的文件吗? 试图解锁的问题可能是权限问题,如这里所述: http://stackoverflow.com/questions/6375599/looks-this-pinvoke-correct-and-reliable – markoo 2013-02-18 14:57:33