# [reportlab-users] Re: Problem with spanned columns when a platypus

Andre Reitz reitz at inworks.de
Tue Jan 11 16:51:00 EST 2005

```Spans currently are ignored when Tables are split.

I solved this with the following patch.
It would be very helpful for me and I think for other users if somebody
would apply the patch to the subversion tree, so that it is available in
the next release.

Greetings and thanks to all for this nice and useful library,

Andre'

---------------------------------------------------------------------------------------
Index: reportlab/platypus/tables.py
===================================================================
--- reportlab/platypus/tables.py	(revision 2509)
+++ reportlab/platypus/tables.py	(working copy)
@@ -833,16 +833,38 @@
if er>=n: er = er-n

+    def _getFirstPossibleSplitRowPosition(self,availHeight):
+        if self._spanCmds:
+            impossible={}
+            for xy in self._rowSpanCells:
+                r=self._spanRanges[xy]
+                if r!=None:
+                    y1,y2=r[1],r[3]
+                    if y1!=y2:
+                        ymin=min(y1,y2) #normalize
+                        ymax=max(y1,y2) #normalize
+                        y=y1+1
+                        while 1:
+                            if y>y2: break
+                            impossible[y]=None #split at position y is impossible because of overlapping rowspan
+                            y=y+1
+        else:
+            impossible={} # any split possible because table does *not* have rowspans
+      #------------------------------------------------------------------------
+        h = 0
+        n = 1
+    	split_at = 0 # from this point of view 0 is the first position where the table may *always* be splitted
+        for rh in self._rowHeights:
+            if h+rh>availHeight:
+                break
+            if not impossible.has_key(n):
+                split_at=n
+            h=h+rh
+            n=n+1
+        return split_at
def _splitRows(self,availHeight):
-        h = 0
-        n = 0
lim = len(self._rowHeights)
-        while n<self._hmax:
-            hn = h + self._rowHeights[n]
-            if hn>availHeight: break
-            h = hn
-            n = n + 1
-
+        n=self._getFirstPossibleSplitRowPosition(availHeight)
if n<=self.repeatRows:
return []

@@ -931,9 +953,25 @@

R0.hAlign = R1.hAlign = self.hAlign
R0.vAlign = R1.vAlign = self.vAlign
+        if self._spanCmds:
+            spans0,spans1=self._cloneSpanCommands(n)
+            R0._spanCmds=spans0
+            R1._spanCmds=spans1
self.onSplit(R0)
self.onSplit(R1)
return [R0,R1]
+    def _cloneSpanCommands(self,n):
+        spans0=[]
+        spans1=[]
+        for rng in self._spanRanges.values():
+            if rng:
+                if rng[0:2]!=rng[2:4]:
+                    x1,y1,x2,y2=rng
+                    assert (x1<=x2) and (y1<=y2), "_spanRanges does contain unexpected values!"
+                    assert not (y1<n and y2>=n) , "Something got wrong with _getFirstPossibleSplitRowPosition! %r" % [ys,ye,n]
+                    if y1< n and y2< n: spans0.append(("SPAN",(x1,y1  ),(x2,y2  )))
+                    if y1>=n and y2>=n: spans1.append(("SPAN",(x1,y1-n),(x2,y2-n)))
+        return spans0,spans1

def split(self, availWidth, availHeight):
self._calc(availWidth, availHeight)
---------------------------------------------------------------------------------------

-------------- next part --------------
A non-text attachment was scrubbed...
Name: tables.py.diff
Type: text/x-patch
Size: 3009 bytes
Desc: not available
Url : http://two.pairlist.net/pipermail/reportlab-users/attachments/20050111/6f3e7844/tables.py.bin
```