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

问题描述 投票:3回答:6

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

我在设计/布局中有许多文本字段,希望将它们放置在垂直堆栈中,并且之间没有空格。

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

“ Align”选项具有顶部,中间,底部,基线,左,中,右,网格。没有一个可以满足我的要求。

是否有简单的方法可以做到这一点?还是我只需要手动放置它们? (也许使用捕捉到网格)

crystal-reports alignment crystal-reports-2008
6个回答
1
投票

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

除此之外,唯一的选择是手动执行。我发现在“选项”菜单中启用“对齐网格”有助于解决此问题,就像在每列中插入一条垂直准则,然后拖放字段以使其捕捉到它一样。


2
投票

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

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

该脚本大约需要5秒钟才能对齐一个字段。如果太慢,您可以尝试减少时间或删除某些wait()通话。我添加了wait()调用,因为如果脚本执行得太快,有时会复制或粘贴错误的值。

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

我将脚本文件另存为“ Crystal Reports.sikuli中的对齐字段”。

# 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
投票

手动方法最有效。正如Mark所建议的那样,除了“对齐网格”和垂直准则外,您还应该使用多个“详细信息”和“组标题”部分。多个部分使事情井井有条。

[我尽量避免使用Crystal Reports的“向导”,这是在使用该产品15年之后(从v4开始)。


1
投票

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

““>

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

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

此方法比用鼠标拖动字段更容易自动化。如果必须对齐许多字段,则可以使用AutoHotkeySikuli自动执行此过程的大部分步骤。我实际上最终实现了自动化–我写了this Sikuli script


0
投票

打开水晶报表选择要垂直显示数据的字段,转到格式字段->文本旋转设置90(如果您想要从下到上的数据)设置270(如果您想要从上到下的数据)。:-)


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.