Page 1 of 1
interface XMergeableCell
Posted: Wed Nov 25, 2015 9:18 am
by skar-1980
Hello!
I'm trying to understand how to work with single cell in merged cell range. When I use .getIsMerged(), it returns TRUE only for top-left cell in merged ranged for other cell in merged range FALSE is returned. How to get, that cell is in merge.
Official says that interface XMergeableCell has .getRowSpan and .getColumnSpan methods.
http://www.openoffice.org/api/docs/comm ... eCell.html
Object Xcell return error for these methods.
Oleg.
Thx for help!
Re: interface XMergeableCell
Posted: Wed Nov 25, 2015 2:41 pm
by B Marcelly
Hi,
Interface com.sun.star.
table.XMergeableCell exists for a cell in a
Writer table.
Same remark for com.sun.star.
table.XMergeableCellRange.
Calc uses interfaces com.sun.star.
util.XMergeable
See
Merging Cell Ranges into a Single Cell
See also method collapseToMergedArea() of interface com.sun.star.sheet.XSheetCellCursor.
Developer's Guide
Cell Cursor, Cursor Movement.
Re: interface XMergeableCell
Posted: Wed Nov 25, 2015 9:22 pm
by skar-1980
Thx Bernard! It's first time I use Cursor and it takes time to understand XSheet.CreateCursorByRange().
I write in that way.
Is it possible not to check every xCell?
Code: Select all
Sub Main
GlobalScope.BasicLibraries.LoadLibrary("MRILib")
'Dim d as Object 'thiscomponent
'Dim m as Object 'CellRange to Merge
'Dim x as Object 'Cell to Find IsMerged() = True
'Dim c as Object 'Cursor
'd=createUnoService ("com.sun.star.frame.Desktop")
d=thiscomponent
m=d.Sheets(0).getCellRangeByName("a1:x18") '(" : ")anyRange
m.merge(TRUE)
Dim column as Integer
Dim row as Long
Dim ForExit as Integer 'to exit Sub
for column% = 0 to 1024
'row = 0
for row = 0 to 1048576 '! That's too much and get time. Ex for Range "AC1:AD16"
x=d.Sheets(0).getCellByPosition(column,row)
if x.IsMerged() = TRUE then
CollapseToMergedArea(d,x,ForExit)
if ForExit = 2 then
exit Sub
end If
else
end if
next
next
End Sub
Function CollapseToMergedArea (d,x,Optional ForExit as Integer)
c=d.Sheets(0).createCursorByRange(x)'
c.collapseToMergedArea() = TRUE
ForExit = msgbox (c.AbsoluteName,1)
End Function
Re: interface XMergeableCell
Posted: Wed Nov 25, 2015 10:15 pm
by Villeroy
obj.getUniqueCellFormatRanges() returns an array of range collections.
Each range collection consists of cell ranges with exact same format attributes. Obj can be any single rectangle of cells. A sheet is a rectangle of cells.
Merging cells (the visible top-left cells of a merged range where getIsMerged() returns True) appear in separate range collections.
Code: Select all
a() = oSheet.getUniqueCellFormatRanges()
for each obj in a()
for i = 0 to obj.getCount()-1
oRange = obj.getByIndex(i)
if oRange.getIsMerged() then
x = getMergedArea(oRange)
etc, etc
else
exit for 'skip the for i loop because if this one is not merged the others aren't neither
endif
If you want to get rid of all merges on a sheet (which is the only thing I would do with that interface):
objSheet.merge(False) is enough.
Re: interface XMergeableCell
Posted: Thu Nov 26, 2015 2:48 pm
by skar-1980
Ok, I'm sorry for my ignorance. Villeroy, I understand you code logically. Sheets()->Sheet()->Range()->for_loop->if->...result->end. But due to lack of exerience ...
What is "obj"? I could not find clear information about it. Could you clear it, please. Just point me way and how to find "obj as .XSheetCellRangeContainer" appeared? All what I trying to do is step by step executing macros.
"getMergedArea" function is found at topic "Lets help Calc solve insert/delete row within merged range".
Code: Select all
Function getMergedArea (oRange)
oCursor = oRange.getSpreadsheet().createCursorByRange(oRange)
oCursor.collapseToMergedArea()
getMergedAreas = oCursor
End Function
Thank you.