Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Форматирование документа Word  (Прочитано 29971 раз)
0 Пользователей и 1 Гость смотрят эту тему.
maod
Гость
« : 15-02-2006 16:10 » 

Подскажите пожалуйста как реализовать такую вещь ,
как сделать так чтоб нужный текст в ворде отделялся от ненужного и записывался в другой файл!
Например редактируем текст, к нужному применяем выделение цветом например
зеленым, после запускаем свою программу жмем кнопку и она выделенное собирает в новом файле .
Помогите очень надо.  RTFM
Записан
Alf
Гость
« Ответ #1 : 15-02-2006 18:28 » 

Я бы воспользовался одним из двух способов.

1. Написать макрос на Visual Basic for Application, встроенном в Word. Для записи  в файл можно воспользоваться обектом COM TextStream (библиотека Microsoft Scripting Runtime).

2. Написать отдельное приложение, которое будет управлять Word'ом через OLE Automation.

Выбирай на вкус, оба подхода работают.
« Последнее редактирование: 20-12-2007 16:15 от Алексей1153++ » Записан
maod
Гость
« Ответ #2 : 15-02-2006 20:48 » 

Alf
Дело втом что я невладею ни Visual Basic for Application ни VB.
Я только недавно начал его самостоятельно изучать. А тут такая необходимость в такой программке даже незнаю с чего начать и как  все это реализовать.  :-/Может если тебе нетрудно поможеш исходноком буду очень благодарен.С меня пиво  Отлично
Записан
Alf
Гость
« Ответ #3 : 15-02-2006 22:40 » 

По нынешней погоде только пиво возить из Краснодара в Ростов Улыбаюсь
Тут в пределах города не проберешься...

Проясни ситуацию, чего хочешь достичь: научиться писать приложения по работе с текстами или просто получить готовую программу, не вникая в суть? И каким образом планируешь выделять? Если, скажем, зеленым цветом, нужна гарантия, что такой цвет не встретится в самом тексте, до выделения.

И еще. После того, как выделенный текст выписан в файл, он должен оставаться в исходном документе или его следует удалить?
Записан
maod
Гость
« Ответ #4 : 16-02-2006 09:38 » 

ALF
По нынешней погоде только пиво возить из Краснодара в Ростов Улыбаюсь
Тут в пределах города не проберешься...

Если в Ростов пиво возить то далековато, а в Краснодарском крае то я на лыжах домчу !!!! Ага)) Шутка.

А если конкретно то я научиться писать приложения по работе с текстами. Но я неразу еще ничего не писал. Но у меня натура дотошная  я буду код разбирать пока невъеду. Насчет выделения цветом то я думаю можно остановиться на конкретном пусть будет зеленый, а если он попадется в тексте то его легко
исправить на нужный.
П осле форматирования оригинал остается прежним, а готовый отформатированный сохраняется в новом файле.
Записан
Alf
Гость
« Ответ #5 : 16-02-2006 12:13 » 

Тогда я сделаю кое-какие наметки и выложу здесь, а потом обсудим.
Записан
Alf
Гость
« Ответ #6 : 16-02-2006 21:48 » 

Вот набросал макрос на VBA.

Код:
Public Sub ProcessDocument()
Dim fso As New FileSystemObject
Dim ts As TextStream
Dim i As Long
Dim cl As WdColor
Dim chars As Characters
    cl = wdColorGreen
    Set chars = Application.ActiveDocument.Characters
    Set ts = fso.OpenTextFile("c:\GetFromWord.txt", ForWriting, True)
    i = 1
    While (i <= chars.Count - 1)
        While (i <= chars.Count - 1) And (chars(i).Font.Color <> cl)
            i = i + 1
        Wend
        While (i <= chars.Count - 1) And (chars(i).Font.Color = cl)
            ts.Write chars(i)
            i = i + 1
        Wend
        ts.WriteLine
    Wend
    ts.Close
End Sub

Особо с ним не заморачивался. Пишет всегда в один и тот же файл фрагменты текста, выделенные в документе зеленым цветом. Но принцип понять сможешь, а там и улучшишь до нужной степени уже самостоятельно.

