Одной из наиболее частых задач в процессе создания приложений является генерация различных документов в любом из популярных форматов.
Есть несколько обычных путей к желаемому результату — от подключения готовой библиотеки до жесткого изучения спецификации формата и последующего написания необходимого кода.
Но, независимо от выбранного варианта, неплохо было бы проверить, что полученный документ будет хорошо принят и отредактирован стандартными средствами.
О некоторых методах такой проверки и пойдет речь под катом.
Сразу оговорюсь, что под проверкой в данном случае я подразумеваю проверку соответствия полученного результата стандарту выбранного формата, что позволяет с достаточно большой вероятностью констатировать, что документ откроется как минимум в 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-Команды-Ассоциации файлов.
:
После этого вы сможете проверить подозрительный файл всего за пару нажатий клавиш.
Другой сценарий, который имеет смысл, заключается в том, чтобы приложение сгенерировало набор тестовых файлов, а затем использовало простой код для запуска теста по всему набору, например: 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 намного проще.
Если открыть несколько файлов шестнадцатеричным редактором, то в начале данных вы увидите инициалы Фил Кац :
Это значит, что файлы представляют собой 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
-
Доменная Зона.блог
19 Oct, 24 -
Электрический Apple Car: Миф Или Реальность?
19 Oct, 24 -
Гугл Диск
19 Oct, 24 -
Мтс Добавляет Услуги Без Разрешения
19 Oct, 24 -
Освящение Панбагона – Храма Всех Жуков
19 Oct, 24