WORD определить автоматические переносы в тексте ?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

WORD определить автоматические переносы в тексте ?

Сообщение ALX_2002 » 01.11.2007 (Чт) 15:18

Доброго времени суток товарищи. Озадачился следующей проблемой.

Есть вордовый документ с таблицами. В таблице 3 колонки.
Текст набивали видать какие то ОБЕЗЯНЫ, потому что часть
строк переносится через нормальный перевод строки, а часть за счёт автоматического перевода строки.

Мне нужно эти строки получить в массив

Вопросы таковы:
1) Можно ли как нибудь заменить автоматические переносы на нормальные ?
2) Можно ли за счёт объектной модели Word получить инфу об этих переносах
3) Вообще как нибудь с этим бороться реально ?

P.S В этой колонке забиты фамилия, имя и отчество через пробелы.
Но есть множество исключений с нестандартными ФИО, состоящими из четырёх частей. Поэтому сделать парсер по 3 элемента оказалось не панацеей решения проблемы. :(

Вот примеры того, что мне попадается

Код: Выделить всё

Мохаммад Анвар Эхса Ныла Мухаммад
Гурбанова Сабина Сейфаддин кызы
Гасанов Джафарага Орудж Мушвиг Аббас
Омаров Рамиль Эльдар оглы


:roll:

SKYS
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 21.09.2007 (Пт) 8:31
Откуда: г.Кемерово

Сообщение SKYS » 02.11.2007 (Пт) 6:01

Мохаммад Анвар Эхса Ныла Мухаммад


ЭТо ничесебе :shock:



Руками
Если док один то просто выдели все в ворде и очисти формат все приколы форматирования уберутся .
потом обрабатывай через VB .
Програмно
Код: Выделить всё
Private Sub Command1_Click()
    Dim WordApp As Word.Application '  экземпляр приложения
    Dim DocWord As Word.Document '  экземпляр документа
    Dim TableWord As Word.Table

    'создаЈм  новый экземпляр Word-a
    Set WordApp = New Word.Application
    'определяем видимость Word-a по True - видимый,
    'по False - не видимый (работает только ядро)
    WordApp.Visible = True
    'Set DocWord = WordApp.Documents.Open(mm(i))
    Set DocWord = WordApp.Documents.Open("c:\1.doc")
    'активируем его
    DocWord.Activate
   WordApp.Selection.WholeStory 'Выделяем все
   WordApp.Selection.ClearFormatting ' Чистим формат
   DocWord.Save 'Сохраняем если нужно
DocWord.Close True
'закрываем Word (без запроса на сохранение)
WordApp.Quit True
'уничтожаем обьект - документ
Set DocWord = Nothing
'уничтожаем обьект - Word
Set WordApp = Nothing
End Sub
Хорошо когда не знаеш да еще забудеш !!!!

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 04.11.2007 (Вс) 22:20

Ммм.... Не совсем понял как мне это поможет ? Во первых очищение формата вроде как не спасает меня от автоматических переносов. Они как были - так и есть. А во вторых это всё равно не даст мне возможности получить данные из колонок ( А именно ФИО в массив ). А мне как раз это очень нужно :)

Если я чего не понял - поясни плз. :)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 05.11.2007 (Пн) 12:30

Что ты называешь автоматическим переносом? Символ "мягкий перенос"? Или переход на новую строку?
Lasciate ogni speranza, voi ch'entrate.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 05.11.2007 (Пн) 13:45

Перевод строки. У него там часть вручную сделана, посредством нажимания Enter, а часть автоматически вордом.
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 05.11.2007 (Пн) 14:14

Тогда бы не лишним был кусок этого документа.
Lasciate ogni speranza, voi ch'entrate.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 05.11.2007 (Пн) 22:23

Не вопрос отцы. :) Завтра как на работе окажусь - сразу выложу. :)

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 06.11.2007 (Вт) 11:52

Как и обещал сегодня - выкладываю пример этого файла.
:)

Пока что для удобства парсинга делаю конвертацию сначала в HTML документ, а потом перебор через document.all.tags("TABLE") делаю перебор HTML-ки. Кривокосо, но пока что по другому не придумал как :)
Вложения
Documents.doc
(38 Кб) Скачиваний: 74

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.11.2007 (Вт) 12:41

