Add support for calc ranges

This commit is contained in:
Mauricio Baeza 2021-07-04 13:19:03 -05:00
parent 45e3f97e6c
commit 6efa879c85
7 changed files with 109 additions and 4 deletions

Binary file not shown.

Binary file not shown.

View File

@ -435,3 +435,26 @@ Ranges
rango = sheet[1:5,1:4]
app.msgbox(rango.name)
* Group ranges
.. code-block:: python
doc = app.active
sheet = doc.active
last = doc[-1]
with doc.ranges as r:
# Add one range
r.add(sheet['A1:B2'])
r2 = sheet['C4:D5']
r3 = last['E7:D8']
r4 = last['E10:F12']
# Add multiple ranges
r.add((r2, r3, r4))
app.debug(r.names)
* Get the same range in all sheets
ranges = doc.get_ranges('A1:B1')
app.debug(ranges.names)

View File

@ -425,6 +425,31 @@
<span class="n">app</span><span class="o">.</span><span class="n">msgbox</span><span class="p">(</span><span class="n">rango</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</pre></div>
</div>
<ul class="simple">
<li><p>Group ranges</p></li>
</ul>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">doc</span> <span class="o">=</span> <span class="n">app</span><span class="o">.</span><span class="n">active</span>
<span class="n">sheet</span> <span class="o">=</span> <span class="n">doc</span><span class="o">.</span><span class="n">active</span>
<span class="n">last</span> <span class="o">=</span> <span class="n">doc</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="k">with</span> <span class="n">doc</span><span class="o">.</span><span class="n">ranges</span> <span class="k">as</span> <span class="n">r</span><span class="p">:</span>
<span class="c1"># Add one range</span>
<span class="n">r</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">sheet</span><span class="p">[</span><span class="s1">&#39;A1:B2&#39;</span><span class="p">])</span>
<span class="n">r2</span> <span class="o">=</span> <span class="n">sheet</span><span class="p">[</span><span class="s1">&#39;C4:D5&#39;</span><span class="p">]</span>
<span class="n">r3</span> <span class="o">=</span> <span class="n">last</span><span class="p">[</span><span class="s1">&#39;E7:D8&#39;</span><span class="p">]</span>
<span class="n">r4</span> <span class="o">=</span> <span class="n">last</span><span class="p">[</span><span class="s1">&#39;E10:F12&#39;</span><span class="p">]</span>
<span class="c1"># Add multiple ranges</span>
<span class="n">r</span><span class="o">.</span><span class="n">add</span><span class="p">((</span><span class="n">r2</span><span class="p">,</span> <span class="n">r3</span><span class="p">,</span> <span class="n">r4</span><span class="p">))</span>
<span class="n">app</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">names</span><span class="p">)</span>
</pre></div>
</div>
<ul>
<li><p>Get the same range in all sheets</p>
<blockquote>
<div><p>ranges = doc.get_ranges(A1:B1)
app.debug(ranges.names)</p>
</div></blockquote>
</li>
</ul>
</section>
</section>
</section>

File diff suppressed because one or more lines are too long

View File

@ -435,3 +435,26 @@ Ranges
rango = sheet[1:5,1:4]
app.msgbox(rango.name)
* Group ranges
.. code-block:: python
doc = app.active
sheet = doc.active
last = doc[-1]
with doc.ranges as r:
# Add one range
r.add(sheet['A1:B2'])
r2 = sheet['C4:D5']
r3 = last['E7:D8']
r4 = last['E10:F12']
# Add multiple ranges
r.add((r2, r3, r4))
app.debug(r.names)
* Get the same range in all sheets
ranges = doc.get_ranges('A1:B1')
app.debug(ranges.names)

View File

@ -2963,6 +2963,7 @@ class LOCalcRanges(object):
def __init__(self, obj):
self._obj = obj
self._ranges = {}
self._index = 0
def __enter__(self):
return self
@ -2976,20 +2977,53 @@ class LOCalcRanges(object):
def __contains__(self, item):
return self._obj.hasByName(item.name)
def __iter__(self):
self._index = 0
return self
def __next__(self):
try:
r = self.obj[self._index]
rango = self._ranges[r.AbsoluteName]
except IndexError:
raise StopIteration
self._index += 1
return rango
def __getitem__(self, index):
if isinstance(index, int):
r = self.obj[index]
rango = self._ranges[r.AbsoluteName]
else:
rango = self._ranges[index]
return rango
@property
def obj(self):
return self._obj
@property
def names(self):
return self._obj.ElementNames
return self.obj.ElementNames
@property
def data(self):
return [r.data for r in self._ranges.values()]
@property
def style(self):
return self.obj
@style.setter
def style(self, value):
self.obj.CellStyle = value
def add(self, rangos):
if isinstance(rangos, LOCalcRange):
rangos = (rangos,)
for r in rangos:
self._ranges[r.name] = r
self._obj.addRangeAddress(r.range_address, False)
self.obj.addRangeAddress(r.range_address, False)
return
def remove(self, rangos):
@ -2997,7 +3031,7 @@ class LOCalcRanges(object):
rangos = (rangos,)
for r in rangos:
del self._ranges[r.name]
self._obj.removeRangeAddress(r.range_address)
self.obj.removeRangeAddress(r.range_address)
return