3

4つのワークシートを含むExcelファイルがあります。外部システムは毎日Excelファイルを送信し、私のプログラムはデータを読み取ってdbに保存します。プログラムがファイルを読み取ろうとすると破損している可能性のあるファイルが3つあり、「外部テーブルが予期された形式ではありません」というエラーが表示されます。Officeインターフェイスでファイルを開こうとすると、Excelがfile.xlsxで読み取り不可能なコンテンツを検出したことを返します。このブックの内容を復元しますか?等...

OfficeExcelでファイルを修復して再度保存した後にプログラムを起動すると動作します。しかし、プログラムが読み取りを開始する前に、このファイルを修復する必要があります。オフィスのようにExcelファイルを修復する方法はありますか?

私はMicrosoft.ACE.OLEDB.12.0を使用しています。

4

3 に答える 3

9

Excel Interopを使用して、Excelと同じようにファイルを開き、修復できます。ただし、MSOfficeがないマシンでプログラムを使用することはできません。次のようなサードパーティのライブラリを試すことができます。

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");
    }
}

この回答からの抜粋: .net 4 c#内からファイルのブロックを解除する

于 2013-02-18T14:06:44.680 に答える
1

Microsoft.Office.Interop.Excelライブラリを使用しているときに、同様の問題が発生しました。セルカンの答えは完全に正しいです、そしてそれは私を正しい方向に向けました、しかしそれは私の問題を解決しませんでした。いくつかのMicrosoftブログを調べた後、私はこの解決策を見つけました。Open()メソッドが最後の引数に対して取ることができる3つの異なる定数があります。

  • xlNormalLoad
  • xlRepairFile
  • xlExtractData

私にとって、3番目のものはうまくいきました。いくつかの異なる種類のExcelファイルを開く必要があり、そのうちのいくつかはこのエラーをスローし、いくつかはそうではないので、COMExceptionをスローするケースを処理するためにすべてをtry/catchでラップしました。別の例外が発生している可能性がありますが、上記の各定数を試して、問題が解決するかどうかを確認することをお勧めします。

        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 に答える