Добрый день! Недавно познакомилась с OOo Calc. Проблема: ...

Автор ForumOOo (бот), 10 февраля 2011, 14:57

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

ForumOOo (бот)

Компонент: Extension
Версия OpenOffice.org: 3.3
Сборка: OOO330m20(Build:9567)
ОС: Windows XP SP2

Добрый день!

Недавно познакомилась с OOo Calc.
Проблема: В Calc в диалоговом окне "Найти и заменить" отсутствует конкретный адрес найденных
чисел.
Описываю ситуацию:
В excel 2003 есть функция . Например надо найти число, в которое входит 25.
При нажатии кнопки "Найти все" в нижней части диалогового окна отображаются местоположение всех
сочетаний чисел, в  которых встречается 25. Мы видем адрес найденных сочетаний -Книга, Лист,
Имя, Ячейка,Значение.  Выбираем сразу нужное число из найденных-2225.
Эта возможность очень удобна, особенно если приходится искать среди сотен строк.

В Calc в диалоговом окне "Найти и заменить" отсутствует конкретный адрес найденных чисел.
Когда нажимаем "Найти все" -выделяется синим цветом найденные сочетания чисел (см вложенный
Рис2).Если Лист состоит из сотен строк- приходится пролистывать полностью--просматривать все
варианты--пока я не найду нужное сочетание 2225(например оно находится на 99 строчке).Очень
неудобно.
Как можно решить эту проблему?
Может кто-то написал расширение?
Заранее благодарю за ответ!

C уважением,
Наталья.

Тестовый файл: http://forumooo.ru/attachments/upload/ris1.JPG (52.56 КБ)

--
Подпись: Наталья Н.
Эл. почта: Nik-Nat2001@yandex.ru

raptor

Цитата: MyOOo.ru (бот) от 10 февраля 2011, 12:57Выбираем сразу нужное число из найденных-2225.
А что мешает искать сразу нужное - 2225?

Natali

Уточняю: обычно в ячейках у меня забиты данные вида  757581.002,  757162.2525,   685169 0035-1,
2104-2525 3922-1  и т.д.  Часто бывает - полного наименования нужного числа я не помню, знаю,что  в нем встречается сочетание 2525.  Было бы удобно (как реализовано в Excel) в окне "Найти и заменить"  отображался адрес найденных ячеек, где встречается сочетание 2525.

Наталья Н.

Рыбка Рио

Можно такой макрос использовать для поиска адресов ячеек. Попробуйте. (Его можно улучшить, чтобы в открывшемся окошке можно было переходить сразу на найденную ячейку - а пока что он только показывает адреса ячеек)

REM  *****  BASIC  *****

Dim floatingwindow As Object
Dim floatingframe As Object
Dim zToolkit As Object
Dim CW As Object
Dim Doc As Object
Dim sAddresses As String

Sub Main
Doc=ThisComponent
Sheet=Doc.CurrentController.ActiveSheet
SD=Sheet.createSearchDescriptor
SD.searchRegularExpression=TRUE
SchStr=inputbox("Введите, что найти?","Что найти?","")
If SchStr="" then Exit Sub
SD.SearchString=SchStr
K=Sheet.findAll(SD)
If IsNull(K) then msgbox "Ничего не найдено" : Exit Sub
sAddresses=Join(Split(K.RangeAddressesAsString,";"),chr(13))
FlWindow
End Sub

Sub FlWindow
CW=Doc.CurrentController.Frame.ComponentWindow
zToolkit=CW.getToolkit()

xsz=150
ysz=100

floatingframe = GetProcessServiceManager.createInstanceWithContext("com.sun.star.frame.Frame", GetDefaultContext)
floatingwindow = CreateWindow(zToolkit, MkRk(800,100,xsz,ysz))
floatingframe.initialize(floatingwindow)

ucc = CreateCtrWithProp( "Container", MkRk(0,0,xsz,ysz), Array(), Array())
ucc.createPeer( zToolkit, floatingwindow )
floatingframe.setComponent(ucc,Null)
oEdit1 = CreateCtrWithProp( "Edit", MkRk(0,0,xsz,ysz), Array("MultiLine","VScroll"), Array(true,true))
ucc.addControl("Edit1",oEdit1)
oEdit1.setText(sAddresses)
End Sub