Макрос не обрабатывает последнюю литеру, поскольку, как оказалось, VBA вычисляет логические функции полностью, даже если это не требуется. Для упрощения пожертвовал последней литерой. Надеюсь, потеря не столь велика.
Записан
maod
Гость
« Ответ #7 : 17-02-2006 11:55 » 

Alf 
 
Круто ,но  можно поподробнее объяснить как все это дело вставить в ворд и заставить работать.
Как я говорил я никогда ничего на писал в смысле программ макросов и так далее
я конкретно сидел на видео оцифровка сжатие делаю свадьбы и так далее все в этом духе.
А тут вдруг решил попробовать себя в сфере программирования. Но как выяснилось в этой сфере мои ручонки корявые мягко сказано, но буду их потихоньку выпрямлять. (Это я к тому чтоб ты понял мои познания в программировании)
А теперь к теме я запустил ворд меню сервис макрос создать в редакторе вставляю твой код сохраняю
затем в тексте выделяю нужное зеленым запускаю макрос через меню сервис но наработает чета ругается.
Наверное я чего-то неправильно сделал , если нетрудно объясни как сделать правильно.
Записан
Alf
Гость
« Ответ #8 : 17-02-2006 12:07 » 

запускаю макрос через меню сервис но наработает чета ругается.
Наверное я чего-то неправильно сделал , если нетрудно объясни как сделать правильно.

Трудно, потому как ошибку "чета ругается" сложно диагностировать. Приведи сообщение дословно. Не помешает также скриншот в момент ошибки. Покажи также скриншот редактора NBA.
Записан
maod
Гость
« Ответ #9 : 17-02-2006 17:00 » 

 Alf
Извини наверное я тебя дастал
вот
Записан
maod
Гость
« Ответ #10 : 17-02-2006 17:05 » 

Что-то не получается вставить скрин,вот
ошибка которая получается при компиляции
User-defined type not defined
Записан
Alf
Гость
« Ответ #11 : 17-02-2006 22:49 » 

Давай сделаем так.
Я выкладываю файл с работающим макросом.
Ты попробуешь его выполнить у себя.
Если что-то не получается, сообщи,какие ошибки возникли. Если все нормально, попытайся проделать то же самое со своими документами.

* Урок 4.doc (76 Кб - загружено 1661 раз.)
Записан
maod
Гость
« Ответ #12 : 18-02-2006 16:11 » 

 Alf
Странно но и в твоем документе наработает таже ошибка.
У меня стоит офис 2003 SP1  проблем с ним небыло система ВЫНЬ XP SP2 тоже вроде неглючит, вот вылаживаю рисунок с ошибкой.

* ошибка.GIF (10.75 Кб - загружено 1070 раз.)
Записан
Alf
Гость
« Ответ #13 : 18-02-2006 18:22 » 

Это уже ближе к делу.

Проверь для начала, есть ли у тебя файл C:\Windows\system32\scrrun.dll

В этой библиотеке находятся объекты для работы с файловой системой - FileSystemObject и TextStream. Если ее нет в системе, сначала придется установить.
Записан
maod
Гость
« Ответ #14 : 18-02-2006 19:38 » 

Alf

Нашел библиотеку подключил все заработало, но тормаза страшные, а более менее больших файлах вообще зависает.
А так все работает Alf огромное тебе спасибо!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #15 : 18-02-2006 19:42 » 

 а обязательно писать в текстовый (плоский) файл? в новый вордовский документ нельзя?
« Последнее редактирование: 18-02-2006 19:44 от PooH » Записан

Удачного всем кодинга! -=x[PooH]x=-
Alf
Гость
« Ответ #16 : 18-02-2006 20:28 » 

Alf

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

Увы, OLE Automation штука вообще гибкая, но не слишком быстрая, а в сочетании со скриптовыми языками - и вовсе тормоз. Именно по этой причине редко можно найти серьезные приложения на основе MS Word, Excel и Access - функциональность кое-какая присутствует, а вот производительность никакая. Хотя для разовых задач годится, конечно.

Единственное, что радует, - это то, что копировать вручную через буфер обмена пришлось бы еще гораздо дольше.

