[Jasper使用总结]iReport报表设计-动态列实现

有时候,有些报表要求列为动态的,需要由用户自己决定显示列。

在iReport中,本身并没有提供动态列的功能,但我们可以通过Java代码进行处理,来实现。

这里以iReport 4.5版本为例。


步骤1:设计报表

该报表必须含有一个参数:dynamiccolumn (名字可以随便取,类型必须为java.util.Collection)

[Jasper使用总结]iReport报表设计-动态列实现_第1张图片

[Jasper使用总结]iReport报表设计-动态列实现_第2张图片


步骤2:通过Java代码进行处理,并生成报表

public static void main(String[] args) {
		try {
			//步骤1:获取JasperDesign
			JasperDesign jdesign = JRXmlLoader
					.load("jrxmls//dynamiccolumn.jrxml");

			Map params = new HashMap();
			params.put("dynamiccolumn",
					java.util.Arrays.asList(new String[] { "No","Name","Gender"}));
			
			//步骤2:根据dynamiccolumn参数,对不需要显示的列进行删除
			dynamiccolumn(jdesign,params);

			// 步骤3:报表修改完成后,以修改后报表进行编译,并输出
			JasperReport jreport = JasperCompileManager.compileReport(jdesign);
			Connection conn = null;
			try {
				conn = DriverManager.getConnection(
						"jdbc:mysql://10.24.16.31:3306/ireportrun", "root",
						"isoftstone*1");
			} catch (SQLException e) {
				e.printStackTrace();
			}
			JasperPrint jprint = JasperFillManager.fillReport(jreport, params,
					conn);
			JasperExportManager.exportReportToHtmlFile(jprint,
					"reports//dynamiccolumn.html");
		} catch (JRException e) {
			e.printStackTrace();
		}
	}
/**
	 * @Title: dynamiccolumn
	 * @Description: TODO(对design进行处理,去掉不应该显示的列)
	 * @param @param jdesign JasperDesign
	 * @param @param params 需要显示的列
	 * @return JasperDesign 返回类型
	 */
	public static JasperDesign dynamiccolumn(JasperDesign jdesign, Map params) {
		/*
		 * 该方法目前仅进行了简单的处理,如需更多业务,且自行添加 比如:1. 修改元素的位置 2.自动调整Title的宽度
		 * 3.自行调整整个报表的宽度
		 */
		Collection dynamiccolumns = (Collection) params.get("dynamiccolumn");
		if (dynamiccolumns != null) {

			JRDesignBand cHeader = (JRDesignBand) jdesign.getColumnHeader();
			JRBand cDetailBand = jdesign.getDetailSection().getBands()[0];
			JRDesignBand cDetail = null;
			if (cDetailBand != null && cDetailBand instanceof JRDesignBand) {
				cDetail = (JRDesignBand) cDetailBand;
			}
			JRElement[] es_header = cHeader.getElements();
			JRElement[] es_detail = cDetail.getElements();
			for (int i = 0; i < es_header.length; i++) {
				JRDesignElement e = (JRDesignElement) es_header[i];
				String v = "";
				if (e instanceof JRStaticText) {
					JRStaticText text = (JRStaticText) e;
					v = text.getText();
				}
				if (!dynamiccolumns.contains(v)) {
					for (int j = 0; j < es_detail.length; j++) {
						JRDesignElement ee = (JRDesignElement) es_detail[i];
						if (ee.getY() == e.getY()) {
							cDetail.removeElement(ee);
						}
					}
					cHeader.removeElement(e);
				}
			}
		}
		return jdesign;
	}


报表运行结果,删除列之前:

[Jasper使用总结]iReport报表设计-动态列实现_第3张图片

报表运行结果,删除列之后:

[Jasper使用总结]iReport报表设计-动态列实现_第4张图片

你可能感兴趣的:(iReport)