Function MkRk( nX As Long, nY As Long, nWidth As Long, nHeight As Long ) As com.sun.star.awt.Rectangle
   Dim Rk As Object
   Rk = createUnoStruct("com.sun.star.awt.Rectangle")
   With Rk
      .X = nX
      .Y = nY
      .Width = nWidth
      .Height = nHeight
   End With
   MkRk() = Rk
End Function

Function CreateWindow( oLocToolkit As Object, aLocRect As com.sun.star.awt.Rectangle ) As com.sun.star.awt.WindowDescriptor
Dim WDesc
WDesc = createUnoStruct("com.sun.star.awt.WindowDescriptor")
With WDesc
.Type = com.sun.star.awt.WindowClass.SIMPLE
.WindowServiceName = "floatingwindow"
.Parent = CW
.ParentIndex = -1
.Bounds = aLocRect
End With
With com.sun.star.awt.WindowAttribute
WDesc.WindowAttributes = .BORDER + .SHOW + .SIZEABLE + .MOVEABLE + .CLOSEABLE
End With
CreateWindow = oLocToolkit.createWindow(WDesc)
End Function

Function CreateCtrWithProp( CtrType, aPosSize, aPropNames, aPropValues )
Dim oCtr As Object, oCtrModel As Object
oCtr = createUnoService("com.sun.star.awt.UnoControl" & CtrType )
oCtrModel = createUnoService("com.sun.star.awt.UnoControl" & CtrType & "Model" )
oCtrModel.setPropertyValues( aPropNames, aPropValues )
With oCtr
.setModel(oCtrModel)
.setPosSize( aPosSize.X, aPosSize.Y, aPosSize.Width, aPosSize.Height, _
com.sun.star.awt.PosSize.POSSIZE )
End With
CreateCtrWithProp() = oCtr
End Function
ubuntu 12.04 + LibO3.6.0

raptor

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

Рыбка Рио

Тогда так:

REM  *****  BASIC  *****

Dim floatingwindow As Object
Dim floatingframe As Object
Dim zToolkit As Object
Dim CW As Object
Dim Doc As Object
Dim sAddresses As String

Sub Main
Doc=ThisComponent
Sheet=Doc.CurrentController.ActiveSheet
SD=Sheet.createSearchDescriptor
SD.searchRegularExpression=TRUE
SchStr=inputbox("Введите, что найти?","Что найти?","")
If SchStr="" then Exit Sub
SD.SearchString=SchStr
K=Sheet.findAll(SD)
If IsNull(K) then msgbox "Ничего не найдено" : Exit Sub
For i=0 to K.Count-1
   sAddresses=sAddresses+K(i).AbsoluteName+":"+chr(13)
   Nk=ubound(K(i).DataArray)
   S=""
   For j=0 to Nk
      S=S+Join(K(i).DataArray(j),chr(9))+chr(13)
   Next
   sAddresses=sAddresses+S+chr(13)   
Next
'sAddresses=Join(Split(K.RangeAddressesAsString,";"),chr(13))
FlWindow
End Sub

Sub FlWindow
CW=Doc.CurrentController.Frame.ComponentWindow
zToolkit=CW.getToolkit()

xsz=300
ysz=200

floatingframe = GetProcessServiceManager.createInstanceWithContext("com.sun.star.frame.Frame", GetDefaultContext)
floatingwindow = CreateWindow(zToolkit, MkRk(800,100,xsz,ysz))
floatingframe.initialize(floatingwindow)

ucc = CreateCtrWithProp( "Container", MkRk(0,0,xsz,ysz), Array(), Array())
ucc.createPeer( zToolkit, floatingwindow )
floatingframe.setComponent(ucc,Null)
oEdit1 = CreateCtrWithProp( "Edit", MkRk(0,0,xsz,ysz), Array("MultiLine","VScroll"), Array(true,true))
ucc.addControl("Edit1",oEdit1)
oEdit1.setText(sAddresses)
End Sub

Function MkRk( nX As Long, nY As Long, nWidth As Long, nHeight As Long ) As com.sun.star.awt.Rectangle
  Dim Rk As Object
  Rk = createUnoStruct("com.sun.star.awt.Rectangle")
  With Rk
     .X = nX
     .Y = nY
     .Width = nWidth
     .Height = nHeight
  End With
  MkRk() = Rk
End Function

