我正在尝试使用BIRT创建Excel电子表格。电子表格是将两个对象映射在一起的交叉表。根据MySQL数据库中的值,行数和列数是动态的。目前,我有一个PDF输出报告的工作实现。现在,我正在尝试为Excel创建第二版报告。
我复制了报表设计并开始调整它以使用Excel。一切看起来都不错,但只有前3列显示在标题之后。所有行都显示正确。
我尝试了以下内容:
我受到以下方面的限制:
此博客文章提到了我的问题: http://www.spudsoft.co.uk/2011/10/the-spudsoft-birt-excel-emitters/ 但它不提供除发射器开关之外的解决方案。具体的引用是“文件也有页面布局的问题,我无法解决(特别是广泛的报告将被切断)。”
除了一篇博客文章,我的googlefu也让我失望了。任何帮助表示赞赏!谢谢!
答案 0 :(得分:4)
这里有两个问题。第一个相对容易,第二个很复杂。
1.为什么我的Cross标签在Excel中被截断?
2.如何根据运行时报表中的列数动态调整母版页宽度?
A1:交叉选项卡正在被切断,因为已经手动设置了列宽,其中列数将扩展超过主页面的设置宽度。每当你抓住报告设计元素并进行调整时,BIRT会假设你知道自己在做什么并且不会覆盖你的设置。
解决方案是重新创建报表元素(表格或交叉表格),而不是手动调整任何大小。在HTML或Excel中运行时,所有列都将自动设置为以可用的母版页宽度显示。
BIRT 4.2交叉选项卡的屏幕截图,报告项目主页宽度为2英寸,列数为30列
A2:这不容易,我现在不会提供答案。我将指出解决方案,并确定几个路障。此问题的有效解决方案必须包括使用示例数据库的正常运行解决方案。
(截至BIRT 4.2.1 )
挑战1 - 在完成报告表格或交叉表项目之前的事件中,主页面宽度设置为BIRT Report Scripting。您无法简单地计算报告中的列数;
如果你想数,列 -
报告设计初始化
columnCount = 0;
Cross Tab,onCreate
columnCount ++;
在我的研究中,有两条路径建议在创建Cross Tab项目之前对列进行计数。
在beforeFactory中运行数据集(这意味着对数据库有两个查询,一个用于计数,一个用于报告),然后获取计数并使用它。
计算初始查询中的值并将其收集到数据集onFetch中。
我使用计算列跟踪了数据集onFetch选项,但没有使它工作。
挑战2 - 必须在报告设计之前或之前设置母版页的宽度属性。最常推荐使用beforeFactory。此外,母版页的宽度属性仅在母版页“类型”设置为“自定义”时可用,我尝试在属性编辑器常规中手动设置此属性。
必须使用PersistentGlobalVariable将onFetch中的值传递给beforeFactory,而PersistentGlobalVariable只能传递字符串,而不能传递整数。我发现各种各样的方式不起作用。即使在PersistentGlobalVariable中传递“12in”也无法调整母版页宽度
beforeFactory中的这些代码中的任何一个都会调整母版页宽度(当Type = Custom时)
传递价值
reportContext.getReportRunnable().designHandle.getDesignHandle().findMasterPage("Simple MasterPage").setProperty("width","12in");
计算一个值并传递它
increaseWidth = 20;
reportContext.getReportRunnable().designHandle.getDesignHandle().findMasterPage( "Simple MasterPage").setProperty("width",((2+increaseWidth)+"in"));
最后,我无法找到或创建一个功能报告来调整在报告运行时生成的数字列上传递的母版页宽度。我认为这是可能的,但这样做超出了我目前的技能。