请选择 进入手机版 | 继续访问电脑版

LibreOffice 中文社区

 找回密码
 马上加入

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
开启左侧

发起编写calc的“定位”扩展

[复制链接]
jmxhyz 发表于 2016-4-24 20:13:40 | 显示全部楼层 |阅读模式
“定位”,只不过是把查找、筛选的功能简化为一目了然的操作,确实也方便。

好吧,就由我们这个中文社区来编写一个“定位”插件吧。代码还是比较简单的
代码,我稍后给出主要的功能实现。

不过我还没有编写过扩展插件,@ACTom @suokunlong ,两位大侠是否可以提供帮助?完善?
主要是加上设置对话框之类,然后是生成插件。
 楼主| jmxhyz 发表于 2016-4-24 22:56:53 | 显示全部楼层
本帖最后由 jmxhyz 于 2016-4-24 22:58 编辑

[Visual Basic] 纯文本查看 复制代码
REM  *****  BASIC  *****

REM 以下代码主要功能:
REM 1、选择要查找定位的区域
REM    TODO:如果没有指定区域(当前只选中一个单元格),那么自动扩展选择区域
REM 2、选择所需要的定位条件(运行相应的Sub过程)
REM    TODO:添加设置对话框(模仿Excel的定位对话框),根据用户选择运行相应的Sub
REM 3、返回:在工作表上选中所有找到的单元格
REM    TODO:添加结果显示框(或者在设置对话框下加List控件),
REM          把定位结果添加到List(包括单元格地址及其当前内容,
REM          参考“查找与替换”的“全部查找”的“搜索结果”对话框)
REM          点击List上某单元格地址,再定位到工作表上相应单元格

'根据单元格内容的类型查找
'似乎LibreOffice有Bug,无法定位批注单元格
Sub location_CellContent
    oDoc = ThisComponent
    oController = oDoc.getCurrentController
    oSheet = oController.activeSheet
    oSel = oDoc.getCurrentSelection()
    oCells = oSel.queryContentCells(23)  'Find the cells with content