Function CreateWindow( oLocToolkit As Object, aLocRect As com.sun.star.awt.Rectangle ) As com.sun.star.awt.WindowDescriptor
Dim WDesc
WDesc = createUnoStruct("com.sun.star.awt.WindowDescriptor")
With WDesc
.Type = com.sun.star.awt.WindowClass.SIMPLE
.WindowServiceName = "floatingwindow"
.Parent = CW
.ParentIndex = -1
.Bounds = aLocRect
End With
With com.sun.star.awt.WindowAttribute
WDesc.WindowAttributes = .BORDER + .SHOW + .SIZEABLE + .MOVEABLE + .CLOSEABLE
End With
CreateWindow = oLocToolkit.createWindow(WDesc)
End Function

Function CreateCtrWithProp( CtrType, aPosSize, aPropNames, aPropValues )
Dim oCtr As Object, oCtrModel As Object
oCtr = createUnoService("com.sun.star.awt.UnoControl" & CtrType )
oCtrModel = createUnoService("com.sun.star.awt.UnoControl" & CtrType & "Model" )
oCtrModel.setPropertyValues( aPropNames, aPropValues )
With oCtr
.setModel(oCtrModel)
.setPosSize( aPosSize.X, aPosSize.Y, aPosSize.Width, aPosSize.Height, _
com.sun.star.awt.PosSize.POSSIZE )
End With
CreateCtrWithProp() = oCtr
End Function
ubuntu 12.04 + LibO3.6.0

raptor

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

Рыбка Рио

Цитата: raptor от 15 февраля 2011, 15:28
Еще бы сделать так, чтобы при изменении размеров окна и поле редактирования подстраивалось бы под размер окна, а то оно маленькое, не меняется и тоже не очень удобно.
Годится если это можно будет делать в течение 5 секунд? Просто если макрос на Basic работает (а он должен работать, т.к. программа слушает ваши действия по изменению размера окна), то его нельзя вроде запустить второй раз, и следовательно, например, два, три и более окошек не получится запустить. (На Питоне нет этих проблем) Данный макрос даёт вам 5 секунд на то , что бы сделали размер окошка какой надо. После этого макрос завершает свою работу, а окошко висит себе и вы можете с ним делать всё что хотите, можете ещё 10 таких окошек открыть (но не чаще чем раз в 5 секунд)

REM  *****  BASIC  *****

Dim floatingwindow As Object
Dim floatingframe As Object
Dim zToolkit As Object
Dim CW As Object
Dim ucc As Object, oEdit1 As Object
Dim Doc As Object
Dim sAddresses As String

Sub Main
Doc=ThisComponent
Sheet=Doc.CurrentController.ActiveSheet
SD=Sheet.createSearchDescriptor
SD.searchRegularExpression=TRUE
SchStr=inputbox("Введите, что найти?","Что найти?","")
If SchStr="" then Exit Sub
SD.SearchString=SchStr
K=Sheet.findAll(SD)
If IsNull(K) then msgbox "Ничего не найдено" : Exit Sub
For i=0 to K.Count-1
   sAddresses=sAddresses+K(i).AbsoluteName+":"+chr(13)
   Nk=ubound(K(i).DataArray)
   S=""
   For j=0 to Nk
      S=S+Join(K(i).DataArray(j),chr(9))+chr(13)
   Next
   sAddresses=sAddresses+S+chr(13)   
Next
'sAddresses=Join(Split(K.RangeAddressesAsString,";"),chr(13))
FlWindow
End Sub

Sub FlWindow
CW=Doc.CurrentController.Frame.ComponentWindow
WL = createUnoListener("Window_", "com.sun.star.awt.XWindowListener")
zToolkit=CW.getToolkit()

xsz=300
ysz=200

floatingframe = GetProcessServiceManager.createInstanceWithContext("com.sun.star.frame.Frame", GetDefaultContext)
floatingwindow = CreateWindow(zToolkit, MkRk(800,100,xsz,ysz))
floatingframe.initialize(floatingwindow)
floatingwindow.addWindowListener(WL)
   
ucc = CreateCtrWithProp( "Container", MkRk(0,0,xsz,ysz), Array(), Array())
ucc.createPeer( zToolkit, floatingwindow )
floatingframe.setComponent(ucc,Null)
oEdit1 = CreateCtrWithProp( "Edit", MkRk(0,0,xsz,ysz), Array("MultiLine","VScroll"), Array(true,true))
ucc.addControl("Edit1",oEdit1)
oEdit1.setText(sAddresses)
Wait 5000
floatingwindow.removeWindowListener(WL)
End Sub

