Этюды для программистов Microsoft Word

Home ] Up ] Этюд 3.1. Работа со свойствами документа. ] Этюд 3.2. Переопределение поведения Drag-n-Drop для окна документа Microsoft Word ] Этюд 3.3. Microsoft Word как сервер автоматизации. ] Этюд 3.4. Транскрайбер ]


  Server -
1. A person whose occupation is to serve at table (as in a restaurant).
 

http://www.websters-online-dictionary.org/definition/server

Этюд 3.3. Microsoft Word как сервер автоматизации

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

Рассматривается создание прокси классов C++ на основе библиотеки типов (type library).
Приведен также краткий обзор проектов, использующих автоматизацию.


Содержание

Что такое автоматизация
Краткий обзор проектов, использующих автоматизацию
Библиотеки типов Microsoft Word
Создание прокси-классов C++ на основе библиотеки типов
Файл объявлений "msword9.h"
Файл реализации "msword9.сpp"
Ресурсы
Функциональная спецификация
Выводы
Задания


Что такое автоматизация

Под автоматизацией (OLE Automation) обычно понимается возможность использовать (вызывать) функции сервера автоматизации (в данном этюде сервером автоматизации является Microsoft Word) из скриптов (например, Visual Basic Script или Java Script), или из программ, написанных на других языках (VB, VBA, C++ итд). Скрипты или программы, использующие функции сервера автоматизации, называются клиентами автоматизации.

Например, следующий скрипт (VBScript) открывает файл "D:\1.DOC" и сохраняет его в файле "D:\1.RTF".

'
' File AhDoc2RTF.vbs
'
' Etudes for Microsoft Word Programmers.
' Etude 3.3. Word as Automation Server.
'
' First published on http://www.transcriber.ru
'
' © 2000-2009. Evgeny Akhundzhanov. All rights reserved worldwide.
'
Set objWord = CreateObject("Word.Application")
objWord.Application.ChangeFileOpenDirectory "D:\"
objWord.Documents.Open "1.doc"
objWord.ActiveDocument.SaveAs "1.rtf", 6 ' wdFormatRTF
objWord.ActiveDocument.Close

Скрипт может быть запущен на выполнение непосредственно двойным щелчком из Проводника Windows или с помощью следующей командной строки -

cscript //nologo AhDoc2RTF.vbs

Соответствующий макрос на VBA выглядит следующим образом -

'
' File AhDoc2RTF.dot
'
' Etudes for Microsoft Word Programmers.
' Etude 3.3. Word as Automation Server.
'
' First published on http://www.transcriber.ru
'
' © 2000-2009. Evgeny Akhundzhanov. All rights reserved worldwide.
'
Sub AhDoc2RTF()
ChangeFileOpenDirectory "D:\"
Documents.Open FileName:="2.doc", ConfirmConversions:=False, ReadOnly:= _
False, AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:= _
"", Revert:=False, WritePasswordDocument:="", WritePasswordTemplate:="", _
Format:=wdOpenFormatAuto, XMLTransform:=""
ActiveDocument.SaveAs FileName:="2.rtf", FileFormat:=wdFormatRTF, _
LockComments:=False, Password:="", AddToRecentFiles:=True, WritePassword _
:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _
SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _
False
End Sub

 

Автоматизацию поддерживают все программы семейства Microsoft Office, Windows Media Player, а также Adobe Photoshop, Adobe InDesign и многие другие.

Со полным списком установленных на Вашем компьютере программ, поддерживающих автоматизацию, можно познакомиться выбрав пункт меню "Tools\References" главного меню редактора Visual Basic.

Краткий обзор проектов, использующих автоматизацию

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

Скриншот Проект

Контейнеры активных документов

Active Document Containers

Andrew Garbuzov, September 29, 1998.

Использование программ Microsoft Office в MFC программах

Using MS Office in MFC application

Igor Tkachev, May 15, 2000.

OLE Автоматизация с Microsoft Word

OLE Automation with MS Word

Anish C.V., February 15, 2002.

 

Автоматизация приложений Microsoft Office в примерах