REM queryContentCells() looks for cells with certain kinds of content.
REM Pure Values = 1, DateTime = 2, String = 4, Annotation = 8, Formula = 16,
REM HARDATTR = 32, STYLES = 64, OBJECTS = 128, EDITATTR = 256, FORMATTED = 512
REM See [url=http://api.libreoffice.org/docs/idl/ref/namespacecom_1_1sun_1_1star_1_1sheet_1_1CellFlags.html]http://api.libreoffice.org/docs/ ... t_1_1CellFlags.html[/url]
REM I chose to search for Values, DateTimes, Strings and Formulas. The search value is then 1 + 2 + 4 + 16 = 23
    thiscomponent.currentController.select(oCells)

End Sub

'列中差异值 queryColumnDifferences

'行中差异值
Sub location_RowDifferences
    oDoc = ThisComponent
    oController = oDoc.getCurrentController
    oSheet = oController.activeSheet
    oSel = oDoc.getCurrentSelection()
'    xray oSel
    REM 检测多重选择区域
    If not oSel.supportsService("com.sun.star.sheet.SheetCellRange") then
        MsgBox "mulit selct"
        Exit sub
    End If
    oRanges = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
    Dim sCellAddress As New com.sun.star.table.CellAddress
    oCellAddress = oSel.RangeAddress
    If oCellAddress.EndColumn <= StartColumn Then
        msgbox "选择行区域"
        Exit Sub
    End if
    For i = oCellAddress.StartRow To oCellAddress.EndRow
        sCellAddress.Sheet = oCellAddress.Sheet
        sCellAddress.Column = oCellAddress.StartColumn
        sCellAddress.Row = i
        
        oFilter = oSel.queryRowDifferences(sCellAddress)
        'xray oFilter
        aRange = oFilter.RangeAddresses
        For j = 0 To UBound(aRange)
               oRanges.addRangeAddress(aRange(j), False) 'Merge
           Next
    Next
    
    thiscomponent.currentController.select(oRanges)

End Sub

'定位公式单元格(公式错误、数字值、字符值)
Sub location_Formula
    oDoc = ThisComponent
    oController = oDoc.getCurrentController
    oSheet = oController.activeSheet
    oSel = oDoc.getCurrentSelection()
    
    REM 检测多重选择区域
    If not oSel.supportsService("com.sun.star.sheet.SheetCellRange") then
        MsgBox "mulit selct"
        Exit sub
    End If
    'oFilter = oSel.queryFormulaCells(com.sun.star.sheet.FormulaResult.ERROR) 'STRING VALUE
    'oFilter = oSel.queryFormulaCells(com.sun.star.sheet.FormulaResult.STRING)
    oFilter = oSel.queryFormulaCells(com.sun.star.sheet.FormulaResult.VALUE)
    thiscomponent.currentController.select(oFilter)
End Sub

'定位空单元格
Sub location_Empty
    oDoc = ThisComponent
    oController = oDoc.getCurrentController
    oSheet = oController.activeSheet
    oSel = oDoc.getCurrentSelection()
    
    REM 检测多重选择区域
    If not oSel.supportsService("com.sun.star.sheet.SheetCellRange") then
        MsgBox "mulit selct"
        Exit sub
    End If
    oFilter = oSel.queryEmptyCells
    thiscomponent.currentController.select(oFilter)
End Sub

REM 定位公式引用和从属,用“工具--追踪”更好。
REM 追踪引用Shift+F9, 追踪从属Shift+F5
REM queryDependents           ( bRecursive as boolean )        AS com.sun.star.sheet.XSheetCellRanges                      com.sun.star.sheet.XFormulaQuery
REM queryPrecedents           ( bRecursive as boolean )        AS com.sun.star.sheet.XSheetCellRanges                      com.sun.star.sheet.XFormulaQuery
REM 下面这个好像不须用了
REM queryIntersection         ( aRange as com.sun.star.table.CellRangeAddress ) AS com.sun.star.sheet.XSheetCellRanges     com.sun.star.sheet.XCellRangesQuery



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?马上加入

x
ACTom 发表于 2016-4-26 10:30:56 | 显示全部楼层
你这个基本已经完成了,只剩下打包了,可以参考我之前写的扩展,解压后,修改就成。
 楼主| jmxhyz 发表于 2016-4-26 15:52:27 | 显示全部楼层
ACTom 发表于 2016-4-26 10:30
你这个基本已经完成了,只剩下打包了,可以参考我之前写的扩展,解压后,修改就成。 ...

一些代码就是参考了你之前的扩展

现在的主要问题是,因为之前不曾使用过宏的“对话框”,这次打算制作“定位对话框”,
才知道这个对话框是独占模式的(model),
好像没办法在宏中实现modeless dialog box?
这在使用方便性上要打折扣了。
ACTom 发表于 2016-4-27 08:39:29 | 显示全部楼层
jmxhyz 发表于 2016-4-26 15:52
一些代码就是参考了你之前的扩展

现在的主要问题是,因为之前不曾使用过宏的“对话框”,这次 ...

http://stackoverflow.com/questio ... working-as-intended
看看这篇说的方法是否可用
 楼主| jmxhyz 发表于 2016-4-28 11:12:21 | 显示全部楼层
ACTom 发表于 2016-4-27 08:39
http://stackoverflow.com/questions/34490688/libreoffice-dialog-not-working-as-intended
看看这篇说 ...

这个不行。
dialogbox可以set visible,但这个时候上面的控件是无法使用的。
必须execute才能用。而一旦execute,就是独占的,必须关闭了dialogbox,才能操作calc。

实现功能的代码很简单,但要搞个图形界面,反而工作量倍增。怪不得“定位”没人搞
ACTom 发表于 2016-4-29 09:18:51 | 显示全部楼层
jmxhyz 发表于 2016-4-28 11:12
这个不行。
dialogbox可以set visible,但这个时候上面的控件是无法使用的。
必须execute才能用。而一旦e ...

只是宏不好弄,原生的貌似不难,比如替换对话框
 楼主| jmxhyz 发表于 2016-4-30 21:04:50 | 显示全部楼层
代码已经完成了,下来要打包。
上个界面给大家预览下。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?马上加入

x
suokunlong 发表于 2020-12-26 23:31:11 | 显示全部楼层
这个最后咋样了?
开放,包容,奉献。
suokunlong 发表于 2020-12-26 23:48:08 | 显示全部楼层
关于你说的对话框如何设置为非模态(modal)的问题,我找到了这篇问答,可能有用:
https://ask.libreoffice.org/en/q ... dal-with-documents/

具体地:DesktopAsParent
[Plain Text] 纯文本查看 复制代码
setProperties(oDlgModel, Array("PositionX", 50, "PositionY", 50,_
            "Width", iDlgWidth, "Height", iDlgHeight, "Title",_
            "Budget System - Average Expenses", "DesktopAsParent", True))
开放,包容,奉献。
*滑块验证:
您需要登录后才可以回帖 登录 | 马上加入

本版积分规则