如何在Crystal Reports 2008中垂直堆叠字段

时间:2012-01-18 23:34:00

标签: crystal-reports alignment crystal-reports-2008

我正在使用Crystal Reports 2008开发一些报告(在oracle数据库上)。

我的设计/布局中有许多文本字段,我希望它们位于垂直堆栈中,而且之间没有空格。

使用Oracle报告我可以选择字段并执行align-> stackvertical,但在CR2008中似乎没有类似的选项

“对齐”选项包括顶部,中间,底部,基线,左侧,中心,权限,网格。没有一个能做我想做的事。

有一种简单的方法吗?或者我只需要手动定位它们? (也许使用对齐网格)

6 个答案:

答案 0 :(得分:2)

already described如何使用“对象大小和位置”对话框手动对齐字段。我现在编写了一个Sikuli脚本来自动使用该对话框。我成功地使用该脚本在现有堆叠的字段下堆叠了大约70个新字段。

要使用此脚本,请将其内容复制并粘贴到Sikuli IDE中。打开Crystal Reports并在现有堆栈的底部找到该字段。确保要添加到堆栈底部的新字段存在且在屏幕上可见。选择堆栈底部的字段。然后切换到Sikuli并按 Ctrl R 启动脚本。它将切换到Crystal Reports并打开“大小和位置”对话框,读取堆栈底部字段的现有值,然后关闭对话框。您现在有1.5秒(可配置)通过单击选择新字段。现在,脚本将再次打开“大小和位置”对话框并设置X,Y,宽度和高度,以便将所选字段放在前一个字段下面。具体来说,X,Width和Height设置为与上面的字段相同,Y设置为my other answer中描述的。您可以更改配置变量VERTICAL_SPACE_BETWEEN_FIELDS以在每个字段之间添加空格,或者如果需要,可以使它们重叠。

脚本大约需要5秒钟来对齐一个字段。如果这太慢,您可以尝试减少时间或删除部分wait()来电。我添加了wait()调用,因为如果脚本过快,脚本有时会复制或粘贴错误的值。

这个脚本的一个好处是它是可链接的。完成后,仍将选择新对齐的字段。因此,如果您要在该字段下添加另一个字段,则可以使用 Ctrl R 再次运行该脚本,并准备好单击该字段中的下一个字段。中间。如果您计划多次连锁,可以增加range(1)中的1并在wait(<num_of_seconds>)下方添加mainAction(),以便脚本自动重复。请记住,链接要求添加的下一个字段在屏幕上可见,因此您可以使用鼠标选择它。

我将脚本文件保存为&#34;在Crystal Reports.sikuli&#34;中对齐字段。

# Crystal Reports: stack prompt-selected field under start-selected field

VERTICAL_SPACE_BETWEEN_FIELDS = 0.000
WAIT_TIME_FOR_USER_SELECT_NEW_FIELD = 1.5

def mainAction():
    # read size and position of bottom of stack
    above = dict()
    openSizeAndPositionDialog()
    above['x'] = copySelectedText()
    moveToNextField(2)
    above['y'] = copySelectedText()
    moveToNextField()
    above['width'] = copySelectedText()
    moveToNextField(2)
    above['height'] = copySelectedText()
    print("above", above)
    wait(0.05)
    type(Key.ESC)

    # calculate size and position of next field in stack
    new_field = dict()
    new_field['x'] = above['x']
    new_field['y'] = str(float(above['y']) + float(above['height']) + VERTICAL_SPACE_BETWEEN_FIELDS)
    new_field['width'] = above['width']
    new_field['height'] = above['height']
    print("new field", new_field)

    waitForUserToSelectNewField()

    # set size and position of next field
    openSizeAndPositionDialog()
    paste(new_field['x'])
    moveToNextField(2)
    paste(new_field['y'])
    moveToNextField()
    paste(new_field['width'])
    moveToNextField(2)
    paste(new_field['height'])
    wait(0.1)
    type(Key.ENTER)

def openSizeAndPositionDialog():
    type(Key.ALT + "a" + "z")
    wait(0.05)