А так все работает Alf огромное тебе спасибо!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Хорошо. А с принципом разобрался, комментарии не нужны?
Записан
maod
Гость
« Ответ #17 : 18-02-2006 20:52 » 

Alf

Извини за нахальство, а можно все это реализовать в VB6. Может там будет работать побыстрее! Плизззззззззззззззззззззз.Улыбаюсь))))))

PooH
Можно и в вордовский поменяй расширение на *.doc  в коде макроса
Записан
Alf
Гость
« Ответ #18 : 18-02-2006 21:14 » 

Alf

Извини за нахальство, а можно все это реализовать в VB6.


Можно, причем практически ничего менять не придется. VB6 и VBA - близнецы-братья, совместимость очень высокая.

Может там будет работать побыстрее! Плизззззззззззззззззззззз.Улыбаюсь))))))

Увы, не будет. Побуквенное чтение из Word - чрезвычайно медленная операция, на моем P4-1800 дает порядка 10 литер (не литров!  Ага ) в секунду. Я делал подобные приложения на C#, скорость не возрастала совершенно. Word грузит процессор на 100%, причем время от времени программа останавливается надолго, кажется, что она зависает, но потом столь же неторопливо движется дальше.

Я думаю, ускорить программу можно, если добавить ограничения. Если, например, выделять целиком слова, тогда можно будет читать текст пословно, а не побуквенно, это должно ускорить дело. Если выделять целые абзацы - дело пойдет еще быстрее, чем перебор по одной буквочке.

PooH
Можно и в вордовский поменяй расширение на *.doc  в коде макроса

Так не пойдет, таким образом ты всего лишь поменяешь расширение имени файла, а формат его не изменится. Нужно создать средствами VBA новый документ и выписывать выделенные фрагменты в него вместо текстового файла.
Записан
maod
Гость
« Ответ #19 : 19-02-2006 13:30 » 

Я думаю, ускорить программу можно, если добавить ограничения. Если, например, выделять целиком слова, тогда можно будет читать текст пословно, а не побуквенно, это должно ускорить дело. Если выделять целые абзацы - дело пойдет еще быстрее, чем перебор по одной буквочке.

Alf
Скажи а как внести эти ограничения в код. Ты пробовал так делать.
Записан
RomCom
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #20 : 19-02-2006 14:46 » 

Мне кажетси если воспользоваться функцией поиска дело быстрей пойдет.
вот кусок кода для поиска по цвету.
Код:
    Selection.Find.ClearFormatting
    Selection.Find.Font.Color = wdColorGreen
    With Selection.Find
        .Text = ""
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute
т.е. выделяем (через поиск), копируем, дальше ищем.
Записан

R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
RomCom
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #21 : 20-02-2006 02:20 » 

Предлогаю такой вариант чарез VBA:
Код:
Sub КопированиеЦвета()
 Dim rng As Range, newdoc As Document
 Set rng = ActiveDocument.Content
 Set newdoc = Documents.Add(DocumentType:=wdNewBlankDocument)
 With rng.Find
    .ClearFormatting
    .Text = ""
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindContinue
    .Format = True
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
    .Font.Color = wdColorSeaGreen 'цвет Изумрудный
  While .Execute
    If .Found Then
        newdoc.Activate
        Selection.EndKey Unit:=wdStory
        Selection.TypeParagraph 'добавляем новый параграф, чтоб не склеилось :)
        Selection.TypeText Text:=rng.Text
        rng.Delete
    End If
  Wend
 End With
End Sub
Проверил, вродебы быстренько так деится  Улыбаюсь
« Последнее редактирование: 20-12-2007 16:17 от Алексей1153++ » Записан

R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
maod
Гость
« Ответ #22 : 21-02-2006 10:43 » 

RomCom
Да действительно работает очень быстро. А я тут реализовал это дело в батике тоже недурно получилось.
А вооще тебе и ALF большое  спасибо что помогли. Хороший форум обязательно буду заглядывать. Пока !!!!
Записан
Oxotnik
Гость
« Ответ #23 : 15-02-2009 12:10 » new

А код написанный выше с тексток какого цвета работает???
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines