Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

24 Январь 2017, 18:06 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1 2 »   Вниз
  Печать  
Автор Тема: Как считать содержимое файла в переменную?  (Прочитано 765 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Strannik61
Новичок
*
Offline Offline

Сообщений: 40


« Стартовое сообщение: 8 Ноябрь 2016, 09:52 »

Для организации поиска по базе нужно занести ТЕКСТОВОЕ содержимое файла в базу.
Файлы могут быть СТРОГО нескольких типов - odt, doc, xls или ods
Сейчас делаю так:
Открываю файл - сохраняю как текстовый (temp.txt) - Считываю из него построчно в переменную - Заношу в базу - Удаляю текстовый файл (temp.txt).
Может быть есть более лёгкий и правильный путь? Считать сразу в переменную, но только текстовое содержимое файла?
Без форматирования, таблиц и прочего?
Записан
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 1 925


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #1: 8 Ноябрь 2016, 10:38 »

Получить текстовое содержимое из текстового документа (odt, doc) просто (объём строки ограничен 64КБ):
Код:
s=ThisComponent.Text.String

Для табличных документов (xls или ods) чуть сложнее, нужно выбрать лист, диапазон и перебрать строки диапазона, например, так:
Код:
Sub Main   Dim d(), s$
d=ThisComponent.Sheets(0).Data
For i=0 To UBound(d)
s=s & join(d(i),";") & chr(10)
Next
End Sub
Записан

JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 177


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #2: 8 Ноябрь 2016, 10:50 »

Ну да... Только, наверное, не ThisComponent, а какой-нибудь oDoc.getText().getString() - у Strannik61 этим ThisComponent скорее всего будет сама база, куда контент вставляется.
А по таблицам, наверное, чистая Data как-то не очень... Тексты-то потеряются, а по ним поиск вести собираются. Возможно, для каждого листа (в смысле для UsedArea, конечно - не для всего листа) придется слизывать .getDataArray(), пихать его обратно как setFormulaArray, опять считывать и тогда уж join'ить... И, само собой, книгу закрыть без сохранения изменений  Смеющийся
Или смотреть в сторону текстовых фильтров - типа, имитировать сохранение в CSV...
А вообще-то постановка задачи какая-то странная  Подмигивающий
Записан

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

Сообщений: 40


« Ответ #3: 8 Ноябрь 2016, 11:32 »

rami - очередное огромное спасибо!

JohnSUN - постановка задачи не странная. Проблема в том, что ОЧЕНЬ давно, лет так 15 назад, ещё на IE и MS Office была сделана собственная простенькая система делопроизводства.
За годы она разрослась. Потом перешли на OpenOffice. При этом вызов всех документов по-прежнему производился из IE через ActiveX, что само по себе неправильно.
Вот я потихоньку и переделываю систему, чтобы всё работало только в ОО без IE, но к несчастью с сохранением всей структуры базы и вызывалось из самого ОО.
При этом поиск документов должен быть в базе, т.к. ей пользуются удалённо. Поэтому и есть необходимость заносить в неё текстовое содержимое.
UPDATE
У нас все новые документы создаются на основе образцов документов. В частности все табличные образцы содержат только 1 лист, поэтому задача у меня упрощается.
« Последнее редактирование: 8 Ноябрь 2016, 11:56 от Strannik61 » Записан
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 1 925


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #4: 8 Ноябрь 2016, 12:06 »

Постановка задачи слишком общая, я дал общие идеи с чего начать, но дальше нужно учитывать подробности. Обратите внимание на уточнения JohnSUN на счёт Data, DataArray и FormulaArray — они по разному работают с данными.

P.S. К сведению, если данные в табличных документах имеют ту же структуру как и в базе, можно добавлять данные из электронных таблиц в базу простым перетаскиванием. Если этот способ подойдёт, то будет просто и удобно.
Записан

Strannik61
Новичок
*
Offline Offline

Сообщений: 40


« Ответ #5: 8 Ноябрь 2016, 12:11 »

Под базой я имел в виду базу в mysql
Туда так просто не перетащишь. Улыбка
И способ с перебором диапазона таблицы не получился. В текст вставляется много непонятных числе из пустых ячеек.
Мне кажется будет проще выделить всё содержимое листа, скопировать и вставить в текстовый лист по принципу "без форматирования". А там уже как вы и советовали.
Записан
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 1 925


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #6: 8 Ноябрь 2016, 12:42 »

И способ с перебором диапазона таблицы не получился. В текст вставляется много непонятных числе из пустых ячеек.
"Непонятные числа" — 2.2250738585072014e-308 — это не числовые значения (пустые ячейки или текст).

Для чисел и текста:
Код:
Sub Main   Dim d(), da(), s$
oSheet=ThisComponent.Sheets(0)
d=oSheet.Data
da=oSheet.getCellRangeByPosition(0,0,UBound(d(0)),UBound(d)).DataArray
For i=0 To UBound(d)
s=s & join(da(i),";") & chr(10)
Next
End Sub
Записан

economist
Старожил
****
Offline Offline

Сообщений: 346


« Ответ #7: 8 Ноябрь 2016, 14:01 »

Сталкивались с подобной задачей - база договоров в Excel.
Тексты договора - длинные строки (а кто сказал что нельзя?)

После 120 тыс. строк стало тормозить. Залили всё в SQLite, морду написали в BASE, да и в Calc есть старое "междумордие".  Когда стали заливать и приложения - стал тормозить поиск и возникла задача максимально быстрого полнотекстового поиска, с поддержкой языка запросов, позволяющих исключать словоформы.

Тут как раз пришел незамутненный практикант и прикрутил FTS (Full Text Search) к SQLite, и стало совсем хорошо. Время любого поискового запроса (включает как правило несколько И и НЕ - 0,5 сек. 
Записан

Пить не буду коньяку' - читану Питоньяку'...
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 177


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #8: 8 Ноябрь 2016, 14:30 »

JohnSUN - постановка задачи не странная.
Да ладно тебе, я же там смайлик прилепил - просто каламбурил на тему ника...

@rami Ты постоянно вставляешь chr(10) - это из-за этой фразы?
(temp.txt) - Считываю из него построчно в переменную
Насколько я себе представляю полнотекстовый поиск - эти переводы строк (да и точку с запятой, пожалуй) можно и просто на пробелы заменить. Впрочем, могу и ошибаться.
А по поводу "соскрести контент с листа" - у меня почему-то получилось длиннее:
Код:
Function getContent(Optional sheetIndex As Integer) As String
Dim oSheet As Variant
Dim oCursor As Variant
Dim oSDescriptor As Variant
Dim i As Long, j As Long, k As Long
Dim oFound As Variant
Dim oArea As Variant
Dim res As String
If IsMissing(sheetIndex) Then sheetIndex = 0
oSheet = ThisComponent.getSheets().getByIndex(sheetIndex)
oCursor = oSheet.createCursor()
oCursor.gotoEndOfUsedArea(True)
oSDescriptor = oCursor.createSearchDescriptor()
oSDescriptor.setSearchString(".+")
oSDescriptor.SearchRegularExpression = True
oFound = oCursor.findAll(oSDescriptor)
getContent = ""
If IsNull(oFound) or IsEmpty(oFound) Then Exit Function
res = ""
For i = 0 To oFound.getCount()-1
oArea = oFound.getByIndex(i)
For j = 0 To oArea.getRows().getCount() - 1
For k = 0 To oArea.getColumns().getCount() - 1
res = res & oArea.getCellByPosition(k, j).getString() & " "
Next k
Next j
Next i
getContent = res
End Function
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 1 925


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #9: 8 Ноябрь 2016, 15:06 »

Насколько я себе представляю полнотекстовый поиск - эти переводы строк (да и точку с запятой, пожалуй) можно и просто на пробелы заменить.
Это для сохранения структуры таблицы, от пробелов отказался, так как они могут быть внутри ячейки между слов. Если структура таблицы не нужна, можно свалить всё в кучу или вытаскивать только нужное. Вообще, я показал некий пример, ты показал другой вариант, а Strannik61 будет думать что больше подходит.
Записан

Strannik61
Новичок
*
Offline Offline

Сообщений: 40


« Ответ #10: 9 Ноябрь 2016, 18:52 »

Ну у меня на Базу данных натравлен sphinx.  Улыбка
Поэтому поиск моментальный.
Сейчас благодаря советам rami и Питоньяку получилось вот так.
Сильно не ругайте, но советы приветствуются
Код:
Dim s

Sub CleanText()
Dim document as object, document2 as object,
Dim dispatcher as object, oLocDocument as Object
Dim LocUrl as String, NoArgs()

document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:SelectAll", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
LocUrl = "private:factory/swriter"
oLocDocument = StarDesktop.LoadComponentFromURL(LocUrl,"_default",0,NoArgs)
document2   = oLocDocument.CurrentController.Frame
args1(0).Name = "SelectedFormat"
args1(0).Value = 1
dispatcher.executeDispatch(document2, ".uno:ClipboardFormatItems", "", 0, args1())
s=ThisComponent.Text.String
oLocDocument.close(true)
msgbox s
End sub
msgbox в конце для тестирования. Потом уберу
« Последнее редактирование: 9 Ноябрь 2016, 18:57 от Strannik61 » Записан
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 1 925


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #11: 9 Ноябрь 2016, 19:57 »

Сейчас благодаря советам rami и Питоньяку получилось вот так.
Питоньяк, да, он может такие советы давать Смеющийся Смеющийся Смеющийся , а я нет. Это бы меня с кем-то Афро путаете Смеющийся Смеющийся Смеющийся

Ваш макрос выделяет и копирует текст в текущем документе, создаёт новый документ и вставляет скопированное, затем закрывает новый документ и ... показывает текст из текущего документа. Спрашивается: зачем Непонимающий все эти танцы с профсоюзом диспетчеров Смеющийся , если новый документ создаётся (если это нужно) одной строкой кода, а другой строкой в него вставляется текст?
Записан

economist
Старожил
****
Offline Offline

Сообщений: 346


« Ответ #12: 10 Ноябрь 2016, 08:05 »

"Профсоюз Диспетчеров" - О..о.о! Надо запомнить!
Теперь я понял почему от него так сложно избавиться в офисе - у них, оказуецо, профсоюз :-))
Записан

Пить не буду коньяку' - читану Питоньяку'...
Bigor
Новичок
*
Offline Offline

Сообщений: 20


« Ответ #13: 15 Ноябрь 2016, 10:42 »

А если vbs макросом перегнать все  .odt .doc .xls .ods в txt и потом уже грузить в базу
Пример для xls в csv, но меняя параметры фильтров можно все нужные файлв конвертировать в txt

Код:
Set ServiceManager = CreateObject("com.sun.star.ServiceManager")
Set Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop")
Dim Param(1)
Set Param(0) = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
Set Param(1) = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")

Dim oFile
Dim fso, oFiles, oFolder           
Set fso = CreateObject("Scripting.FileSystemObject")

Const path_ = "c:\workfolder"   'каталог где ищем xls
Const file_ = "xls" ' какое расширение ищем

path_u = dos2unix(path_ ,"\\" ,"/" )&"/" ' конвертируем путь в формат ООО


Set oFolder = fso.GetFolder(path_) 
Set oFiles = oFolder.Files         
For Each oFile In oFiles         
     
if Right(oFile.name, 3) = file_ then    ' сравниваем расширение если xls, то в обработку
outFileName = Left(oFile.Name,len(oFile.Name)-3) ' получаем имя файла без расширения

Param(0).Name = "FilterName" ' фильтр для входных
Param(0).Value = "MS Excel 97"