Function MkRk( nX As Long, nY As Long, nWidth As Long, nHeight As Long ) As com.sun.star.awt.Rectangle
   Dim Rk As Object
   Rk = createUnoStruct("com.sun.star.awt.Rectangle")
   With Rk
      .X = nX
      .Y = nY
      .Width = nWidth
      .Height = nHeight
   End With
   MkRk() = Rk
End Function

Function CreateWindow( oLocToolkit As Object, aLocRect As com.sun.star.awt.Rectangle ) As com.sun.star.awt.WindowDescriptor
Dim WDesc
WDesc = createUnoStruct("com.sun.star.awt.WindowDescriptor")
With WDesc
.Type = com.sun.star.awt.WindowClass.SIMPLE
.WindowServiceName = "floatingwindow"
.Parent = CW
.ParentIndex = -1
.Bounds = aLocRect
End With
With com.sun.star.awt.WindowAttribute
WDesc.WindowAttributes = .BORDER + .SHOW + .SIZEABLE + .MOVEABLE + .CLOSEABLE
End With
CreateWindow = oLocToolkit.createWindow(WDesc)
End Function

Function CreateCtrWithProp( CtrType, aPosSize, aPropNames, aPropValues )
Dim oCtr As Object, oCtrModel As Object
oCtr = createUnoService("com.sun.star.awt.UnoControl" & CtrType )
oCtrModel = createUnoService("com.sun.star.awt.UnoControl" & CtrType & "Model" )
oCtrModel.setPropertyValues( aPropNames, aPropValues )
With oCtr
.setModel(oCtrModel)
.setPosSize( aPosSize.X, aPosSize.Y, aPosSize.Width, aPosSize.Height, _
com.sun.star.awt.PosSize.POSSIZE )
End With
CreateCtrWithProp() = oCtr
End Function

Sub Window_windowResized(oEvt)
   iX=oEvt.Width
   iY=oEvt.Height
   ucc.setPosSize( 0, 0, iX, iY, com.sun.star.awt.PosSize.POSSIZE )
   oEdit1.setPosSize( 0, 0, iX, iY, com.sun.star.awt.PosSize.POSSIZE )
End Sub
Sub Window_windowMoved(oEvt)
End Sub
Sub Window_windowShown(oEvt)
End Sub
Sub Window_windowHidden(oEvt)
End Sub
ubuntu 12.04 + LibO3.6.0

Рыбка Рио

Последний вариант с изменяемым в течение 5 секунд размером окна в виде расширения. Запускается в Calc из меню Сервис/Дополнения/Поиск... (В этом варианте правда есть недостаток - в течение 5 секунд если закрыть окошко то Basic укажет на ошибку) (Библиотеку Basic можно отредактировать - она называется search_in_calc)

[вложение удалено Администратором]
ubuntu 12.04 + LibO3.6.0

svvord

А мне думается что автофильтр тут наиболее подходящее решение... Безо всяких макросов.

Natali

Клио,  спасибо большое за расширение, все поставила, все работает.Вы облегчили жизнь....
Небольшие уточнения:
  1) Ваше расширение по лицензии--открытое?
  2) Возможно сделать чтобы в окошке найденные числа отображались ввиде ссылок --при нажатии на нужное число --курсор находил это число в моем рабочем листе?
  3) Возможно назначить сочетание клавиш на вызов расширения (а не заходить в Сервис/Дополнения/Поиск... )  ?
Наталья Н.

Рыбка Рио

Цитата: Natali от 18 февраля 2011, 07:323) Возможно назначить сочетание клавиш на вызов расширения (а не заходить в Сервис/Дополнения/Поиск... )  ?
Наталья Н.
Да, можно, а какой сочетание удобно? Можно сделать что сразу после установки расширения  это сочетание клавиш будет работать, а можно зайтив меню Сервис/Настройка... - вкладка Клавиатура - Категория макросы, и назначить там любое сочетание.
YouTube - Настройка сочетания клавиш для макроса

Цитата: Natali от 18 февраля 2011, 07:322) Возможно сделать чтобы в окошке найденные числа отображались ввиде ссылок --при нажатии на нужное число --курсор находил это число в моем рабочем листе?
Наверняка можно, попробую сделать что-нибудь в новой версии.
Цитата: Natali от 18 февраля 2011, 07:321) Ваше расширение по лицензии--открытое?
Конечно (всё ведь открыто, да и как оно может быть закрыто - это же макрос=редактируй-нехочу) , если хотите, то LGPLv3, или любая открытая какая хотите.
ubuntu 12.04 + LibO3.6.0


