Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Прочитать Word и обработать. / 25 сообщений из 36, страница 1 из 2
20.01.2011, 20:09
    #37070126
yanyariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать Word и обработать.
Тут вот пришлось вордом заняться, причем срочно. А знаю его где-то на 2%. Или меньше. Я то VB.Net изучать пытаюсь.
Мне нужно программно прочитать текст в вордовском документе, построчно.
Чувствую,что нужно Range нужно применить. Но как?
И еще, в читаемых строках имеются формулы. То есть читать в строковые переменные не получиться. Во что читать такие строки?
Подскажите пожалуйста, как это делается.
...
Рейтинг: 0 / 0
20.01.2011, 20:26
    #37070146
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать Word и обработать.
1) В ворде нет строк. Текст делится на параграфы, параграфы на предложения, предложения на слова. Для каждого из них можно получить объект Range.
2) Офисный редактор формул - черный ящик без дверцы. С ним ничего нельзя сделать программно.
...
Рейтинг: 0 / 0
20.01.2011, 20:57
    #37070201
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать Word и обработать.
Antonariy1) В ворде нет строк. Текст делится на параграфы, параграфы на предложения, предложения на слова. Для каждого из них можно получить объект Range
Эх. Опровергать Антонария приятно, но страшно

Покопался в хелпе, сделал построчное чтение:
Код: plaintext
1.
2.
3.
4.
5.
Dim i As Integer
For i =  1  To  5 
  Selection.MoveEnd wdLine,  1 
  Debug.Print Selection
  Selection.GoToNext wdGoToLine
Next
Проходит только с объектом Selection, на переменную типа Range не действует

Но надо понимать, что строка в ворде все же понятие виртуальное, и зависит даже от разрешения принтера.
...
Рейтинг: 0 / 0
20.01.2011, 22:38
    #37070313
yanyariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать Word и обработать.
Antonariy2) Офисный редактор формул - черный ящик без дверцы. С ним ничего нельзя сделать программно.

Все, что мне нужно сделать с этим черным ящиком - выделить его из строки, потом вставить его в другую строку. Это возможно?
...
Рейтинг: 0 / 0
20.01.2011, 22:39
    #37070316
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать Word и обработать.
yanyariy,

нет
...
Рейтинг: 0 / 0
20.01.2011, 23:02
    #37070327
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать Word и обработать.
Впрочем, можно расковырять docx - там формулы присутствуют в виде xl\drawings\vmlDrawing1.vml (текст) и xl\media\image1.emf (картинка).
...
Рейтинг: 0 / 0
20.01.2011, 23:03
    #37070329
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать Word и обработать.
Antonariyxl\На экселе проверял.
...
Рейтинг: 0 / 0
21.01.2011, 12:05
    #37070994
yanyariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать Word и обработать.
Неужели нельзя удалить из строки все буквы, что бы осталась только формула? Ведь формула - это объект Microsoft Equation 3.0
раз это объект, его как то можно найти, определить, скопировать, перенести. Произвести какие то действия. Но как?
Как то не хочется верить, что это невозможно.
...
Рейтинг: 0 / 0
21.01.2011, 12:11
    #37071012
yanyariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать Word и обработать.
Antonariy1) В ворде нет строк. Текст делится на параграфы, параграфы на предложения, предложения на слова. Для каждого из них можно получить объект Range.

Теперь совсем тупой вопрос: параграф это от одного знака перевода строки до второго?
Пожалуйста, дайте пример кода последовательного получения параграфов в объект Range.
...
Рейтинг: 0 / 0
21.01.2011, 12:37
    #37071085
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать Word и обработать.
yanyariyскопировать, перенестиА ведь да, это можно. Саму коробку хоть по полу катай))
yanyariyНо как?Начать запись макроса, вставить формулу, поиграться с ней, окончить запись, посмотреть результат.
yanyariyТеперь совсем тупой вопрос: параграф это от одного знака перевода строки до второго?Скорее всего да.
yanyariyПожалуйста, дайте пример кода последовательного получения параграфов в объект Range.
Код: plaintext
1.
2.
For Each p in ThisDocument.Paragraphs
    Set r = p.Range
Next
...
Рейтинг: 0 / 0
21.01.2011, 13:18
    #37071211
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать Word и обработать.
AntonariyyanyariyТеперь совсем тупой вопрос: параграф это от одного знака перевода строки до второго?Скорее всего да.
НЕТ!!!

Параграф (а точнее Paragraph, а в русском офисе - абзац) - это от одного знака конца абзаца до другого!!!
...
Рейтинг: 0 / 0
21.01.2011, 13:19
    #37071215
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать Word и обработать.
Так что автору надо определиться, что ему надо - построчное чтение (см. мой пример) или поабзацное чтение (см. пример Антонария)
...
Рейтинг: 0 / 0
21.01.2011, 13:51
    #37071347
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать Word и обработать.
Со строками ситуация несколько неоднозначная. :) Нужно различать "типографские" (назову их так) строки и строка электронного текста. Типографская строка это участок текста от левого края страницы до правого, а электронная — до перевода каретки или line feed или обоих вместе. Пример Shoker.Pro оперирует типографскими строками.