Автоматизация приложений Microsoft Office в примерах

Наталия Елманова, 23 декабря 2005 года.

Прекрасная статья (на английском) на сайте Office Tips Мартина Грина, подробно описывающая как использовать стандартный элемент "Календарь" в своих проектах на VBA.

http://www.fontstuff.com/word/wordtut03a.htm.

См. также статью "Календарь Word" на сайте Антона Кокина WordExpert.

Система Live Documents (Web-enabling Microsoft Office) компании InstaColl.  

В требованиях к кандидатам, соискателям работы в компании InstaColl есть такая фраза

"Knowledge of office automation using VC++ is an advantage".

   

При желании по ключевым словам "ActiveX" или "OLE Automation" Вы легко найдете десятки других проектов, использующих OLE Automation.

 


Библиотеки типов Microsoft Word

В следующей таблице приведены имена файлов и расположение библиотеки типов для разных версий Microsoft Word.

Версия Word

Имя файла библиотеки типов

Папка

Word 97

MSWORD8.OLB

Давно это было...

Word 2000

MSWORD9.OLB

C:\Program Files\Microsoft Office\Office

Word XP

MSWORD10.OLB

C:\Program Files\Microsoft Office\OFFICE10

Word 2003

MSWORD11.OLB

C:\Program Files\Microsoft Office\OFFICE11

Word 2007

MSWORD12.OLB

C:\Program Files\Microsoft Office\OFFICE12

Создание прокси-классов C++ на основе библиотеки типов

Приведены скриншоты для Visual Studio 6.0

Используем ClassWizard для автоматической генерации новых классов на основе библиотеки типов. Выбираем закладку Automation, нажимаем кнопку "Add Class" и выбираем из выпадающего меню пункт "From a type library".

 

В диалоге "Import from type Library" выбираем библиотеку типов для установленной версии Microsoft Word. Для Microsoft Word 2000 она называется MSWORD9.OLB  и обычно расположена в папке "C:\Program Files\Microsoft Office\Office".

После нажатия кнопки "Open" появляется диалог "Confirm Classes", позволяющий выбрать нужные классы и имена для файла заголовка ("Header file") и файла реализации ("Implementation file").
Для простоты (но не для экономии памяти и размера исполняемой программы) выбираем все классы и нажимаем кнопку "OK".

 

Код реализации классов генерируется автоматически, соответствующие файлы автоматически добавляются в текущий проект Visual Studio. Как видно из приведенных ниже примеров исходных текстов, ClassWizard автоматически генерирует классы-обёртки, работающие с IDispatch интерфейсами объектов Microsoft Word.

Сравнивая снегерированные файлы "mswordXXX.h" (где XXX = 8,9,10,11,12) для разных версий Microsoft Word с помощью, например, утилиты windiff можно увидеть изменения объектной модели.

Файл объявлений "msword9.h"

Файл "MSWord9.h" содержит около 9000 строк. В качестве примера приведен код объявления класса _Application.

// Machine generated IDispatch wrapper class(es) created with ClassWizard
// _Application wrapper class
 
