我正在使用Crystal Reports 2008来开发一些报告(在oracle数据库上)。
我在设计/布局中有许多文本字段,希望将它们放置在垂直堆栈中,并且之间没有空格。
使用Oracle报告,我可以选择字段并进行align-> stackvertical,但是CR2008中似乎没有类似的选项
“ Align”选项具有顶部,中间,底部,基线,左,中,右,网格。没有一个可以满足我的要求。
是否有简单的方法可以做到这一点?还是我只需要手动放置它们? (也许使用捕捉到网格)
如果您从头开始创建报告,则应该能够使用邮件标签向导,该向导将垂直堆叠选定的字段。
除此之外,唯一的选择是手动执行。我发现在“选项”菜单中启用“对齐网格”有助于解决此问题,就像在每列中插入一条垂直准则,然后拖放字段以使其捕捉到它一样。
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()
手动方法最有效。正如Mark所建议的那样,除了“对齐网格”和垂直准则外,您还应该使用多个“详细信息”和“组标题”部分。多个部分使事情井井有条。
[我尽量避免使用Crystal Reports的“向导”,这是在使用该产品15年之后(从v4开始)。
作为一种手动对齐字段以使其边界接触的替代方法,您可以使用“对象大小和位置”对话框。您可以通过打开“格式”菜单或字段的上下文菜单,然后选择菜单项“大小和位置...”来访问它。
“>
按照此过程将新字段添加到垂直堆叠字段的列的底部:
如果更容易,您可以使用命令“格式”>“对齐”>“左”(或“中心”或“右”)来替换有关X值的步骤。
此方法比用鼠标拖动字段更容易自动化。如果必须对齐许多字段,则可以使用AutoHotkey或Sikuli自动执行此过程的大部分步骤。我实际上最终实现了自动化–我写了this Sikuli script。
打开水晶报表选择要垂直显示数据的字段,转到格式字段->文本旋转设置90(如果您想要从下到上的数据)设置270(如果您想要从上到下的数据)。:-)
快速而肮脏的方法。如果要使字段均匀分布,并且没有太多垂直堆叠的字段,则创建一个文本框,其中两个字段的高度(假定它们的高度相同)加上所需的空间。因此,假设您希望垂直间距为.08高度,而字段高度为0.167,则创建一个文本框,然后使用“对象大小和位置”对话框将高度设置为.414(0.167 + 0.08 + 0.167)。现在,将字段按所需顺序垂直放置。暂时不要担心间距。