Рыбка Рио

Вот новая версия. Она сама назначает комбинацию клавиш на Ctrl Shift F3 (также доступна через меню Сервис/Дополнения). YouTube - Поиск в Calc
Минимальная версия офиса - 3.3.0 (т.к. GridControl появился только c 3.3)
В течение 30 секунд окошко позволяет вам переходить с ячейки на ячейку и менять свой размер. Если его закрыть в течение этого времени, то открывается окошко Basic. После 30 секунд окошко уже не позволяет переходить с ячейки на ячейку и менять размер.

REM  *****  BASIC  *****

Dim floatingwindow As Object
Dim floatingframe As Object
Dim zToolkit As Object
Dim CW As Object
Dim ucc As Object, oGrid1 As Object
Dim Doc As Object, Sheet As Object
Dim sAddr(0) As String
Dim sVal(0) As String
Dim Kc

Sub Main
Doc=ThisComponent
Sheet=Doc.CurrentController.ActiveSheet
SD=Sheet.createSearchDescriptor
SD.searchRegularExpression=TRUE
SchStr=inputbox("Введите, что найти?","Что найти?","")
If SchStr="" then Exit Sub
SD.SearchString=SchStr
K=Sheet.findAll(SD)
If IsNull(K) then msgbox "Ничего не найдено" : Exit Sub
Kc=K.Count-1
Redim Kr(Kc)
Redim sAddr(Kc) As String
Redim sVal(Kc) As String
Dim S(0) As String

For i=0 to Kc
   ArAddr=Split(K(i).AbsoluteName,".")
   sAddr(i)=Join(Split(ArAddr(1),"$"),"")
   Nk=ubound(K(i).DataArray)
   Redim S(Nk) As String
   For j=0 to Nk
      S(j)=Join(K(i).DataArray(j),";")
   Next
   sVal(i)=Join(S(),";")   
Next
FlWindow
End Sub

Sub FlWindow
CW=Doc.CurrentController.Frame.ComponentWindow
WL = createUnoListener("Window_", "com.sun.star.awt.XWindowListener")
zToolkit=CW.getToolkit()

xsz=300
ysz=200

floatingframe = GetProcessServiceManager.createInstanceWithContext("com.sun.star.frame.Frame", GetDefaultContext)
floatingwindow = CreateWindow(zToolkit, MkRk(800,100,xsz,ysz))
floatingframe.initialize(floatingwindow)
floatingwindow.addWindowListener(WL)
   
ucc = CreateCtrWithProp( "Container", MkRk(0,0,xsz,ysz), Array(), Array())
ucc.createPeer( zToolkit, floatingwindow )
floatingframe.setComponent(ucc,Null)

oGrid1 = createUnoService("com.sun.star.awt.grid.UnoControlGrid")
oGrid1Model = createUnoService("com.sun.star.awt.grid.UnoControlGridModel")
oGrid1Model.setPropertyValues( Array("HScroll", "SelectionModel", "ShowColumnHeader", "ShowRowHeader", "VScroll"),_
                        Array(True, com.sun.star.view.SelectionType.SINGLE, True, False, True) )
oGrid1.setModel(oGrid1Model)
oGrid1.setPosSize(0,0,xsz,ysz, com.sun.star.awt.PosSize.POSSIZE )
dataModel = createUnoService("com.sun.star.awt.grid.DefaultGridDataModel" )
colModel = createUnoService("com.sun.star.awt.grid.DefaultGridColumnModel")
Ts()=Array("Адрес","Значение")
For Each T in Ts
            gridCol = createUnoService("com.sun.star.awt.grid.GridColumn")
            gridCol.Title = T
            colModel.addColumn(gridCol)
         oGrid1Model.ColumnModel = colModel
         oGrid1Model.GridDataModel = dataModel   
Next
oGDM=oGrid1Model.GridDataModel
For i=0 to Kc
   oGDM.addRow("",Array(sAddr(i),sVal(i)))
Next
ucc.addControl("oGrid1",oGrid1)
SL=createUnoListener("SL_","com.sun.star.awt.grid.XGridSelectionListener")
oGrid1.addSelectionListener(SL)
Wait 30000
oGrid1.removeSelectionListener(SL)
floatingwindow.removeWindowListener(WL)
End Sub