Shocker.ProПараграф (а точнее Paragraph, а в русском офисе - абзац) - это от одного знака конца абзаца до другого!!! Это в теории, а на практике каждый перевод строки энтером означает новый абзац. Мягкий перенос shift+enter в рамках абзаца в тексте представлен символом с кодом 11 (vbVerticalTab), который вроде бы никогда не считался разделителем строк. Или считался?
...
Рейтинг: 0 / 0
21.01.2011, 14:04
    #37071387
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать Word и обработать.
То есть автору нужно быть внимательным: то, что выглядит как несколько строк в ворде, может быть одной строкой в рамках правил например fso.TextStream при использовании ReadLine.
...
Рейтинг: 0 / 0
21.01.2011, 14:05
    #37071388
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать Word и обработать.
AntonariyСМягкий перенос shift+enter в рамках абзаца в тексте представлен символом с кодом 11 (vbVerticalTab), который вроде бы никогда не считался разделителем строк. Или считался?
Ну тут вопрос терминологии. Он в русской версии называется "разрыв строки". То есть типографская строка начнется новая. "Знак абзаца" разывает абзац.
...
Рейтинг: 0 / 0
21.01.2011, 14:10
    #37071406
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать Word и обработать.
В общем, текст можно мерять попугаями разных видов и толщины :) Выбор за автором.
...
Рейтинг: 0 / 0
21.01.2011, 14:52
    #37071562
yanyariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать Word и обработать.
Shocker.ProAntonariyпропущено...
Скорее всего да.
НЕТ!!!

Параграф (а точнее Paragraph, а в русском офисе - абзац) - это от одного знака конца абзаца до другого!!!
Почему то думал, что знак перевода строки и знак конца абзаца это одно и то же. Как бы совсем не запутаться.
...
Рейтинг: 0 / 0
21.01.2011, 15:21
    #37071676
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать Word и обработать.
> Автор: yanyariy
> Почему то думал, что знак перевода строки и знак конца абзаца это одно и то же. Как бы совсем не запутаться.


Обычно так и бывает, но есть женщины в русских селенияхпрограммы обезображенные интелектом, в которых абзац это
когда ты нажал Enter. А до того как ты нажал Enter могут быть переносы строк, но они не будут концом абзаца. :)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
21.01.2011, 15:34
    #37071717
yanyariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать Word и обработать.
Shocker.Pro,

Я тут попробовал Ваш код в действии, вот что получилось:
Код: plaintext
1.
2.
3.
4.
For i =  1  To  5 
            W.ActiveDocument.Selection.MoveEnd(wdLine,  1 ) 'тут vs вежливо напомнил, что имя wdLine не объявлено
            Debug.Print(W.ActiveDocument.Selection)
            W.ActiveDocument.Selection.GoToNext(wdGoToLine) 'тут vs вежливо напомнил, что имя wdGoToLine не объявлено
        Next

Попытался скопировать абзац (параграф) и добавить его в документ вот так:
Код: plaintext
1.
2.
3.
Dim Параграф1 As Word.Paragraph 'Объявляю переменную

        Параграф1 = W.ActiveDocument.Paragraphs( 1 ) 'Присваиваю ей значение
        W.ActiveDocument.Paragraphs.Add(Параграф1) 'А тут vs говорит мне "несовпадение типа"

А времени, чтоб это хоть как то освоить - сутки.
...
Рейтинг: 0 / 0
21.01.2011, 15:49
    #37071783
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать Word и обработать.
авторне объявленоПомимо копипасты нужно еще в ссылки проекта добавить ссылку на word.
авторнесовпадение типаПотому что add принимает тип range, а не paragraph.
...
Рейтинг: 0 / 0
21.01.2011, 16:35
    #37071913
yanyariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать Word и обработать.
Antonariyавторне объявленоПомимо копипасты нужно еще в ссылки проекта добавить ссылку на word.
авторнесовпадение типаПотому что add принимает тип range, а не paragraph.

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

Перешел на макросы. Вставил такой код:
Код: plaintext
1.
2.
Dim Paragraf As Range
     Paragraf = ThisDocument.Paragraphs( 1 ) 'тут выделяет мне слово Paragraf и выдает сообщение "Compile error: Type mismatch"
    ActiveDocument.Paragraphs.Add (Paragraf)
Вожусь, пока толку нет.
...
Рейтинг: 0 / 0
21.01.2011, 16:44
    #37071942
Ципихович Эндрю
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать Word и обработать.
yanyariy, не гнушись русскими словами
Paragraf = ThisDocument.Paragraphs(1)
вот так
ЦЭ = ThisDocument.Paragraphs(1)
...
Рейтинг: 0 / 0
21.01.2011, 16:45
    #37071949
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать Word и обработать.
'тут выделяет мне слово Paragraf и выдает сообщение
Потому что читать нужно внимательней. Paragraph и Range это разные классы. Еще раз:
Код: plaintext
1.
2.
For Each pARAGRAPH in ThisDocument.Paragraphs
    Set r = pARAGRAPH.Range
Next
...
Рейтинг: 0 / 0
21.01.2011, 17:13
    #37072018
Ципихович Эндрю
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать Word и обработать.
Antonariy, раз 10 я слышал, что ActiveDocument и ThisDocument это разные вещи, читал, а посему имею
Код: plaintext
1.
2.
3.
d = ActiveDocument.Paragraphs.Count
Debug.Print d '92
s = ThisDocument.Paragraphs.Count
Debug.Print s ' 1 
Вы предлагаете гнать цикл равный 1???
...
Рейтинг: 0 / 0
21.01.2011, 17:18
    #37072028
yanyariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать Word и обработать.
Ципихович Эндрю,

Замен на ЦЭ должного действия не произвела.
А вот такой код почти работает:
Код: plaintext
1.
2.
3.
Dim Параграф1 As Word.Range

        Параграф1 = W.ActiveDocument.Paragraphs( 1 ).Range
        W.ActiveDocument.Paragraphs.Add(Параграф1)
почти, потому что объект параграф создается, принимает значения первого абзаца. Но добавляется в документ пустая строка, точнее знак "конец абзаца"
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Прочитать Word и обработать. / 25 сообщений из 36, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]