class _Application : public COleDispatchDriver
{
public:
      _Application() {}       // Calls COleDispatchDriver default constructor
      _Application(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {}
      _Application(const _Application& dispatchSrc) : COleDispatchDriver(dispatchSrc) {}
 
// Attributes
public:
 
// Operations
public:
      LPDISPATCH GetApplication();
      long GetCreator();
      LPDISPATCH GetParent();
      CString GetName();
      LPDISPATCH GetDocuments();
      LPDISPATCH GetWindows();
      LPDISPATCH GetActiveDocument();
      LPDISPATCH GetActiveWindow();
      LPDISPATCH GetSelection();
      LPDISPATCH GetWordBasic();
      LPDISPATCH GetRecentFiles();
      LPDISPATCH GetNormalTemplate();
      LPDISPATCH GetSystem();
      LPDISPATCH GetAutoCorrect();
      LPDISPATCH GetFontNames();
      LPDISPATCH GetLandscapeFontNames();
      LPDISPATCH GetPortraitFontNames();
      LPDISPATCH GetLanguages();
      LPDISPATCH GetAssistant();
      LPDISPATCH GetBrowser();
      LPDISPATCH GetFileConverters();
      LPDISPATCH GetMailingLabel();
      LPDISPATCH GetDialogs();
      LPDISPATCH GetCaptionLabels();
      LPDISPATCH GetAutoCaptions();
      LPDISPATCH GetAddIns();
      BOOL GetVisible();
      void SetVisible(BOOL bNewValue);
      CString GetVersion();
      BOOL GetScreenUpdating();
      void SetScreenUpdating(BOOL bNewValue);
      BOOL GetPrintPreview();
      void SetPrintPreview(BOOL bNewValue);
      LPDISPATCH GetTasks();
      BOOL GetDisplayStatusBar();
      void SetDisplayStatusBar(BOOL bNewValue);
      BOOL GetSpecialMode();
      long GetUsableWidth();
      long GetUsableHeight();
      BOOL GetMathCoprocessorAvailable();
      BOOL GetMouseAvailable();
      VARIANT GetInternational(long Index);
      CString GetBuild();
      BOOL GetCapsLock();
      BOOL GetNumLock();
      CString GetUserName_();
      void SetUserName(LPCTSTR lpszNewValue);
      CString GetUserInitials();
      void SetUserInitials(LPCTSTR lpszNewValue);
      CString GetUserAddress();
      void SetUserAddress(LPCTSTR lpszNewValue);
      LPDISPATCH GetMacroContainer();
      BOOL GetDisplayRecentFiles();
      void SetDisplayRecentFiles(BOOL bNewValue);
      LPDISPATCH GetCommandBars();
      LPDISPATCH GetSynonymInfo(LPCTSTR Word, VARIANT* LanguageID);
      LPDISPATCH GetVbe();
      CString GetDefaultSaveFormat();
      void SetDefaultSaveFormat(LPCTSTR lpszNewValue);
      LPDISPATCH GetListGalleries();
      CString GetActivePrinter();
      void SetActivePrinter(LPCTSTR lpszNewValue);
      LPDISPATCH GetTemplates();
      LPDISPATCH GetCustomizationContext();
      void SetCustomizationContext(LPDISPATCH newValue);
      LPDISPATCH GetKeyBindings();
      LPDISPATCH GetKeysBoundTo(long KeyCategory, LPCTSTR Command, VARIANT* CommandParameter);
      LPDISPATCH GetFindKey(long KeyCode, VARIANT* KeyCode2);
      CString GetCaption();
      void SetCaption(LPCTSTR lpszNewValue);
      CString GetPath();
      BOOL GetDisplayScrollBars();
      void SetDisplayScrollBars(BOOL bNewValue);
      CString GetStartupPath();
      void SetStartupPath(LPCTSTR lpszNewValue);
      long GetBackgroundSavingStatus();
      long GetBackgroundPrintingStatus();
      long GetLeft();
      void SetLeft(long nNewValue);
      long GetTop();
      void SetTop(long nNewValue);
      long GetWidth();
      void SetWidth(long nNewValue);
      long GetHeight();
      void SetHeight(long nNewValue);
      long GetWindowState();
      void SetWindowState(long nNewValue);
      BOOL GetDisplayAutoCompleteTips();
      void SetDisplayAutoCompleteTips(BOOL bNewValue);
      LPDISPATCH GetOptions();
      long GetDisplayAlerts();
      void SetDisplayAlerts(long nNewValue);
      LPDISPATCH GetCustomDictionaries();
      CString GetPathSeparator();
      void SetStatusBar(LPCTSTR lpszNewValue);
      BOOL GetMAPIAvailable();
      BOOL GetDisplayScreenTips();
      void SetDisplayScreenTips(BOOL bNewValue);
      long GetEnableCancelKey();
      void SetEnableCancelKey(long nNewValue);
      BOOL GetUserControl();
      LPDISPATCH GetFileSearch();
      long GetMailSystem();
      CString GetDefaultTableSeparator();
      void SetDefaultTableSeparator(LPCTSTR lpszNewValue);
      BOOL GetShowVisualBasicEditor();
      void SetShowVisualBasicEditor(BOOL bNewValue);
      CString GetBrowseExtraFileTypes();
      void SetBrowseExtraFileTypes(LPCTSTR lpszNewValue);
      BOOL GetIsObjectValid(LPDISPATCH Object);
      LPDISPATCH GetHangulHanjaDictionaries();
      LPDISPATCH GetMailMessage();
      BOOL GetFocusInMailHeader();
      void Quit(VARIANT* SaveChanges, VARIANT* OriginalFormat, VARIANT* RouteDocument);
      void ScreenRefresh();
      void LookupNameProperties(LPCTSTR Name);
      void SubstituteFont(LPCTSTR UnavailableFont, LPCTSTR SubstituteFont);
      BOOL Repeat(VARIANT* Times);
      void DDEExecute(long Channel, LPCTSTR Command);
      long DDEInitiate(LPCTSTR App, LPCTSTR Topic);
      void DDEPoke(long Channel, LPCTSTR Item, LPCTSTR Data);
      CString DDERequest(long Channel, LPCTSTR Item);
      void DDETerminate(long Channel);
      void DDETerminateAll();
      long BuildKeyCode(long Arg1, VARIANT* Arg2, VARIANT* Arg3, VARIANT* Arg4);
      CString KeyString(long KeyCode, VARIANT* KeyCode2);
      void OrganizerCopy(LPCTSTR Source, LPCTSTR Destination, LPCTSTR Name, long Object);
      void OrganizerDelete(LPCTSTR Source, LPCTSTR Name, long Object);
      void OrganizerRename(LPCTSTR Source, LPCTSTR Name, LPCTSTR NewName, long Object);
      // method 'AddAddress' not emitted because of invalid return type or parameter type
      CString GetAddress(VARIANT* Name, VARIANT* AddressProperties, VARIANT* UseAutoText, VARIANT* DisplaySelectDialog, VARIANT* SelectDialog, VARIANT* CheckNamesDialog, VARIANT* RecentAddressesChoice, VARIANT* UpdateRecentAddresses);
      BOOL CheckGrammar(LPCTSTR String);
      BOOL CheckSpelling(LPCTSTR Word, VARIANT* CustomDictionary, VARIANT* IgnoreUppercase, VARIANT* MainDictionary, VARIANT* CustomDictionary2, VARIANT* CustomDictionary3, VARIANT* CustomDictionary4, VARIANT* CustomDictionary5,
            VARIANT* CustomDictionary6, VARIANT* CustomDictionary7, VARIANT* CustomDictionary8, VARIANT* CustomDictionary9, VARIANT* CustomDictionary10);
      void ResetIgnoreAll();
      LPDISPATCH GetSpellingSuggestions(LPCTSTR Word, VARIANT* CustomDictionary, VARIANT* IgnoreUppercase, VARIANT* MainDictionary, VARIANT* SuggestionMode, VARIANT* CustomDictionary2, VARIANT* CustomDictionary3, VARIANT* CustomDictionary4,
            VARIANT* CustomDictionary5, VARIANT* CustomDictionary6, VARIANT* CustomDictionary7, VARIANT* CustomDictionary8, VARIANT* CustomDictionary9, VARIANT* CustomDictionary10);
      void GoBack();
      void Help(VARIANT* HelpType);
      void AutomaticChange();
      void ShowMe();
      void HelpTool();
      LPDISPATCH NewWindow();
      void ListCommands(BOOL ListAllCommands);
      void ShowClipboard();
      void OnTime(VARIANT* When, LPCTSTR Name, VARIANT* Tolerance);
      void NextLetter();
      short MountVolume(LPCTSTR Zone, LPCTSTR Server, LPCTSTR Volume, VARIANT* User, VARIANT* UserPassword, VARIANT* VolumePassword);
      CString CleanString(LPCTSTR String);
      void SendFax();
      void ChangeFileOpenDirectory(LPCTSTR Path);
      void GoForward();
      void Move(long Left, long Top);
      void Resize(long Width, long Height);
      float InchesToPoints(float Inches);
      float CentimetersToPoints(float Centimeters);
      float MillimetersToPoints(float Millimeters);
      float PicasToPoints(float Picas);
      float LinesToPoints(float Lines);
      float PointsToInches(float Points);
      float PointsToCentimeters(float Points);
      float PointsToMillimeters(float Points);
      float PointsToPicas(float Points);
      float PointsToLines(float Points);
      void Activate();
      float PointsToPixels(float Points, VARIANT* fVertical);
      float PixelsToPoints(float Pixels, VARIANT* fVertical);
      void KeyboardLatin();
      void KeyboardBidi();
      void ToggleKeyboard();
      long Keyboard(long LangId);
      CString ProductCode();
      LPDISPATCH DefaultWebOptions();
      void SetDefaultTheme(LPCTSTR Name, long DocumentType);
      CString GetDefaultTheme(long DocumentType);
      LPDISPATCH GetEmailOptions();
      long GetLanguage();
      LPDISPATCH GetCOMAddIns();
      BOOL GetCheckLanguage();
      void SetCheckLanguage(BOOL bNewValue);
      LPDISPATCH GetLanguageSettings();
      LPDISPATCH GetAnswerWizard();
      long GetFeatureInstall();
      void SetFeatureInstall(long nNewValue);
      void PrintOut(VARIANT* Background, VARIANT* Append, VARIANT* Range, VARIANT* OutputFileName, VARIANT* From, VARIANT* To, VARIANT* Item, VARIANT* Copies, VARIANT* Pages, VARIANT* PageType, VARIANT* PrintToFile, VARIANT* Collate,
            VARIANT* FileName, VARIANT* ActivePrinterMacGX, VARIANT* ManualDuplexPrint, VARIANT* PrintZoomColumn, VARIANT* PrintZoomRow, VARIANT* PrintZoomPaperWidth, VARIANT* PrintZoomPaperHeight);
      VARIANT Run(LPCTSTR MacroName, VARIANT* varg1, VARIANT* varg2, VARIANT* varg3, VARIANT* varg4, VARIANT* varg5, VARIANT* varg6, VARIANT* varg7, VARIANT* varg8, VARIANT* varg9, VARIANT* varg10, VARIANT* varg11, VARIANT* varg12, VARIANT* varg13,
            VARIANT* varg14, VARIANT* varg15, VARIANT* varg16, VARIANT* varg17, VARIANT* varg18, VARIANT* varg19, VARIANT* varg20, VARIANT* varg21, VARIANT* varg22, VARIANT* varg23, VARIANT* varg24, VARIANT* varg25, VARIANT* varg26, VARIANT* varg27,
            VARIANT* varg28, VARIANT* varg29, VARIANT* varg30);
};

Файл реализации "msword9.сpp"

Файл "MSWord9.cpp" содержит около 35 с половиной тысяч строк. В качестве примера приведен код определения нескольких функций класса _Application.

// Machine generated IDispatch wrapper class(es) created with ClassWizard
 
#include "stdafx.h"
#include "msword9.h"
 
LPDISPATCH _Application::GetApplication()
{
LPDISPATCH result;
InvokeHelper(0x3e8, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
return result;
}
 
long _Application::GetCreator()
{
long result;
InvokeHelper(0x3e9, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}
 
CString _Application::GetName()
{
CString result;
InvokeHelper(0x0, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
return result;
}
 
LPDISPATCH _Application::GetDocuments()
{
LPDISPATCH result;
InvokeHelper(0x6, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
return result;
}
 
LPDISPATCH _Application::GetActiveDocument()
{
LPDISPATCH result;
InvokeHelper(0x3, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
return result;
}
 
LPDISPATCH _Application::GetSelection()
{
LPDISPATCH result;
InvokeHelper(0x5, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
return result;
}
 
void _Application::SetScreenUpdating(BOOL bNewValue)
{
static BYTE parms[] = VTS_BOOL;
InvokeHelper(0x1a, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, bNewValue);
}

 
void _Application::HelpTool()
{
InvokeHelper(0x14c, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}
 
float _Application::InchesToPoints(float Inches)
{
float result;
static BYTE parms[] = VTS_R4;
InvokeHelper(0x172, DISPATCH_METHOD, VT_R4, (void*)&result, parms, Inches);
return result
;
}


Ресурсы

Утилита "WordCount.exe" и  "AhWordCount.dll", 203 Кб, формат ZIP,  [скачать].

Исходные тексты проекта WordCount [позже!].

Страница утилиты "WordCount".

Функциональная спецификация

Задача

Для ускорения набора часто повторяемых кусков текста обычно используется инструмент "Автотекст" (Autotext). При составлении словарей автотекста нужно иметь список слов, которые используются найболее часто.

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

Назначение

Программа "WordCount.exe" предназначена для подсчёта частоты использования слов или стилей в выбранном документе Microsoft Word либо во всех документах выбранной папки. Полученная информация может быть использована при составлении словарей автотекста и таблиц используемых стилей.

Программа использует Microsoft Word как сервер автоматизации. Для работы программы необходимо, чтобы на компьютере пользователя был установлен Microsoft Word.

Краткое описание

Главное окно программы "WordCount.exe" в режиме выбора документа имеет следующий вид:

Главное окно программы "WordCount.exe" в режиме выбора папки имеет следующий вид:

Кнопка "Browse" позволяет выбрать требуемый документ или папку в зависимости от выбранного режима. Кнопка "Run" запускает процесс сбора статистики, по окончании которого появляется диалог "Words Statistics" или "Styles Statistics".

Диалог "Words/Styles Statistics" позволяет сохранить полученные результаты в файле формата XML.

Пример выходного файла формата XML (Слова)

  <?xml version="1.0" encoding="UTF-8" ?>
<!--
Created by AhWordCount.dll. Time = May 14, 2007. 16:03:01
  -->
<!--
© 2000-2007. Evgeny Akhundzhanov. All rights reserved worldwide.
  -->
<!--
See details on "C++ Etudes" page on http://www.transcriber.ru
  -->
<!--
Words Statistics
  -->
<!--
WordCount.exe reports:
  -->
- <Document>
  <FilePath>Pokonos.doc</FilePath>
- <Words>
  <Word Name="Pocono" Count="18" />
  <Word Name="Poconos" Count="17" />
  <Word Name="Stroudsburg" Count="13" />
  <Word Name="through" Count="10" />
  <Word Name="Delaware" Count="10" />
  <Word Name="shops" Count="9" />
  <Word Name="summer" Count="9" />
  <Word Name="local" Count="8" />
  <Word Name="their" Count="8" />
  <Word Name="around" Count="7" />
  <Word Name="River" Count="7" />
  <Word Name="great" Count="7" />
  <Word Name="music" Count="7" />
  <Word Name="place" Count="7" />
  <Word Name="there" Count="7" />
  <Word Name="Mountain" Count="6" />
  <Word Name="There" Count="6" />
  <Word Name="Shawnee" Count="6" />
  <Word Name="Street" Count="6" />
  <Word Name="fishing" Count="6" />
  <Word Name="cooking" Count="5" />
  <Word Name="dancing" Count="5" />
  <Word Name="favorite" Count="5" />
  <Word Name="Festival" Count="5" />
  <Word Name="foliage" Count="5" />
  <Word Name="Mount" Count="5" />
  <Word Name="Pennsylvania" Count="5" />
  <Word Name="Tannersville" Count="5" />
  <Word Name="people" Count="5" />
  <Word Name="Victorian" Count="5" />
  <Word Name="popular" Count="5" />
  <Word Name="region" Count="5" />
  <Word Name="rides" Count="5" />
  <Word Name="Water" Count="5" />
  <Word Name="small" Count="5" />
  <Word Name="average" Count="5" />
  <Word Name="bands" Count="5" />
  <Word Name="Creek" Count="5" />
  <Word Name="can't" Count="5" />
  </Words>
  </Document>

Пример выходного файла формата XML для стилей можно посмотреть на странице утилиты "WordCount".

Эксперименты показали, что программа тратит примерно 0.12 секунды на обработку одного объекта. Точнее, документ, содержащий 3160 слов был обработан за 365 секунд.

Следует иметь в виду, что сбор статистики может продолжаться несколько минут.

Начните экспериментировать с небольших документов.

Выводы

В этом этюде мы познакомились с автоматизацией (OLE Automation) и созданием классов C++ на основе библиотеки типов сервера автоматизации.

Создана программа "WordCount.exe" для подсчета статистики слов или стилей в выбранном документе или во всех документах выбранной папки. Программа использует Microsoft Word как сервер автоматизации. Полученную статистику можно использовать, например, при составлении словарей автотекста.

Задания

Задание 1

                   При первом появлении HTML эта технология была фантастически неформальной, нечеткой и либеральной.
Помню, еще в 1995 году руководитель проекта Microsoft Office презрительно говорил, что HTML никогда не будет иметь успеха из-за своей примитивности, а Word победит, потому что документы Word так богаты возможностями, а их структура полностью формализована.
 

Адам Босуорт. Доклад на ICSO04.
Из книги Джоэла Х. Спольски "Лучшие примеры разработки ПО". СПб.: Питер, 2007. 208 с.

 

Документы Microsoft Word (файлы с расширением ".DOC") могут быть открыты только с помощью Microsoft Word.

Формат документов Microsoft Word очень сложен. Описание формата ".DOC" в настоящее время открыто, но от этого не легче, так как сложность внутреннего устройства документов, в некотором смысле, отражает более чем двадцатилеьнюю историю создания всех версий Microsoft Word.

См., например, что пишет по этому поводу Джоэл Спольски в статье Why are the Microsoft Office file formats so complicated? (Русский перевод - Почему форматы Microsoft Office такие сложные?)

На мой взгляд, Microsoft опоздала с переходом на открытый формат документов лет на пятнадцать.

 

В настоящее время, в связи с появлением переносных винчестеров и флэшек формата USB, все больше людей в прямом смысле носят свои данные с собой. При этом гигабайты на сменных носителях все время дешевеют.

Необходимость чтения документов может возникнуть в Интернет-кафе, в отпуске или в гостях у друга. При этом вы можете получить в пользование компьютер не только без Microsoft Word, но и без Windows (операционные системы типа Mac OS X или Linux становятся все более популярными).

Эта же проблема в полной мере относится к данным, сохраненным на CD или DVD дисках.

В силу сказанного выше актуальной становится задача конвертации или переконвертации старых документов формата DOC в какой-нибудь открытый формат типа RTF, с которым можно работать в бесплатном редакторе WordPad, или в HTML, который можно читать в любом браузере на компьютере с любой операционной системой.

Напишите программу или макрос, которая рекурсивно перебирает все документы формата DOC в указанной папке и конвертирует их в любой открытый формат (RTF, HTML, или XML).

См. также страницу, посвященную утилите AhDocResaver [позже!].

 

 

Задание 2

Можно ли подсчитать статистику слов в документе с помощью скрипта? Попробуйте написать соответствующий скрипт.

 

Задание 3

С технологией OLE кроме словосочетания "OLE Automation" обычно ассоциируется и словосочетание "OLE Linking and Embedding" (связывание и встраивание объектов). Изучите, например, возможности пункта меню Microsoft Word "Insert\Object".

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

Как Вы думаете, почему издательства не хотят принимать рукописи, в которые рисунки вставлены "по связям"?

 

Задание 4

Придумайте несколько критериев сравнения форматов составных документов и технологии работы с ними, добавьте их в приведенную ниже таблицу. Заполните таблицу сравнения OLE и HTML. При необходимости добавьте столбики для других технологий.

Критерий OLE HTML
Распространенность    
Используемый софт    
Сложность освоения    
Ваш критерий 1    
Ваш критерий 2    
Ваш критерий 3    

 

 


Этюды для программистов Microsoft Word. Этюд 3.3. Microsoft Word как сервер автоматизации.

 


© 2000-2009 Евгений Ахунджанов, Все Права Сохранены.
www.transcriber.ru | Послать письмо автору