И где там переносы?
Одно имя -- одна строка. По строкам и считываешь.
Lasciate ogni speranza, voi ch'entrate.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 06.11.2007 (Вт) 13:11

Аррр ((( Виновен. Прошу прощения - Я уже правленную версию оказывается залил. Ща заменил обратно. Там автоматические переносы около:

Ищук Валентина Александровна
Максак (Завгородняя)Татьяна Сергеевна

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.11.2007 (Вт) 15:27

В файле по прежнему имена в одну строку идут.
Lasciate ogni speranza, voi ch'entrate.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 06.11.2007 (Вт) 16:41

2 alibek

Ёмаё. :( Сам скачал - проверил. Всё норм ! Может у тебя прокси кэшит ? У меня после фамилий

Ищук Валентина Александровна и Максак (Завгородняя)Татьяна Сергеевна перевод на новую строку сделан WORD-ом автоматически. В месте пробела.

P.S Да и не суть важно. Я ж объяснил в чём проблема то ? Зачем так необходим сам файл то ? :shock:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.11.2007 (Вт) 17:53

Потому что я не вижу здесь проблему. Если под автоматическим переводом строки ты подразумеваешь то, что Word переносит на новую строку слово, если оно не влезает в границы столбца, то не понимаю, чем это тебе мешает.
Lasciate ogni speranza, voi ch'entrate.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 06.11.2007 (Вт) 18:30

Вот в том то и дело - что именно это мне и мешает. Мне в массив нужно получить отдельные ФИО из столбца. Если я сплит делаю по vbCrlf то в тех местах где автоматический перенос - я получаю в один элемент массива получаю 2 и более ФИО. :(

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 07.11.2007 (Ср) 15:40

Ну вот. Тут то все и замолчали. :(

2 alibek: Ну так как быть то невезучему парсильщику DOC файлов то ? :)

Crio
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 21.05.2007 (Пн) 12:01
Откуда: Питер

Сообщение Crio » 08.11.2007 (Чт) 0:47

Можно попробовать указать длину строки в символах и потом слишком длинные строки (между двумя переносами) разрезать по этой длине.

Правда алгоритм резки должен быть аккуратным: шрифт не моноширинной.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 08.11.2007 (Чт) 11:46

Хм... А длинну на основании чего я укажу ? :) На основании среднестатистической длины фио ? )

Crio
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 21.05.2007 (Пн) 12:01
Откуда: Питер

Сообщение Crio » 08.11.2007 (Чт) 17:08

На основании ФИО, которое полностью влезает в ячейку таблицы.

У тебя в примере:

Максак (Завгородняя)Татьяна Сергеевна

самая длинная ФИО, вот по её длине и делай.

ДОБАВЛЕНО:

Приношу свои извинения. Не катит мой способ, только-что на примере посмотрел.

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 10.11.2007 (Сб) 1:42

Жаль, что вместо переноса строки используется иногда пробел, но все решаемо.
Код: Выделить всё
Sub qqq()
   Dim cll As Word.Cell
   Dim chr As Word.Range
   Dim nxtlne As Integer
   For Each cll In ThisDocument.Tables(1).Columns(3).Cells
         For Each chr In cll.Range.Characters
         If nxtlne <> chr.Information(wdFirstCharacterLineNumber) Then Debug.Print "~~~~~~~~~~~~"
          Debug.Print chr
          nxtlne = chr.Information(wdFirstCharacterLineNumber)
         Next
   Next
End Sub

Просто надо довести до ума.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 11.11.2007 (Вс) 13:57

ВАУ !!!!!! СПАСИБО !!! ПОПРОБЫВАЛ - ПАШЕТ !!!! :)

Вот только одна проблема осталась. Ворд не даёт нормально ячейки перебрать, потому что они где то объединены. Т.е при переборе вылезает сообщение об ошибке типа - Доступ к некоторым ячейкам закрыт, потому что они соединены. Вот думаю теперь что с этим делать :) За код ещё раз огромное спасибо :)

Crio
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 21.05.2007 (Пн) 12:01
Откуда: Питер

Сообщение Crio » 12.11.2007 (Пн) 9:11

EUGY

Объясни, пожалуйста, как работает.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 12.11.2007 (Пн) 9:35

Суть в wdFirstCharacterLineNumber.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 67

    TopList  
cron