Function MkRk( nX As Long, nY As Long, nWidth As Long, nHeight As Long ) As com.sun.star.awt.Rectangle
   Dim Rk As Object
   Rk = createUnoStruct("com.sun.star.awt.Rectangle")
   With Rk
      .X = nX
      .Y = nY
      .Width = nWidth
      .Height = nHeight
   End With
   MkRk() = Rk
End Function

Function CreateWindow( oLocToolkit As Object, aLocRect As com.sun.star.awt.Rectangle ) As com.sun.star.awt.WindowDescriptor
Dim WDesc
WDesc = createUnoStruct("com.sun.star.awt.WindowDescriptor")
With WDesc
.Type = com.sun.star.awt.WindowClass.SIMPLE
.WindowServiceName = "floatingwindow"
.Parent = CW
.ParentIndex = -1
.Bounds = aLocRect
End With
With com.sun.star.awt.WindowAttribute
WDesc.WindowAttributes = .BORDER + .SHOW + .SIZEABLE + .MOVEABLE + .CLOSEABLE
End With
CreateWindow = oLocToolkit.createWindow(WDesc)
End Function

Function CreateCtrWithProp( CtrType, aPosSize, aPropNames, aPropValues )
Dim oCtr As Object, oCtrModel As Object
oCtr = createUnoService("com.sun.star.awt.UnoControl" & CtrType )
oCtrModel = createUnoService("com.sun.star.awt.UnoControl" & CtrType & "Model" )
oCtrModel.setPropertyValues( aPropNames, aPropValues )
With oCtr
.setModel(oCtrModel)
.setPosSize( aPosSize.X, aPosSize.Y, aPosSize.Width, aPosSize.Height, _
com.sun.star.awt.PosSize.POSSIZE )
End With
CreateCtrWithProp() = oCtr
End Function

Sub Window_windowResized(oEvt)
   iX=oEvt.Width
   iY=oEvt.Height
   ucc.setPosSize( 0, 0, iX, iY, com.sun.star.awt.PosSize.POSSIZE )
   oGrid1.setPosSize( 0, 0, iX, iY, com.sun.star.awt.PosSize.POSSIZE )
End Sub
Sub Window_windowMoved(oEvt)
End Sub
Sub Window_windowShown(oEvt)
End Sub
Sub Window_windowHidden(oEvt)
End Sub

Sub SL_selectionChanged(oEvt)
   Doc.CurrentController.select(Sheet.getCellRangeByName(sAddr(oEvt.Row)))
End Sub




[вложение удалено Администратором]
ubuntu 12.04 + LibO3.6.0

Рыбка Рио

Вот этот макрос на питоне работает без ограничений по времени.
(его нужно сохранить с расширением py и положить в папку Scripts/python/name.py - тогда он будет виден в макросах Питона). Можно просто установить расширение версии 0.2.3 (во вложении) - работает из меню и по Ctrl Shift F3. Более продвинутая версия 0.3.4 - там есть перевод на английский язык, и оно немного по другому сделано (не макрос на Питоне, а компонент на Питоне).

# -*- encoding: UTF-8 -*--*-

import uno
import unohelper

from com.sun.star.awt import XWindowListener
from com.sun.star.awt.grid import XGridSelectionListener

from com.sun.star.awt import Rectangle, WindowDescriptor
from com.sun.star.awt.WindowClass import MODALTOP, SIMPLE as WC_SIMPLE
from com.sun.star.awt.VclWindowPeerAttribute import OK, OK_CANCEL, YES_NO, YES_NO_CANCEL, RETRY_CANCEL, DEF_OK, DEF_CANCEL, DEF_RETRY, DEF_YES, DEF_NO
from com.sun.star.awt.WindowAttribute import BORDER as WA_BORDER, SHOW as WA_SHOW, SIZEABLE as WA_SIZEABLE, MOVEABLE as WA_MOVEABLE, CLOSEABLE as WA_CLOSEABLE
from com.sun.star.awt.PosSize import POSSIZE as PS_POSSIZE, SIZE as PS_SIZE
from com.sun.star.view.SelectionType import SINGLE as ST_SINGLE

