2013-02-18 69 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