Працюємо з ms word - статистика документів

Це було основне, що треба знати. Ну а тепер по порядку.

Помістивши на форму згадані компоненти, бачимо, що властивостей і методів у них зовсім мало. В першу чергу слід визначитися з методом ConnectKind компонента WordApplication. Воно може приймати різні значення, але ми залишимо присвоюються за замовчуванням значення ckRunningOrNew. Це означає, що з'єднання відбувається з вже працюючим сервером, при його відсутності запускається новий. Як правило, це цілком влаштовує.

Насамперед відкриємо документ. Попередньо треба оголосити змінну FileName, вона буде типу OleVariant, якій дамо рядок з ім'ям файлу.

Оголосивши потрібну кількість змінних типу LongInt (в дуже великому файлі або при підсумовуванні по декількох документах в принципі може виявитися більше знаків, ніж межі звичайного цілого типу), можемо вже і приступати до підрахунку. Наприклад, порахуємо число слів, знаків з пробілами і без пробілів звичайного тексту, а також кількість сторінок в документі. Результати збережемо відповідно в "довгих" змінних WCount, SCount, CCount, і PCount. Відкривши потрібний документ в Word'е і викликавши діалог підрахунку статистики, неважко побачити, що значення змінних рівні параметрами вордівських статистики зі скинутим прапорцем "Враховувати всі виноски".

Посилання у документах можуть бути звичайні і кінцеві. Тобто якщо перші розташовуються внизу цієї сторінки, то кінцеві - строго в кінці документа. Крім того, вони можуть відрізнятися і нумерацією - автоматичною або заданої користувачем. Почнемо зі звичайних виносок як з самого простого. У термінології об'єктної моделі Word - Footnotes. Спочатку треба обчислити кількість самих виносок: Підрахунок статистики тексту в виносці проводиться так: Тут ifoot - ціле число, "Нумер" виноску. Для того, щоб врахувати самі номери виносок, зробимо так: Це ми порахували для прикладу кількість слів у виносці з номером ifoot і її мітці - при користувальницької нумерації в якості "номери" може бути ціле речення. Далі починаємо перебирати їх одну за одною. При цьому слід врахувати, що крім статистики виносок необхідно отримати і статистику їх "номерів". Тобто:

Додаток одиниці з'являється від того, що сума статистики виносок і номерів не збігається з тим, що видає вбудована статистика Word. Між номером виноски і текстом виноски Word ставить пробіл, який чомусь не враховується. Умовний оператор визначає, як пронумерована дана виноска - за умовчанням чи ні. В останньому випадку слід перевірити кількість слів у позначенні виноски. Така схема дає результат, що співпадає з показаннями вбудованої статистики. Крім того, цикл у нас йде від 1 - так починається нумерація виносок в MS Word, та й практично всіх інших об'єктів теж.

Тепер перейдемо до кінцевим виноска. Теоретично все те ж саме, тільки замість слова "Footnotes" пишемо "Endnotes". І тут натрапляємо на сюрприз - чомусь вона вважає неточно. Я в даному випадку поступив так: зберігаю документ під іншим ім'ям, переконвертує кінцеві зноски в звичайні і далі все, як сказано вище. Збереження документа: де в дужках стоять два параметри типу OleVariant - ім'я файлу і шістнадцяткова константа, що задає формат файлу. Деякі константи:

Ну, а тепер, власне, можемо повернутися до виноска. Конвертація кінцеві виноски в звичайні відбувається так:

Тепер ми маємо документ, в якому містяться тільки звичайні виноски. З ними ніяких проблем не виникає, приклад, як з ними працювати, див. Вище. Якщо цікавить статистика окремо різних типів виносок, вважаємо попередньо статистику звичайних виносок, зберігаємо її в "буферних" змінних і вважаємо ще раз після конвертації. Різниця дасть статистику кінцевих виносок окремо. Склавши статистику виносок і простого тексту, отримуємо статистику документа з урахуванням виносок так, як її дає сам Word.