class GridSelectionListener(unohelper.Base, XGridSelectionListener):
   def __init__(self, document, Sheet, sAddr):
      self.document = document
      self.sheet = Sheet
      self.sAddr = sAddr
   def selectionChanged(self, ev):
      #MessageBox(self.document, str(len(self.sAddr)))#str(ev.Row))

      self.document.CurrentController.select(self.sheet.getCellRangeByName(self.sAddr[ev.Row]))

class GridWindowListener(unohelper.Base,XWindowListener):
   def __init__(self, grid, cont):
      self.grid = grid
      self.cont = cont
   def disposing(self,ev): pass
   def windowMoved(self,ev): pass
   def windowShown(self,ev): pass
   def windowHidden(self,ev): pass
   def windowResized(self,ev):
      self.grid.setPosSize(0, 0, ev.Width, ev.Height, PS_SIZE)
      self.cont.setPosSize(0, 0, ev.Width, ev.Height, PS_SIZE)

def main():
   document = XSCRIPTCONTEXT.getDocument()
   ctx = uno.getComponentContext()
   smgr = ctx.ServiceManager
   Sheet=document.CurrentController.ActiveSheet
   #mri = smgr.createInstanceWithContext("mytools.Mri",ctx)

   SD=Sheet.createSearchDescriptor()
   #mri.inspect(SD)

   SD.setPropertyValue('searchRegularExpression', True)
   txt, state = inputdlg(ctx, smgr, u'Введите, что найти?', u'Что найти?', '')
   if not state or txt=='':
      MessageBox(document, u'пусто или отменено')
      return
   SD.SearchString=txt
   K=Sheet.findAll(SD)
   #mri.inspect(K)

   if not K:
      MessageBox(document, u'ничего не найдено')
      return
   Kc=K.Count
   sAddr=[]
   sVal=[]
   S=[]
   for i in range(Kc):
      Ki=K.getByIndex(i)
      ArAddr=Ki.AbsoluteName.split(".")
      sAddr.append( "".join(ArAddr[1].split('$')) )
      del S[:]
      for dt in Ki.FormulaArray:#DataArray:
         S.append( ",".join(dt) )
      sVal.append(";".join(S))
   #document.CurrentController.select(Sheet.getCellRangeByName(sAddr[0]))

   #MessageBox(document, str(sAddr[0]))

   create_floating_window(document, Sheet, sAddr, sVal, ctx, smgr, '')


def inputdlg(ctx, smgr, label='', txt='', init=''):
   dialog = smgr.createInstanceWithContext(
      'com.sun.star.awt.UnoControlDialog',ctx)
   dialog_model = smgr.createInstanceWithContext(
      'com.sun.star.awt.UnoControlDialogModel',ctx)
   dialog_model.setPropertyValues(
      ('Height','PositionX','PositionY','Width',),
      (65,30,50,177,) )
   
   line_model = dialog_model.createInstance(
      'com.sun.star.awt.UnoControlFixedLineModel')
   line_model.setPropertyValues(
      ('Height','PositionX','PositionY','Width',),
      (12,4,1,170) )
   edit_model = dialog_model.createInstance(
      'com.sun.star.awt.UnoControlEditModel')
   edit_model.setPropertyValues(
      ('Height','MultiLine','PositionX','PositionY','Width',),
      (13,False,2,15,171,) )
   cbtn_model = dialog_model.createInstance(
      'com.sun.star.awt.UnoControlButtonModel')
   cbtn_model.setPropertyValues(
      ('Height','Label','PositionX','PositionY','PushButtonType','Width',),
      (14,'~cancel',142,48,2,29,) )
   obtn_model = dialog_model.createInstance(
      'com.sun.star.awt.UnoControlButtonModel')
   obtn_model.setPropertyValues(
      ('DefaultButton','Height','Label','PositionX',
      'PositionY','PushButtonType','Width',),
      (True,14,'~OK',142,32,1,29,) )
   label_model = dialog_model.createInstance(
      'com.sun.star.awt.UnoControlFixedTextModel')
   label_model.setPropertyValues(
      ('FontHeight','Height','MultiLine','PositionX','PositionY','Width',),
      (8,30,True,2,30,130) )
   
   dialog_model.insertByName('line',line_model)
   dialog_model.insertByName('cbtn',cbtn_model)
   dialog_model.insertByName('obtn',obtn_model)
   dialog_model.insertByName('edit',edit_model)
   dialog_model.insertByName('label',label_model)
   
   line_model.Label = label
   label_model.Label = txt
   edit_model.Text = init
   
   dialog.setModel(dialog_model)
   dialog.setVisible(True)
   dialog.getControl('edit').setFocus()
   
   state = dialog.execute()
      
   if state:
      txt = dialog_model.getByName('edit').Text
   else:
      txt = ''
      dialog.dispose()
      
   return (txt,state)

