Давно известно, что автоматизировать линейку ms office будет только последний мудак (разрешите представиться :) ), но иногда все же надо...
Мне было жутко необходимо в одном ruby-проекте при составлении отчета вставлять заголовки и тест. Заголовки конечно же надо было как то выделить.
win32ole предоставляет для этого средства, но к сожалению это применить можно только к объекту range, символу параграфуи.т.п. (подробнее тут
http://rubyonwindows.blogspot.com/2007/06/automating-word-with-ruby-formatting.html). А хотелось, что бы форматирование применялось к вновь вставляемому тексту.
(update: как оказалось можно, см. 3 пост)Для того пришлось сделать финт ушами: наставлять закладок типа:
заголовк1
текст1
....
заголовок2
текст2
...
А потом бежать по ним. Только вставить их надо было достаточное количество.
А потом просто удалить те закладки, которые не пригодились.
Вот так:
erase_range_bookmarks(first_unused_bookmarks,
last_unused_bookmarks)
def erase_range_bookmarks(bookmark_start, bookmark_end)
return unless @document.Bookmarks.Exists(bookmark_start) ||
@document.Bookmarks.Exists(bookmark_end)
range = @document.Range(bookmark_at(bookmark_start).End,
bookmark_at(bookmark_end).End)
range.Text = ""
end
def bookmark_at(bookmark_name)
raise TemplateErrorException, "Unknown bookmark: \
#{bookmark_name}" unless @document.Bookmarks.Exists(bookmark_name)
@document.Bookmarks(bookmark_name)
end
PS: такой подход позволяет определять стиль текста, человеку составляющему шаблон, а не забивать его жестко в код.
Ну а кому такой универсальности не надо, может использовать так
@document.Bookmarks("name_bookmark").Range.Text = "Hi, Jack!"
@document.Range(document.Bookmarks("name_bookmark").End,
document.Bookmarks("name_bookmark").End +
"Hi, Jack!".length).Font.Size =18
Остальные возможности форматирования текста смотрите в блоге по выше обозначенное ссылке.