Python ReportLab 中理解表格坐标系

6

我对ReportLab表格样式的坐标系有些困惑。

根据他们的文档:

每个命令的第一个元素是其标识符,第二个和第三个参数确定受影响的单元格框的单元格坐标,其中负坐标从限制值向后计数,就像Python索引一样。

坐标以(列,行)的形式给出,这遵循电子表格“A1”模型,但不是更自然(对于数学家来说)的“RC”排序。左上角的单元格为(0, 0),右下角的单元格为(-1, -1)

如果右下角始终为(-1, -1),那么中间的行和列是否为分数?这似乎没有意义。在下面的示例中,如果绿色从位置(1,1)开始,则坐标系从0到-1,而第二个坐标系(-2,-2)如何偏移原点位置?

from reportlab.lib import colors
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle

doc = SimpleDocTemplate("simple_table.pdf", pagesize=letter)
# container for the 'Flowable' objects
elements = []

data= [['00', '01', '02', '03', '04'],
       ['10', '11', '12', '13', '14'],
       ['20', '21', '22', '23', '24'],
       ['30', '31', '32', '33', '34']]
t=Table(data)
t.setStyle(TableStyle([('BACKGROUND',(1,1),(-2,-2),colors.green),
                       ('TEXTCOLOR',(0,0),(1,-1),colors.red)]))
elements.append(t)
# write the document to disk
doc.build(elements)

enter image description here


这些表格样式应用于单元格而非像素坐标。 - Joran Beasley
1
@JoranBeasley,我知道,但我的问题仍然适用于它们作为表格坐标。您能否详细说明一下? - user2242044
1
我猜我不理解你的问题... 你不需要使用负数索引... 在这种情况下,TABLE[-1,-1]TABLE[3,4]完全相同。在Python中,您可以使用-1访问列表的末尾,因此TABLE[-1]是最后一行,TABLE[-1][-1]只是最后一行的最后一列(也许我搞混了行/列的顺序)。 - Joran Beasley
那么负一不像从原点位置减去一吗? - user2242044
这里也有同样的问题。在代码中如何使TABLE不再以[-2][-2]处呈现绿色? - alextc
@alextc。我解决了问题并发布了自己的答案。希望能有所帮助。 - user2242044
3个回答

11

我终于明白了,所以发表自己的答案。你必须将负坐标系和正坐标系视为完全独立的。正坐标系从左上角的[1][1]开始,随着向下和向右移动而递增数值。负坐标系从[-1][-1]开始,随着向上和向左移动递减(更大的负数)。

在这个例子中:('BACKGROUND',(1,1),(-2,-2),colors.green)虽然两个坐标使用不同的相对起始位置,但定义了一个框的左上角和右下角。


我还是很困惑。 (1,1) 和 (-2,-2) 坐标怎么可能构成一个正好位于桌子中央的矩形?我不确定你在 [1][1] 和 [-1][-1] 正负系统中指的是什么。为什么它们要用方括号括起来?我得说 reportlab 的样式相当奇怪,甚至将行和列颠倒。 - Pherdindy
1
好的,我现在明白了。reportlab 的结构方式绝对是一种奇怪的方式。但基本上左上角的第一个单元格是 (0, 0),最右下角的单元格是 (-1, -1),所以 TableStyle 的第二个参数中坐标为 (1, 1) 的单元格是相对于 (0, 0) 右移一个单元格,下移一个单元格,而第三个参数中坐标为 (-2, -2) 的单元格是相对于 (-1, -1) 左移一个单元格,上移一个单元格。这是我的理解。我认为上面的答案有点误导。 - Pherdindy

6

表格的 Reportlab 坐标(示例)

假设您的表格大小为 (5,4),那么这就是您需要遵循的坐标!


3

我发现将单元格视为列表,而不是坐标,对于这个问题来说更容易理解。在这个例子中,左上角的单元格是(0,0),最后一列是4,也可以表示为-1,就像一个列表一样。这个例子中倒数第二列是3,也可以表示为-2等等。

我发现挑战在于单元格引用是(col, row)而不是(row, col)。


加一,以快速预览。表坐标系使用反转的笛卡尔系统和列表索引的混合。列表索引允许从末尾定义单元格。因此,在不知道表将有多少单元格时可以使用。 - Johny English

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接