Программно прочитать текст

Автор RAN, 1 ноября 2014, 11:29

0 Пользователи и 2 гостей просматривают эту тему.

RAN

Приветствую.
Написал макрос для Excel, но, оказалось, что для тех, кому писал макрос, что MS ofis, что ОО - без разницы.
И MS ofis у них отсутствует.

Сам макрос обработки под ОО отладил, осталась проблема, как заменить Word на Writer?
Set wa = CreateObject("Word.Application")
    Do While sFile <> ""
        '    For Each ff In fld.Files
        If Mid$(sFile, InStrRev(sFile, ".") + 1) Like "doc*" _
        Or Mid$(sFile, InStrRev(sFile, ".") + 1) Like "odt*" Then
            '        If fso.GetExtensionName(ff.Path) Like "doc*" Then
            '            Set ff = wa.Documents.Open(ff.Path)
            Set ff = wa.Documents.Open(ThisWorkbook.Path & "\" & sFile)
            strText = ff.Range.Text
            ff.Close False

Т.е. нужно открыть doc(x) или odt и считать текст в переменную.

И справочный вопрос
почему не работает строка
For Each ff In fld.Files
если fld.Files.Count считает (пришлось от FSO отказаться)
fld.Files.Count = 5

JohnSUN

Вообще-то, для поиска файлов лучше было бы использовать функцию ReadDirectories() из стандартной библиотеки Tools (модуль UCB) или, на худой конец, пример из Справки Функция Dir [время выполнения]

В той же Справке, в разделе Инструкции циклов перечислены конструкции, которые Basic может выполнять:
Инструкция Do...Loop [время выполнения]
Инструкция For...Next [время выполнения]
Инструкция While...Wend [время выполнения]

Никакого For Each там нет...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

RAN

вообще, стандартный For...Next предусматривает 2 варианта
for ... to
next

и
for each in
next

ну не видит ОО последнюю конструкцию, ну и тьфу.
но этот вопрос между прочим...

Как по основной проблеме?
подскажите, или нет?

JohnSUN

#3
Да не вопрос! Конечно же подскажем. Вот только
Цитата: RAN от  1 ноября 2014, 11:29
Т.е. нужно открыть doc(x) или odt и считать текст в переменную.
И что? Задача-то в чем состоит?
Собрать данные из пачки документов в какой-то папке и слепить какой-то общий документ, что ли?
Если так, то в каком порядке перебирать документы? По имени, по дате создания, по дате изменения?..
Весь ли контент - от первого абзаца до последнего - перекидывать в итоговый документ или нужен какой-то отбор?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

RAN

#4
Собрать данные из пачки документов в какой-то папке и слепить какой-то общий документ - да
каком порядке перебирать документы? - в любом
Весь ли контент -да

Точнее, мне нужно прочитать все, а достать нужное я смогу.
Массивы, коллекции, словари рулят.

PS там еще несколько типов файлов, но для них Word или Writer не требуется.

JohnSUN

Цитата: RAN от  1 ноября 2014, 21:36
Массивы, коллекции, словари рулят.
Я за них рад... Но речь шла о таблицах, рисунках, диаграммах, стилях, форматировании...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

RAN

#6
Цитата: JohnSUN от  1 ноября 2014, 19:42речь шла о таблицах, рисунках,
Где?
Мне нужен только текст (string)
strText = ff.Range.Text
меня вполне устраивает

JohnSUN

Может, конечно, и устраивает, но "нет такой буквы в этом слове"...
Еще когда прочитал
Цитата: RAN от  1 ноября 2014, 20:37
вообще, стандартный For...Next предусматривает 2 варианта...
хотел переспросить - для кого стандартный? Если пишешь на StarBasic - забудь VBA как страшный сон... И уж тем более старайся не вспоминать о нём на форуме.
Меня напрягла формулировка
Цитата: RAN от  1 ноября 2014, 11:29
Написал макрос для Excel...
...осталась проблема, как заменить Word на Writer?
Поскольку в задачу углубляться не стал, то сам виноват - получай такое решение...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

RAN

#8
Капитана в тот день называли на "ты"
Шкипер с юнгой сравнялись талантом...

Прекрасный пример. Великолепно откомментирован.
Премного благодарен. С большим удовольствием изучил.
Надеюсь, пригодится многим.
За это
Цитата: JohnSUN от  1 ноября 2014, 10:10Функция Dir
прошу прощения отдельно, ибо это (точнее, применение другого метода) было единственное, что мешало коду VBA работать в ОО.
Цитата: JohnSUN от  1 ноября 2014, 22:57Если пишешь на StarBasic - забудь VBA как страшный сон
Не совсем согласен.
При работе с листом - там однозначно ДА.
В в данном случае - нет.
Мои вопросы остались открыты
Могу попробовать детализировать вопросы, если уточнения будут рассмотрены.

Yakov

#9
Цитата: RAN от  3 ноября 2014, 19:55Могу попробовать конкретизировать вопросы.
Давайте.

RAN

Предыдущее сообщение чуть поправил.
По детализации
При обращении к Word из Excel, Word стороннее приложение.
Требуется создание экземпляра
Set wa = CreateObject("Word.Application")
При этом приложение в режиме Visible =False
При расположении кода в файле Calc, является ли Writer сторонним приложением, если да, то какой строкой вызвать? Как переключить видимость?
Аналогично, но код расположен в файле Excel или VBS.
При открытии файла
oDoc = OpenDocument(listOfFiles(i,0), Array())   ' Открываем документ (можно было бы сделать это "невидимо")
Как сделать "невидимо", что за параметр ", Array()"?
Можно ли ссылку для почитать? Желательно на русском.
С поиском в инете у меня и так проблемы, а в ОО еще и F1 как-то не правильно функционирует.

PS использую LibreOffice 3.5

JohnSUN

Цитата: RAN от  3 ноября 2014, 21:55
Цитата: JohnSUN от  1 ноября 2014, 22:57Если пишешь на StarBasic - забудь VBA как страшный сон
Не совсем согласен.
Да, я тут подумал, что тоже не совсем согласен... Не "как страшный", а "как кошмарный". Впрочем, неважно как именно забывать - главное забыть попрочнее.
Я совершенно серьёзно! Сам ковылял от оператора к оператору, пока пытался скормить OpenOffice VBA-образный код. Потом почитал Питоньяка, плюнул и начал практически с нуля. Другими словами - забыл VBA и всё начало получаться. (Само собой, забыл не до конца, только на время работы с LibreOfice - если работаю с MSOfice, то всё помню)
Дело в том, что навыки кодирования в VBA очень мешают - подавляющее большинство удобств того языка заточено под модель MS-форматов. У ODF - иная модель, почти все привычные фишки из VBA здесь пишутся совсем иначе.
Цитата: RAN от  3 ноября 2014, 21:55
При работе с листом - там однозначно ДА.
В данном случае - нет.
Ага... Про отсутствующий в языке For Each вспоминать не будем...
Цитата: RAN от  3 ноября 2014, 22:32
При расположении кода в файле Calc, является ли Writer сторонним приложением, если да, то какой строкой вызвать? Как переключить видимость?
Как сделать "невидимо", что за параметр ", Array()"?
Можно ли ссылку для почитать? Желательно на русском.
1. Нет, это еще одно "окно" (это мой очень грубый перевод "фрейма") для общего процесса soffice.bin.
2. Несколько вариантов - как для открытия существующего, так и для создания нового. На любой вкус.
3. Установить PropertyValue с именем "Hidden" в True (Listing 5.21: Merge all documents in a single directory into one. Это у Питоньяка)
4. Array() - функция StarBasic для создания массива. Без параметров создаёт пустой массив. Другими словами, OpenDocument в примере макроса вызывается без особых параметров. А тебе вместо пустого массива нужно будет передать массив из одного (как минимум) элемента PropertyValue. Подробности - у Питоньяка)
5. Все упоминания Питоньяка - ссылки.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

RAN

Шкипер, еще не смотрел, но, думаю, оно самое!
Это моя 2 попытка работы с ОО.
При поиске по моим запросам на 90 процентов ответы были твои. Пусть иногда чуть более фрагментарные, чем хотелось, но были.
Так что, как говорит нынешний молодняк, "респект и уважуха"!

JohnSUN

[оффтоп оn]Честно признайся усатый - хочешь лишиться хвоста?..
Насчет 90% - явное преувеличение: "писуч", конечно, но не настолько же!
Почему провалилась первая попытка? Неужто этого форума тогда не существовало?.. [оффтоп офф]
Всё-таки не понимаю основную задумку проекта. Из-под электронной таблицы перебрать текстовые документы, выдрать из них тексты и... И что?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

RAN

#14
Пропарсить все тексты, выделить уникальные, и собрать в единый txt.
Это все работает, была проблема только с чтением doc и odt при отсутствии Word.
txt все равно через fso читаются.

Цитата: JohnSUN от  4 ноября 2014, 11:26Почему провалилась первая попытка?
Нужда отпала.