보고서 카탈로그에 동적를 추가하는 방법

요구 사항에 대한 설명 :

더 나은 독서 결과를하기 위해, 보고서의 일부 유사한 단어 보고서 형식을함으로써, 자주 데이터가 처음 몇 페이지에 우려 신속하게 인식 할 수 있도록 홈 페이지의 디렉토리 탐색 페이지를 추가해야하지만 보고서는 워드 문서, 단어는 다릅니다 문서 형식은 데이터가 동적 보고서에 쉽고 빠르게 빌드 디렉토리 페이지에 가능하며, 종종 수정 디렉토리 항목에 동적 확장, 어려운을 포함, 데이터의 동적 확장 이후, 해당 고정되어 예를 아래에 보는 정확한 페이지를 얻기 어려운 경우 보고서 디렉토리에 동적 증가.

해결 방법 :

보고서 데이터는 그래서 당신은 계산 후 자바 프로그램에서 동적으로 보고서를 얻을 수 있습니다, 처음 몇 페이지의 데이터, 실행 드라이 문이 필요한 보고서는 리스너 클래스를 계산 계산하는 보고서를 제공합니다 알고, 고정 된 카탈로그 디자인을 사용하지 않는, 동적 셀의 값 결과 및 프로그램에 동적으로 변경 될 수있다.

첫째, 보고서 템플릿 디자인 인터페이스에서보기 :

이 보고서는 지역별 순서 데이터 메타 분석해야하고, 보고서는 현재 일반적으로 고정 된 프로파일 링 디렉토리 페이지 셋째 줄 쓰기 전에 탐색 영역 디렉토리 필요한 본 상세한 데이터는 다섯 개 라인을 설정해야 유선, 페이지 2 라인 상에 제공된다.

A4 = ds1.group (오너 영역; 오너 지역 : 1) 일시적 여기서, E4는 디렉토리 페이지에 후속 셀 배치 우러 대응 한 디렉토리 영역으로, 즉,이 표시 지역별 그룹화 표현.

A5는 : 디렉토리 그래서 여기에 라인 매김 한 후 설정, 일반적으로 첫 번째 페이지입니다

A7은 : 고정 된 요약 설명 고정 문자열과 함께 스플 라이스 스플 라이스 동적 데이터 표시 내부 일 수있다.

A8 = ds1.group (소유자 영역; 오너 지역 : 1), 영역별로 그룹화

A9는 : 지역 요약 설명 데이터 확인

A10 : = ds1.select (주문 ID), 주문, B10의 수를 복용하고 그래서 다시.

A9 왼쪽 주격 A10, A11에, A12 세포 결과가 나타내는 리포트가되도록,이 타일 데이터 길이에 따라 연장 A8, A8 배치 :

다음은 다음, 아래로보고, 해당 지역에서 디렉토리 엔트리 목록을 볼 수 있습니다 경우 지역에 해당하는 페이지 수의 증가.

从报表结果中看到,第一页中的目录名称和报表中的地区名称相同,这样就可以根据这两个名称做匹配,判断如果名称相同获取数据区域的名称所在的页码,放到对应目录行就行,如数据区域的“东北”在第 2 页,那么目录中东北的页码应该为 2,接下来看下,如何给目录设置动态的页码。

这里就用到了之前说到的报表侦听类的使用,源码如下:

import com.raqsoft.common.Area;
import com.raqsoft.report.usermodel.Context;
import com.raqsoft.report.usermodel.IPagerListener;
import com.raqsoft.report.usermodel.IReport;
import com.raqsoft.report.usermodel.IReportListener;
import com.raqsoft.report.usermodel.PageBuilder;
import com.raqsoft.report.util.ReportUtils;

public class createmulu implements IReportListener {
	 public void afterCalc(Context arg0, IReport arg2) { 
		 PageBuilder arg1 = null;
		try {
			arg1 = new PageBuilder(arg2);
		} catch (Throwable e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
			System.out.println("报表总页数"+arg1.getPageCount());
			IReport p1;
			try {
				 p1=arg1.getPage(1);//目录通常在第一页,所以获取第一页为目录页
				 int page=2;//设置数据初始循环页,通常为第二页
				 for(int i=3;i<=p1.getRowCount();i++){//目录行从第三行开始
					String muluName=(String)p1.getCell(i, 2).getValue() ;//报表中设置第二页为目录名称
					for(int j=page;j<=arg1.getPageCount();j++){//按照页数进行循环,分别取分页后每页报表对象
						for(int k=1;k<=arg1.getPage(j).getRowCount();k++){//每页中按照每行进行循环		
						String mName=arg1.getPage(j).getCell(k,1).getValue() != null ? arg1.getPage(j).getCell(k,1).getValue().toString() : "";//本例中目录项在报表中的第一列,也就是A8单元格
						if(mName!="" && mName==muluName){//判断每页中的目录项和第一页中的目录名称是否相同
							arg2.getCell(i, 5).setValue(j);//如果相同,则设置目录页第5列对应的值为对应页码,注意,此处是arg2对象
							arg2.getCell(i, 5).setHyperlink("javaScript:toPage('report1',"+j+")");//设置超链接
							page=j;//为提高计算效率,下次在循环时,不用从第2页开始,从上次终端的页码开始就行
							break;//找到页码,跳出此处循环,提高效率
						}	
						}
					} 
				 }
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} 
	   } 
	   public void beforeCalc(Context arg0, IReport arg1) { 
	   } 
	
}

 核心思路就是在类中根据名称进行匹配,获取页码,放到对应单元格中,将编译好的类放到报表类路径中,如:应用的 WEB-INF\classes 下,注意如果有包路径,此处要要带相应的路径,放置过去后重启应用,在页面端访问报表,结果如下:

可以看到,目录后边会生成对应的页码,word 中目录有个功能点是,点击页码,能够快速跳转到对应的页数,报表中同样可以增加对应的功能,报表提供了一个跳转页数的 js 函数,toPage,在 java 类中,在对应的页码单元格设置了一个超链接,调用这个 js 就行:

 
arg2.getCell(i, 5).setHyperlink("javaScript:toPage('report1',"+j+")"); 

这样,在页面端点击页码,就能够快速跳转到对应页数,当然,此功能要求报表在页面端分页后才有效,否则无法跳转,并且如果导出到 word 的话,只能显示页数,无法跳转。

通过这个例子可以看到,通过拿目录项中的单元格数据和数据表中的单元格进行匹配,来获取页码,但是在实际使用中,目录页中的目录名称和报表中的数据名称可能并不完全一致,比如目录页中叫东北,报表数据中叫东北地区,很难严格匹配,这样可以换种变通的方法,报表单元格属性栏中有个注释属性,可以在这个里边写上和目录项匹配的值,然后 java 类中可以根据这个属性的值做匹配,这样能够实现更加灵活的效果,更多 api 接口可以参考报表帮助文档《程序员参考》,后续带来更多 api 在报表实际需求中的应用。

추천

출처www.cnblogs.com/shiGuangShiYi/p/12112617.html