def MessageBox(document, MsgText, MsgTitle='Info'):
   ParentWin = document.getCurrentController().Frame.ContainerWindow
   descriptor = WindowDescriptor()
   descriptor.Type = MODALTOP
   descriptor.WindowServiceName ='infobox' #available MsgTypes('messbox', 'infobox', 'errorbox', 'warningbox', 'querybox')

   descriptor.ParentIndex = -1
   descriptor.Parent = ParentWin
   descriptor.WindowAttributes = OK #OK, OK_CANCEL, YES_NO, YES_NO_CANCEL, RETRY_CANCEL, DEF_OK, DEF_CANCEL, DEF_RETRY, DEF_YES, DEF_NO

   tk = ParentWin.getToolkit()
   msgbox = tk.createWindow(descriptor)
   msgbox.setMessageText(MsgText)
   msgbox.setCaptionText(MsgTitle)
   return msgbox.execute()

def create_floating_window(document, Sheet, sAddr, sVal, ctx, smgr, arr=''):
   ParentWin = document.getCurrentController().Frame.ContainerWindow
   WINDOW_HEIGHT = 200
   WINDOW_WIDTH = 300
   x = 800
   y = 100
   toolkit = ParentWin.getToolkit()
   frame = smgr.createInstanceWithContext('com.sun.star.frame.Frame', ctx)
   rect = Rectangle(x, y, WINDOW_WIDTH, WINDOW_HEIGHT)
   window = toolkit.createWindow(WindowDescriptor(WC_SIMPLE, 'floatingwindow', ParentWin, -1, rect, WA_BORDER + WA_SHOW + WA_SIZEABLE + WA_MOVEABLE + WA_CLOSEABLE))
   frame.initialize(window)
   cont = smgr.createInstanceWithContext('com.sun.star.awt.UnoControlContainer', ctx)
   cont_model = smgr.createInstanceWithContext('com.sun.star.awt.UnoControlContainerModel', ctx)
   cont.setModel(cont_model)
   cont.createPeer(toolkit,window)
   cont.setPosSize(0,0,WINDOW_WIDTH,WINDOW_HEIGHT,PS_POSSIZE)
   #cont_model.BackgroundColor = window.getAccessibleContext().Background

   cont_model.BackgroundColor = 0xFAFAFA
   frame.setComponent(cont,None)
   grid = smgr.createInstanceWithContext('com.sun.star.awt.grid.UnoControlGrid', ctx)
   grid_model = smgr.createInstanceWithContext('com.sun.star.awt.grid.UnoControlGridModel', ctx)
   grid_model.setPropertyValues(('HScroll', 'SelectionModel', 'ShowColumnHeader', 'ShowRowHeader', 'VScroll'),(True, ST_SINGLE, True, False, True))
   grid.setModel(grid_model)
   grid.setPosSize(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, PS_POSSIZE)
   gridModel = grid.getModel()
   dataModel = smgr.createInstanceWithContext('com.sun.star.awt.grid.DefaultGridDataModel', ctx)
   colModel = smgr.createInstanceWithContext('com.sun.star.awt.grid.DefaultGridColumnModel', ctx)
   Ts = (u'Адрес', u'Значение')
   for T in Ts:
      gridCol = smgr.createInstanceWithContext('com.sun.star.awt.grid.GridColumn', ctx)
      gridCol.Title = T
      colModel.addColumn(gridCol)
   #mri = smgr.createInstanceWithContext("mytools.Mri",ctx)

   #mri.inspect(colModel)

   colModel.Columns[0].ColumnWidth = 1
   gridModel.ColumnModel = colModel
   gridModel.GridDataModel = dataModel
   GDM=gridModel.GridDataModel
   j=0
   for sAdr in sAddr:
      GDM.addRow("",(sAdr,sVal[j]))
      j=j+1
   cont.addControl('grid', grid)
   window.addWindowListener( GridWindowListener(grid, cont) )
   grid.addSelectionListener( GridSelectionListener(document, Sheet, sAddr) )
   window.setVisible(True)

g_exportedScripts = main,


[вложение удалено Администратором]
ubuntu 12.04 + LibO3.6.0