Симптомы
При открытии документа Microsoft Office Word 2010 XML, документ Microsoft Office Word 2007 XML или документ Microsoft Office Word 2003 XML в Microsoft Internet Explorer, Internet Explorer не отображается документ с помощью таблицы стилей Internet Explorer XML по умолчанию и не отображает код XML. Вместо этого обозреватель Internet Explorer открывает документ XML в встроенного окна Word в обозревателе Internet Explorer или в новом окне Word.
Причина
По умолчанию обозреватель Internet Explorer открывает документы Word XML встроенного окна Word или в новом окне Word.
Временное решение
Чтобы создать XML-документ в приложении Word, откроется в обозревателе Internet Explorer и использует Internet Explorer по умолчанию таблицу стилей XML (отображение XML-код), изменения в документ «Блокнот», чтобы удалить следующий XML-код в начале документа:
<?mso-application progid="Word.Document"?>
Статус
Данное поведение является особенностью.
Нужна дополнительная помощь?
Вопрос:
Если я создаю новое приложение и ассоциируюсь с, скажем, расширением .xml файла на конкретном компьютере, когда кто-то дважды щелкает файл .xml, он запустит мое приложение и передаст файл в качестве параметра. Но Windows, похоже, знает, что другие файлы имеют возможность работать с этим типом файла. Как это настроено?
Кроме того, когда я сохраняю файл Microsoft Word в виде XML файла, а затем дважды щелкаю по файлу, он запустит Microsoft Word, хотя тип файла .xml связан с чем-то другим, например Internet Explorer, Похоже, что может быть заглушка, связанная с типом файла .xml, который при вызове просматривает содержимое и запускает соответствующее приложение.
Существует ли Windows API или какой-то стандартный способ сделать это?
Что я хотел создать приложение, чтобы делать именно то, что делает Word, т.е. сохранить файл в формате .xml, но при двойном щелчке запускает мое приложение вместо Internet Explorer.
Лучший ответ:
Механизм открытия документов Office.xml
Для документов Word, сохраненных в XML и имеющих расширений .xml, Microsoft внедрила специальный обработчик для открытия этих файлов в соответствующем приложении (этот механизм используется не только для документов Word, но также для электронных таблиц Excel, форм InfoPath и некоторых других форматов).
Если вы проверите реестр, вы увидите, что тип файла для файлов с расширением .xml установлен на xmlfile
:
HKEY_CLASSES_ROOT.xml (Default) = "xmlfile"
Команда, выполняемая при открытии этого типа файла, указана в
HKEY_CLASSES_ROOTxmlfileshellopencommand = ""C:Program FilesCommon FilesMicrosoft SharedOFFICE12MSOXMLED.EXE" /verb open "%1""
Итак, когда XML файл дважды щелкнут в проводнике, Windows запустит MSOXMLED.EXE. Это приложение теперь просматривает XML файл и ищет инструкцию обработки XML. Эта команда обработки с именем mso-application может указывать ProgId:
<?mso-application progid="Word.Document"?>
Если эта команда обработки найдена и ProgId является одним из поддерживаемых значений, MSOXMLED.EXE ищет реестр для команды open, указанной для этого ProgId. Для Word.Document на самом деле существует другое перенаправление на Word.Document12 (если Office 2007 установлен) с помощью подраздела CurVer Word.Document, поэтому мы получаем:
HKEY_CLASSES_ROOTWord.Document.12shellOpencommand = ""C:Program FilesMicrosoft OfficeOffice12WINWORD.EXE" /n /dde"
Итак, наконец, MSOXMLED.EXE запустит соответствующее приложение Office или запустит XML-приложение по умолчанию, указанное в
HKEY_CLASSES_ROOTXEV.GenericAppshellopencommand
Вы можете попробовать это, вызывая MSOXMLED.EXE из командной строки:
MSOXMLED.EXE /verb OPEN "SampleWordMLDocument.xml"
Если вы хотите реализовать такое же поведение, вам придется реализовать обработчик, такой как MSOXMLED.EXE, который просматривает файл для предопределенной инструкции по обработке, а затем направляет документ в соответствующее приложение.
Обработка значков
Выше мы рассмотрели способ обработки и редактирования документа. Другой механизм отвечает за отображение определенного значка в зависимости от инструкции обработки внутри документа XML: обработчик значков.
Обработчики значков – это тип расширений оболочки Explorer, которые являются COM-объектами в процессе, которые могут быть связаны с определенными типами файлов. Тот, который используется для файлов XML, указан в реестре под
HKEY_CLASSES_ROOTxmlfileShellExIconHandler = "{AB968F1E-E20B-403A-9EB8-72EB0EB6797E}"
Этот GUID ссылается на файл MSOXEV.dll, который, как и MSOXMLEX.EXE, проверяет XML файл для ProgId, а затем предоставляет правильный значок.
Поскольку все это довольно сложный механизм, вы должны тщательно подумать, хотите ли вы пойти этим путем. По-моему, гораздо проще зарегистрировать новое уникальное расширение файла. Он также ограничен, так как он будет работать только с типами файлов, которые позволят вам включить в заголовок файла какую-либо пользовательскую информацию (как ProgId).
Microsoft больше не использует этот метод и вместо этого использует расширения файлов для своих новых форматов OpenXML (см. Почему файлы Office.xml ведут себя иначе, чем другие “.xml” .).
Ответ №1
Ну, все ассоциации файлов хранятся в реестре. Там может быть статья “” Понимание сетевых файлов Windows”.
Кроме того, существует множество способов программно создавать ассоциации файлов. Хотя чаще всего это делается в установщике. Например, моя любимая система установки NSIS имеет макрос, чтобы справиться с этим: http://nsis.sourceforge.net/FileAssoc
Но тогда возникает проблема установки программы по умолчанию для открытия определенного типа файла. Я не знаю, какой язык или установить систему вы планируете использовать для этого, но кажется, что вопрос ответил здесь для NSIS. Разумеется, у Microsoft также есть документация по их способу сделать это с установщиком Windows. Но, как вы, наверное, догадались, я больше человек NSIS.;)
Ответ №2
В проводнике Windows выберите “Инструменты” – “Параметры папки” – “Типы файлов”. Нажимая “Новые” или “Дополнительно”, вы можете создавать/изменять собственные ассоциации приложений с различными типами файлов, которые появятся при щелчке правой кнопкой мыши по файлу.
EDIT: я не знаю, есть ли заглушка, которая перенаправляет определенные файлы. Вы можете проверить My ComputerHKEY_CLASSES_ROOT в реестре и посмотреть, что он там помещает.
Время на прочтение
5 мин
Количество просмотров 1.4K
Привет, Хабр! Меня зовут Дарья Чувашова, я — руководитель группы отделения SAP-разработки. В процессе моей проектной деятельности мне приходилось сталкиваться с задачами выгрузки документов в .doc формат и делать это нужно было быстро. При этом эти документы могли быть с совершенно разным форматированием, кучей таблиц, реквизитов и т. д. В SAP для выгрузки в форматы pdf и excel есть удобные инструменты, возможность работать с формулярами и графическими редакторами форм. Для работы с форматом.doc инструментов меньше. В этой статье я расскажу о быстром и самом простом способе выгрузить документ любой сложности.
Почему я решила написать этот «how‑to»? Как я упомянула, задачи по выгрузке файлов в.doc мне приходилось выполнять часто. В какой‑то момент я собрала все лайфхаки и советы по ускорению работы в один материал, а сейчас хочу поделиться им с хабровской аудиторией. Надеюсь, для коллег записи будут полезными. Описанный вариант решения имеет свои особенности, поэтому я постараюсь на примерах продемонстрировать некоторые «узкие» моменты.
Пошаговая инструкция решения вопроса
Шаг 1
В первую очередь нам нужно подготовить шаблон в MS Word в нужном формате. Важно заполнить все реквизиты тестовыми данными для примера, это значительно упростит нам жизнь в последующих действиях.
В качестве примера рассмотрим вот такой документ «Счёт‑фактура» в MS Word:
Шаблон необходимо заполнить тестовыми примерами, чтобы проверить, что при заполнении ничего не съезжает, и все реквизиты остаются на месте:
Шаг 2
Сохраним наш документ в формате XML: Файл — Сохранить как. Выбираем расширение .xml
Примечание: для большинства задач вполне достаточно формата.doc, он поддерживает ограничения редактирования, элементы управления и т. п.
Для того чтобы открыть данный файл, мне удобно использовать программу Altova XML Spy. Скорее всего нам потребуется проанализировать содержимое, а в данной программе выполнять анализ файла очень удобно за счёт подсветки синтаксиса. Вы, конечно, можете использовать любой другой редактор.
Открываем свой XML, видим примерно такую картину:
После применения команды PrettyPrinter:
Шаг 3
Переходим в SAP. В своём пакете разработки создадим Преобразование:
Выберем трансформацию XSLT:
Видим следующую картину:
Для того, чтобы наша трансформация верно работала, необходимо указать следующий код между тегами <xsl:template match=»/»> </xsl:template>:
<xsl:processing-instruction name="mso-application" progid="Word.Document">
<xsl:text progid="Word.Document"/>
</xsl:processing-instruction>
Теперь можно смело вставить весь XML‑код ниже из нашего документа:
Визуально просматриваю данный XML‑код, обнаруживаю, что часть тегов подсвечивается, как текст:
Вижу, что это произошло из‑за кавычек в наименовании компании (Company), смело их удаляю:
Теперь пытаемся активировать трансформацию. В 90% случаях активация пройдёт успешно.
Но если у вас появятся подобные ошибки,
Предлагаю стереть данные коды, так как они не имеют никакого смысла для генерации документа из SAP.
Удаляем:
После удаления всех кодов трансформация успешно активируется.
Шаг 4
Переходим в программу. Для вызова трансформации и выгрузки файла привожу для примера такой код:
Данный код максимально облегчён для простоты восприятия и предельной наглядности.
После запуска программы в папке C:TEMP сохранится файл точно в таком же виде, как наш подготовленный шаблон:
При открытии файла может возникнуть следующая ошибка:
Для того, чтобы от неё избавиться, переходим в трансформацию и ищем /word/settings.xml
Избавиться от ошибки мне помогло удаление всего блока <pkg:part … </pkg:part>. Это не повлияло на работоспособность, и файл стал открываться нормально. Без подсветки синтаксиса тяжело искать закрывающий тег, поэтому имеет смысл снова воспользоваться программой Altova XML Spy (в данной программе вы можете удалить лишний код, а затем вставить новую версию в нашу трансформацию).
Удаляем и активируем, проверяем, что ошибка ушла и с файлом всё в порядке.
Шаг 5
Переходим к выгрузке данных из контекста. Начнём с самого простого: выгрузим данные в поле «Продавец»:
Контекст представляет собой структуру c данными, например, вот такую:
Её мы заполняем и подаём в трансформацию как контекст. Далее копируем из файла, заполненного в качестве примера, текст из реквизита «Продавец» и ищем это место в нашей XML:
Вместо данного текста вставляем:
Не забываем указать нужную структуру контекста и сделать выборку данных. Для примера прописываю хардкодом наименование продавца:
Результат трансформации:
Остальные реквизиты заполняем аналогично.
Как видим, заполненный на Шаге 1 пример нам помогает выполнять быструю навигацию по XML и искать нужные места для доработки.
Отдельную сложность может представлять собой заполнение табличных данных. В структуре контекста имеем вложенную таблицу с данными T_INVOICE. Для вывода данных используем цикл for each. Начнём с 1 строки 1 столбца. Ищем поиском пример «Яблоки» и вставляем код, приведённый чуть ниже.
Теги описания таблицы довольно понятны: <w:tc> </w:tc> — стоблец, <w:tr </w:tr> — соответственно строка, ну и сам текст <w:t> </w:t>.
Если мы хотим каждую строку таблицы из контекста выводить в новую строку таблицы, то цикл ставим перед тегом строки и закрываем после окончания описания строки:
Конец цикла будет обозначен тут:
Так как таблица большая, окончание цикла будет через 400 строк, поэтому удобно воспользоваться опять же программой с подсветкой тегов, таким образом выводим все необходимые элементы таблицы.
Результат:
Видим, что строка автоматически добавилась. Так как нам не нужны старые данные из примера, удалим эти строки из таблицы. Ищем так же по тегам.
В идеале можно было бы в самом шаблоне оставить лишь одну строку для заполнения, тогда лишних действий по удалению колонок не пришлось бы делать. Но я хочу показать неидеальный случай.
Если необходимо вывести данные из таблицы контекста не в каждой строке таблицы, а текстом с переносом, то можем воспользоваться тегом переноса строки <w:br/>, например,
Получим вот такой результат:
Ещё немного полезных рекомендаций
Мы разобрали основные шаги, как сделать выгрузку любого реквизита и заполнить таблицу. При этом необязательно думать о размере шрифта или форматировании, достаточно изначально выстроить необходимые настройки и правки в исходном документе.
Что ещё записано в моих заметках?
Как поменять шрифт быстро, если он перестал подходить? Допустим, мы желаем заменить Arial на Calibri. Для этого в трансформации выполняем поиск Arial — «Заменить все» и вставляем название нового шрифта Calibri.
Для этого нужно в исходном файле на 1 шаге настроить защиту листа, тогда кодирующие эту операцию теги будут отражены в нашей трансформации.
Примеры исходного кода из статьи можно увидеть в репозитории github.
Данной информации должно быть достаточно, чтобы сделать выгрузку практически любого документа быстро и эффективно.
- Remove From My Forums
-
Question
-
Hello,
I have a problem with my Windows 7’s configuration.
I create a document with Word 2007 and save it with document XML Word Format (.xml)
in my computer, when i search to open directly (double click) this document, the document is open with my XML editor, and not Microsoft Word
I verify if my XML document contains <?mso-application progid=»Word.Document»?>, it’s OK,
fortunately !In other computer, in Windows XP SP3, the icon’s file is word icon, despite extension file is .XML, not in my Windows 7 computer !
In other computer, an XML file without <?mso-application progid=»Word.Document»?> are icon’s file XML, it’s OK
why, in my computer, the XML preprocessing instruction <?mso-application progid=»Word.Document»?> is not
interpreted ?how it is possible to correct this problem and to obtain icon word when preprocessing instruction <?mso-application progid=»Word.Document»?> is available on my XML file and open file with Word. And obtain XML icon and open XML file in XML
editor otherwise ? it’s a normaly process in Windows XP…Thank you for your help.
Answers
-
Hi christopheNS,
To open a file in Word by double click, you need to change “Open with” property of *.xml file.
By the way, this forum is used to discuss Office Development questions such as VBA, VSTO and OpenXML SDK. For Office product related questions, I suggest you
posting them to
Microsoft Office Forum.
<THE CONTENT IS PROVIDED «AS IS» WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
Thanks
MSDN Community SupportPlease remember to «Mark as Answer» the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.
-
Edited by
Thursday, September 19, 2013 9:38 AM
-
Marked as answer by
George Hua
Wednesday, September 25, 2013 4:15 PM
-
Edited by
«Обработчик Office XML» — это отображаемое имя процесса MSOXMLED.EXE
, которое находится на моем компьютере в папке C:Program Files (x86)Common FilesMicrosoft SharedOFFICE15
. Он используется для открытия файлов XML (возможно, также других расширений?) и определить, с какой программой MS Office должен быть связан файл (если есть), и затем открыть файл с этой программой.
Это объясняется в https://stackoverflow.com/a/1569619/1858923:
Поэтому, если дважды щелкнуть файл XML в Проводнике, Windows запустит MSOXMLED.EXE. Это приложение теперь ищет внутри XML-файла и ищет инструкцию обработки XML. Эта инструкция обработки с именем mso-application может указывать ProgId:
<?mso-application progid="Word.Document"?>
…
Итак, наконец, MSOXMLED.EXE запустит соответствующее приложение Office или запустит приложение XML по умолчанию, указанное в разделе
HKEY_CLASSES_ROOTXEV.GenericAppshellopencommand
Ясно, что я получил сообщение об ошибке, потому что файл, который он пытался открыть, не имел тега mso mso-application
, который сообщал бы MSOXMLED.EXE
как открыть файл, и у меня нет ключа HKEY_CLASSES_ROOTXEV.GenericAppshellopencommand
set, поэтому он не знает, что делать с файлом.