Тут за традицією кілька покритикуємо Microsoft. Як виявилося, Word показує не всі, що міститься в документі. Не приймаються в розрахунок колонтитули. А адже в них може міститися неабиякий шматок тексту, особливо у довідках, бланках і т.п. Виявляється, Word їх насправді вважає, але нам не показує. Ось і подивимося, як же його можна змусити це зробити.

Колонтитули в документі тісно пов'язані з дещо загадковою штукою під назвою "розділи" - Sections. Кожен розділ може мати верхні та нижні колонтитули. Тому в першу чергу визначаємо кількість абзаців.

Тут у нас цілі змінні isectct. icofct. icohct позначають відповідно кількість розділів як таких, кількість нижніх і верхніх колонтитулів даного розділу. Мінлива isec служить "номером" розділу, змінні icof. icoh "нумерують" відповідно нижні і верхні колонтитули в межах даного розділу. Кількість колонтитулів в розділі визначаємо так: Тепер вже можемо "дістати" текст з заголовка: В даному випадку ми для прикладу порахували число слів, що містяться в нижньому колонтитулі під номером icof. що належить розділу під номером isec. Тепер можемо написати "подвійний" цикл для підрахунку статистики колонтитулів. Повністю це буде виглядати так: В змінних, до яких на кожному кроці додаються результати статистики, після перебору всіх розділів накопичиться сумарна статистика слів, знаків з пробілами і знаків без пробілів у всіх колонтитулах.

Часто використовуються для малювання схемок текстові вставки з панелі малювання також представляють інтерес. Сам Word формально вважає їх "картинками", що не мають ніякої статистики - мабуть, за географічним розташуванням в панелі інструментів. В об'єктній моделі - Shapes. Ось тут починається найцікавіше. По-перше, все, що знаходиться на панелі малювання, є Shapes. Тобто в принципі для Word'а все одно, текстова вставка, об'єкт WordArt або геометрична фігура. Разом з тим виглядає досить нелогічно, що цей самий Shape можна переконвертувати, на вибір, у Frame або InlineShape. Вони вже мають статистикою, так що, здавалося б, все в порядку. Але підступності Microsoft, здається, взагалі немає межі. По-перше з подивом виявляємо, що Shapes нумеруються індексом типу OleVariant. Що з ним далі робити, неясно. Якщо просто привласнювати індексом ціле число, при конвертації кожного другого Shape під Frame отримуємо помилку. А якщо обробити виняток, то будемо таки мати статистику половини вставок. Мабуть, є якісь тонкощі з парними і непарними індексами. По-друге, InlineShape штука і зовсім загадкова. Ніяких помилок при конвертації не виникало, але і кількість InlineShapes незмінно виявлялося нульовим. Підрахувати статистику вставок вдалося тільки зберігши файл як RTF і розколупавши його код, але це варто описати окремо. Наводився же останній абзац в надії, що хтось з таким стикався і знайшов спосіб роботи з Shapes "вбудованими" способами.

Ну, ось практично і все. Підсумовуючи все, що ми отримали, маємо статистику документа навіть точніше вбудованої. Ще пара зауважень. Перед підрахунком Word варто "заховати", щоб він не маячила на екрані: При підрахунку статистики, особливо якщо в документі міститься щось крім простого тексту, вважається, що в файл внесені зміни. Тому наостанок зберігаємо і закриваємо документ: Ну і, звичайно, робимо сервера Word Disconnect. коли він стане нам уже не потрібний.

А тепер попередження тим, хто зацікавився цим питанням і хоче поекспериментувати сам. Офіс занадто тісно пов'язаний з Windows, тому на збої в його роботі система реагує вкрай гостро. При налагодженні програм підрахунку статистики у мене після помилки часто з'являвся "блакитний екран". Те ж саме відбувалося, якщо після розбору RTF - файлу в пошуках Shapes і перетворення їх в звичайний текст в Word завантажувався неправильно "зібраний" файл. Так що дуже рекомендується попередньо зберегти важливі дані або поставити систему надійніше. У мене стоїть WindowsXP, який до таких збоїв виявився нечутливий. Крім того, поки наведене тут не було налагоджено, після помилок частенько летів сам офіс. Так що майте під рукою дистрибутив для запуску діагностики офісу і усунення пошкоджень.