Как проверить, является ли файл допустимой электронной таблицей Excel? - PullRequest
5 голосов
/ 18 января 2012

Я уже провел некоторый поиск здесь на SO, на , этом , , этом , , этом и более, но без подсказки, так что я собираюсь получитьчтобы спросить вас, ребята.

Я пытаюсь открыть файл Excel через Interop, и у меня установлен Office 2007, поэтому я использую Microsoft.Office.Interop.Excel версию 14.0.

КогдаЯ пытаюсь открыть действительный файл xls, все работает нормально.

Но если я пытаюсь открыть неверный файл (например, растровое изображение или исполняемый файл) через Interop, Excel открывает его без жалоб и предупреждений.

Как определить, что в Excel загружен недопустимый файл рабочей книги, без блокировки с помощью предупреждения?

Я пытаюсь написать модульный тест моего объекта для чтения объектов Excel.Один из случаев - попытаться открыть неверный файл.

Некоторый код, который может помочь: Создание приложения:

    _app = new Application()
        {
            Visible = false,
            DisplayAlerts = false,     // <-- I don't want to remove this.
            AskToUpdateLinks = false,
        };

Открытие книги:

   _workbooks.Open(filename);
   _workbook = _workbooks.get_Item(1); // 1-based.
   _worksheets = _workbook.Sheets;

РЕДАКТИРОВАТЬ:Просто добавьте еще 1 информацию: Excel загружает неверный файл.Если для DisplayAlerts установлено значение true, он жалуется (открывает диалоговое окно), сообщая, что книга кажется поврежденной, но если для DisplayAlerts установлено значение false, файл загружается так, как показано ниже:

Excel Loads Invalid File

Ответы [ 2 ]

8 голосов
/ 18 января 2012

Я только что закончил, используя другой подход: у книг Excel есть свойство с именем FileFormat. Когда Excel открывает недопустимый файл, он устанавливает формат файла в одно из значений перечислителя текста:

    XlFileFormat.xlTextMac
    XlFileFormat.xlTextMSDOS
    XlFileFormat.xlTextPrinter
    XlFileFormat.xlTextWindows

И внутри этого перечисления в Excel есть действительные файлы (действительные для моих целей):

    XlFileFormat.xlExcel12
    XlFileFormat.xlExcel7
    XlFileFormat.xlExcel8
    XlFileFormat.xlExcel9795

Поэтому я прекратил использовать простой «or» для фильтрации того типа файлов, который я хотел бы импортировать:

    bool validFile = ( f == XlFileFormat.xlExcel12   ) 
                  || ( f == XlFileFormat.xlExcel7    ) 
                  || ( f == XlFileFormat.xlExcel8    ) 
                  || ( f == XlFileFormat.xlExcel9795 );

И теперь это работает. Спасибо за вашу помощь, ребята, вы направили меня в правильном направлении.

2 голосов
/ 18 января 2012

Вы можете проверить количество книг до и после загрузки файла. Если оба значения одинаковы, файл не удалось загрузить.

int countBefore = _workbooks.get_Count();
_workbooks.Open(filename);
int countAfter = _workbooks.get_Count();
if (countBefore == countAfter) {
    // The file failed to load.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...