def copySelectedText():
    type("c", KeyModifier.CTRL)
    wait(0.05)
    return Env.getClipboard()

def moveToNextField(numTimes=1):
    for i in range(numTimes):
        type(Key.TAB)
        wait(0.05)

def waitForUserToSelectNewField():
    # I'll do it without the popup, because switching to the popup and then closing it is a pain
    wait(WAIT_TIME_FOR_USER_SELECT_NEW_FIELD)

    #popup("select the new field to align under the old one, then press OK")
    #wait(0.2)

App.focus("Crystal Reports")
wait(0.2) # give you time to release CTRL, which would interfere with the script
for i in range(1):
    mainAction()

答案 1 :(得分:1)

如果从头开始创建报告,则应该能够使用“邮件标签”向导,该向导将垂直堆叠所选字段。

除此之外,唯一的选择是手动执行此操作。我发现在“选项”菜单中启用“对齐网格”有助于此,就像每列插入一个垂直指南然后拖放字段以便它们捕捉到它一样。

答案 2 :(得分:1)

手动方法最有效。除了Snap to Grid和垂直指南之外,正如Mark建议的那样,您还应该使用多个Details和Group Header部分。多个部分可以使事情更有条理。

我可以随时避免使用Crystal Reports的“向导” - 这是在使用该产品15年后(自v4起)。

答案 3 :(得分:1)

作为手动对齐字段以使其边框接触的替代方法,您可以使用“对象大小和位置”对话框。您可以通过打开“格式”菜单或字段的上下文菜单,然后选择菜单项“大小和位置...”来访问它。

Object Size and Position dialog in Crystal Reports

按照此过程将新字段添加到垂直堆叠字段列的底部:

  1. 选择列中的当前底部字段。
  2. 打开“大小和位置”对话框。
  3. 将其X值复制下来。
  4. 将Y值添加到高度,然后将其复制下来。
  5. 关闭对话框。
  6. 选择要移动到列底部的新字段。
  7. 打开“大小和位置”对话框。
  8. 将复制的X值作为X值输入,将复制的总和作为Y值。
  9. 关闭对话框。
  10. 如果更容易,您可以使用命令“格式”&gt;替换关于X值的步骤。 “对齐”&gt; “左派”(或“中心”,或“权利”)。

    此方法比使用鼠标拖动字段更容易自动化。如果您必须对齐多个字段,则可以使用AutoHotkeySikuli自动完成此过程的大部分操作。实际上我最终实现了自动化 - 我写了this Sikuli script

答案 4 :(得分:1)

快速而肮脏的方法。如果要使字段均匀分布,并且没有太多垂直堆叠的字段,则创建一个文本框,其中两个字段的高度(假定它们的高度相同)加上所需的空间。因此,假设您希望垂直间距为.08高度,而字段高度为0.167,则创建一个文本框,然后使用“对象大小和位置”对话框将高度设置为.414(0.167 + 0.08 + 0.167)。 现在,将字段按所需顺序垂直放置。暂时不要担心间距。

  1. 将文本框放在第一个字段旁边
  2. 首先选择文本框。
  3. 在按住Shift键的同时选择第一个字段,以便同时选择该字段和文本框,但该字段是主要对象。
  4. 右键单击上下文菜单。
  5. 选择“对齐,顶部”。现在,文本框将与第一个字段的顶部对齐。
  6. 选择下面的下一个字段。
  7. 按住Shift键选择“文本框”,以便同时选择下一个字段和文本框,但是文本框现在是主要对象。
  8. 选择“底部对齐”。这会将字段移动到文本框的底部边框,这会将字段移动到正确的垂直Y位置,并为您提供所需的边距。
  9. 为每个后续字段重复步骤2-8(因此,选择文本框和第二字段作为主要对象对齐顶部,然后选择第三字段和文本框作为主要对象对齐底部,等等)。

答案 5 :(得分:0)

打开Crystal Report 选择要为其显示数据的字段, 转到格式字段 - &gt;文字轮换 设置90(如果你想要从下到上的数据) 设置270(如果你想要从上到下的数据)。 : - )