Param(1).Name = "Hidden"
Param(1).Value = true

Set Document = Desktop.LoadComponentFromURL("file:///"&path_u&oFile.Name, "_blank", 0, Param)

Param(0).Name = "FilterOptions" ' фильтр для выходных
Param(0).Value ="44,34,34,1," ' тут параметры для csv

Param(1).Name = "FilterName"
Param(1).Value = "Text - txt - csv (StarCalc)"
           

Document.storeToURL "file:///"&path_u&outFileName&"csv", Param
Document.close True ' закрываем документ


      end if 
Next

Function dos2unix(txt, expr1, expr2) ' функция конвертирования путей
   
    Dim oReg
    Set oReg = New RegExp       
    oReg.Global = True   
    oReg.IgnoreCase = True   
    oReg.Pattern = expr1
    dos2unix = oReg.Replace(txt, expr2)
End Function

Записан
Strannik61
Новичок
*
Offline Offline

Сообщений: 40


« Ответ #14: 17 Ноябрь 2016, 00:20 »

to rami. Проблема в том, что копироваться может не только текст, но и таблицы. И открытым документом может быть ods.
А в odt таблицы прекрасно вставляются как чистый текст. Хотя я не все нюансы знаю, поэтому нашёл такой способ. Улыбка
to Bigor. Из ods файла категорически не хочет сохраняться в txt формате. Если знаете способ буду рад поучиться.

Записан
Страниц: 1 2 »   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!