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

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

问题描述:

我正在使用Crystal Reports 2008开发某些报告(在Oracle数据库上)。如何在Crystal Reports 2008中垂直堆叠字段

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

使用Oracle报告我可以选择的领域,做一个align-> stackvertical,但似乎并没有在CR2008

“对齐”选项有顶部,中段,底部,基线的类似选项,左派,中心,权利,网格。没有一个做我想要的。

有没有简单的方法来做到这一点?或者我只需要手动定位它们? (也许使用对齐网格)

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

除此之外,唯一的选择是手动完成。我发现在选项菜单中启用“捕捉到网格”可以帮助实现这一点,就像在每列中插入单个垂直指引线,然后拖放字段以使它们捕捉到它一样。

+0

不是我正在寻找的答案..但谢谢。 – ShoeLace 2012-01-23 01:27:56

手动方法将效果最佳。除了对齐网格和垂直指南,正如Mark所建议的那样,您还应该使用多个“详细信息”和“组页眉”部分。多个部分保持组织更好。

我会尽量避免使用Crystal Reports的“向导” - 这是在产品工作15年后(从v4开始)。

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

+0

没有..我不希望文字是垂直的..我想领域互相接触,没有他们之间的空间 – ShoeLace 2013-05-02 05:42:29

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

Object Size and Position dialog in Crystal Reports

请按照以下步骤一个新字段添加到垂直堆叠的字段列的底部:

  1. 列选择当前底部场。
  2. 打开“大小和位置”对话框。
  3. 将其X值向下复制。
  4. 将Y值添加到高度,然后将其复制下来。
  5. 关闭对话框。
  6. 选择您想要移动到列底部的新字段。
  7. 打开“大小和位置”对话框。
  8. 输入复制的X值作为X值,复制的和值作为Y值。
  9. 关闭对话框。

如果它更容易,你可以取代有关使用命令“格式” > X值的步骤“对齐” >“左派”(或“中心”或“权利”)。

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

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

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

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

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

我将脚本文件保存为“在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() 
+0

从未听说sikuli之前..将检查出它..和这个想法.. – ShoeLace 2014-01-28 13:48:57

+0

这是完美满足我的需求,感谢发布。建议你告诉人们禁用捕捉网格,当我第一次尝试它时,会让这种行为变得异常怪异。 – safetyOtter 2014-08-27 16:57:23