Что Написано Ручкой, Или Как Проверить Документы В Форматах Ms Office

Одной из наиболее частых задач в процессе создания приложений является генерация различных документов в любом из популярных форматов.

Есть несколько обычных путей к желаемому результату — от подключения готовой библиотеки до жесткого изучения спецификации формата и последующего написания необходимого кода.

Но, независимо от выбранного варианта, неплохо было бы проверить, что полученный документ будет хорошо принят и отредактирован стандартными средствами.

О некоторых методах такой проверки и пойдет речь под катом.



Что написано ручкой, или как проверить документы в форматах MS Office

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

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

Офисный открытый XML , более известные как docx и xlsx, а также их двоичные предшественники doc и xls. Я расскажу о некоторых механизмах работы с ними.



Прогулка с динозаврами

Хотя Microsoft разместила на своем сайте официальные спецификации формата.

док И xls , они часто оказываются скупыми и немногословными в своих описаниях.

Стоит понимать, что со временем форматы претерпели существенные изменения (при сохранении обратной совместимости).

При этом единый подход был использован не только для хранения документов Word, но и таблиц Excel и презентаций PowerPoint. Проще говоря, даже если у вас есть пособие, чтобы почувствовать себя Жоржем Кювье, пытающимся по разбросанным костям реконструировать облик загадочного животного, множество .

К счастью, есть способ локализовать проблемы в документе, не разбирая байтовый беспорядок в любимом шестнадцатеричном редакторе.

Этот метод заключается в использовании Средство проверки формата двоичных файлов Microsoft Office .

Это довольно простая в использовании утилита командной строки, которая поставляется с тремя DLL (по одной для каждого поддерживаемого формата — doc, xls, ppt).

Несмотря на то, что с момента первое официальное объявление Бета-версия остается размещенной на сайте, инструмент вполне функционален и справляется со своими задачами.

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

Для запуска утилиты достаточно ввести команду

  
   

bffvalidator.exe [-l log.xml] filename.ext

где имя_файла.

ext — имя проверяемого файла, а -l log.xml — необязательный параметр, указывающий, куда сохранять журнал (по умолчанию журнал записывается в ту же папку, где находится проверяемый документ).

Чтобы облегчить жизнь и сократить количество рутинных действий, я использую два сценария работы с валидатором.

При проверке отдельного файла удобно использовать Far: достаточно создать отдельную папку, например, c:\Temp\Bff, поместить туда исполняемый файл валидатора и сопутствующие dll, а затем запустить команду через F9-Команды-Ассоциации файлов.

:

Что написано ручкой, или как проверить документы в форматах MS Office



Что написано ручкой, или как проверить документы в форматах MS Office

После этого вы сможете проверить подозрительный файл всего за пару нажатий клавиш.

Другой сценарий, который имеет смысл, заключается в том, чтобы приложение сгенерировало набор тестовых файлов, а затем использовало простой код для запуска теста по всему набору, например:

public class FileFormatValidationFailedException : Exception { public FileFormatValidationFailedException(string msg) : base(msg) { } } public void RunBFFValidator(string filePath) { string fileName = Path.GetFileName(filePath); string workingDirectory = Path.GetDirectoryName(filePath); string startupPath = Path.GetDirectoryName(Process.GetCurrentProcess().

MainModule.FileName); StageName = String.Format("RUNNING BFFValidator for FILE {0}", fileName); outputManager.BeginWriteInfoLine(String.Format("Running BFFValidator for saved file '{0}'", fileName)); ProcessStartInfo startInfo = new ProcessStartInfo(Path.Combine(startupPath, "BFFValidator.exe")); startInfo.Arguments = string.Format("-l bfflog.xml \"{0}\"", Path.Combine(workingDirectory, fileName)); startInfo.WorkingDirectory = workingDirectory; startInfo.WindowStyle = ProcessWindowStyle.Hidden; Process validatorProcess = Process.Start(startInfo); validatorProcess.WaitForExit(); if (validatorProcess.ExitCode != 0) { using (StreamReader reader = new StreamReader(Path.Combine(workingDirectory, "bfflog.xml"))) { string logContent = reader.ReadToEnd(); throw new FileFormatValidationFailedException(logContent); } } }



Вторая часть балета Мерлезон.

Ситуация с Office Open XML намного проще.

Если открыть несколько файлов шестнадцатеричным редактором, то в начале данных вы увидите инициалы Фил Кац :

Что написано ручкой, или как проверить документы в форматах MS Office

Это значит, что файлы представляют собой zip-архив с названием docx/xlsx, который вы можете открыть и увидеть полностью читаемую структуру.

Однако в этом случае можно не пытаться искать расхождения с документацией из Редмонда вручную, а доверить анализ файла специально предназначенным для этого инструментам.

Для этого скачайте Открытый XML SDK 2.5 и устанавливаем его (нам потребуются OpenXMLSDKV25.msi и OpenXMLSDKToolV25.msi).

После этого вы можете создать приложение для проверки файлов на недопустимую разметку (вам понадобится ссылка на DocumentFormat.OpenXml.dll).

Простейший код парсинга документов выглядит так:

public void RunOpenXmlValidation(string filePath, string openXmlFormatVersion) { string fileName = Path.GetFileName(filePath); StageName = String.Format("RUNNING OpenXmlValidation for FILE {0}", fileName); outputManager.BeginWriteInfoLine(String.Format("Running OpenXmlValidation for saved file '{0}'", fileName)); using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(filePath, false)) { DocumentFormat.OpenXml.FileFormatVersions formatVersion = DocumentFormat.OpenXml.FileFormatVersions.Office2010; if (openXmlFormatVersion == "office2007") formatVersion = DocumentFormat.OpenXml.FileFormatVersions.Office2007; else if (openXmlFormatVersion == "office2013") formatVersion = DocumentFormat.OpenXml.FileFormatVersions.Office2013; OpenXmlValidator validator = new OpenXmlValidator(formatVersion); var errors = validator.Validate(wordDoc); StringBuilder builder = new StringBuilder(); foreach (ValidationErrorInfo error in errors) { string errorMsg = string.Format("{0}: {1}, {2}, {3}", error.ErrorType.ToString(), error.Part.Uri, error.Path.XPath, error.Node.LocalName); builder.AppendLine(errorMsg); builder.AppendLine(error.Description); } string logContent = builder.ToString(); if (!string.IsNullOrEmpty(logContent)) throw new FileFormatValidationFailedException(logContent); } }



И нам нужно идти глубже…

Рассмотренные выше методы проверки следует рассматривать как попытку быстро найти, где именно в документе могут быть проблемы, а не как стопроцентную гарантию того, что все в порядке.

Бывают вполне реальные ситуации, когда валидатор выдает сообщение об ошибке, но Word или Excel нормально открывает файл, и наоборот — открыть проверенный документ не удается.

Поэтому если нужна более надежная проверка, то без использования COM не обойтись.

Для этого требуется установленный Microsoft Office, не является потокобезопасным , требует дополнительных жестов для x64, но позволяет проверить соответствие документа требованиям MS Office и изучить его структуру с точки зрения целевой платформы.



внеклассное чтение

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

Также при исследовании внутренней структуры документов утилита может помочь ОффВис .

Несколько полезных ссылок для взаимодействия с офисными приложениями: Первичные сборки взаимодействия (PIA) , Пространство имен Microsoft.Office.Interop.Excel , Пространство имен Microsoft.Office.Interop.Word .

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

Спасибо за внимание! Теги: #отчеты #.

NET #ms office #Разработка сайтов #.

NET

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.