`
greatghoul
  • 浏览: 147150 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

FineReport应用 - 编程实现普通分组报表 | #报表

阅读更多

  我在 FineReport应用 - 程序网络报表Hello,World 一文中,阐述了编程实现基本报表的方法,在本文中,我将介绍如何创建一个带有数据集的分组数据报表。

 

设计目标

  设计一张报表,按付款方式分组查出订单编号和金额,最终效果如下图:


  

 

配置数据连接

  要使用数据集,需要先在服务器中配置数据连接。配置文件位于

 

  %FR_HOME%\WebReport\ WEB-INF\resources\datasource.xml

  以FRDemo为例,配置如下:

 

<?xml version="1.0" encoding="UTF-8"?>
<DatasourceManager>
  <ConnectionMap>
    <Connection name="FRDemo" class="com.fr.data.impl.JDBCDatabaseConnection">
      <DatabaseAttr />
      <JDBCDatabaseAttr url="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=D:\FineReport6.5\WebReport\WEB-INF\resources\data\FRDemo.mdb" driver="sun.jdbc.odbc.JdbcOdbcDriver" user="" password="" encryptPassword="true" />
    </Connection>
  </ConnectionMap>
</DatasourceManager>  

 

 

添加报表数据集

  在前文中,已经介绍过如何建立一个基本的程序报表,这时不再赘述。

 

  建立一个报表:

 

package fr.report;      

import com.fr.base.Constants;
import com.fr.base.FRContext;
import com.fr.base.NameStyle;
//...

/**    
 * 普通分组报表
 * 
 * http://localhost:8080/FineReport/ReportServer?reportlet=fr.report.GroupReportletDemo
 */     
public class GroupReportletDemo implements Reportlet {      

    public Report createReport(ReportletRequest req) {      
        // 新建报表      
        WorkSheet workSheet = new WorkSheet();
        return workSheet;
    }
}

 

  要添加数据集,在createReport(...)方法中添加如下代码:

 

try {      
	// 使用数据连接FRDemo
	DatabaseConnection dbConn = new NameDatabaseConnection("FRDemo");
	// 定义数据集,这里我们只取前20条记录     
	TableData tableData = new DBTableData(dbConn, "SELECT top 20 * FROM ORDERS");
     // 将定义的数据集添加到报表中,命名为ds1      
     workSheet.putTableData("ds1", tableData);      
} catch (Exception exp) {
	FRContext.getLogger().severe(exp.getMessage());
    exp.printStackTrace();      
}      

 

添加数据列

  表样:

  
  

  数据列:

  
  

 

  添加数据列:

 

// 建立扩展属性并指定为从上到下扩展
CellExpandAttr cellExpandAttr = new CellExpandAttr();
cellExpandAttr.setDirection(Constants.TOP_TO_BOTTOM);
// 新建一个取自ds1数据集PAYMETHOD字段的数据列
DSColumn a2data = new DSColumn();
a2data.setDSName("ds1");
a2data.setColumn(TableDataColumn.createColumn("PAYMETHOD"));
// 设置数据配置为“分组 普通”
a2data.setGrouper(new FunctionGrouper());
// 将建立的数据列绑定到A2单元格中
CellElement a2 = new DefaultCellElement(0, 1, a2data);
// 应用扩展属性
a2.setCellExpandAttr(cellExpandAttr);
// 添加单元格到报表中
workSheet.addCellElement(a2);
 

  依例设置b2、c2单元格,添加表头的方法前文已经介绍过,这里略过。

注意
new DefaultCellElement(col, row, value)中,col和row分别为列和行的索引,如0,0表示a1,1,1表示B2

 美化报表

  通常为了美观,我们会给不同的单元格加上样式,FineReport为我们提供了几种预定义的样式,


  见:%FR_HOME%\WebReport\WEB-INF\resources\config.xml

  要使用预定义的样式,只需要加入如下的代码即可:

 

// 表头样式
Style headStyle = NameStyle.getInstance("Head");
// 表体样式
Style cellStyle = NameStyle.getInstance("Cell");
a1.setStyle(headStyle);
a2.setStyle(headStyle);

 

完整代码

package fr.report;      

import com.fr.base.Constants;
import com.fr.base.FRContext;
import com.fr.base.NameStyle;
import com.fr.base.Style;
import com.fr.data.TableData;
import com.fr.data.impl.DBTableData;
import com.fr.data.impl.DatabaseConnection;
import com.fr.data.impl.NameDatabaseConnection;
import com.fr.report.CellElement;
import com.fr.report.DefaultCellElement;
import com.fr.report.Report;
import com.fr.report.WorkSheet;
import com.fr.report.cellElement.CellExpandAttr;
import com.fr.report.cellElement.TableDataColumn;
import com.fr.report.cellElement.core.DSColumn;
import com.fr.report.cellElement.core.FunctionGrouper;
import com.fr.web.Reportlet;
import com.fr.web.ReportletRequest;

/**    
 * 普通分组报表
 * 
 * http://localhost:8080/FineReport/ReportServer?reportlet=fr.report.GroupReportletDemo
 */     
public class GroupReportletDemo implements Reportlet {      

    public Report createReport(ReportletRequest req) {      
        // 新建报表      
        WorkSheet workSheet = new WorkSheet();

        try {      
        	// 定义数据连接
        	DatabaseConnection dbConn = new NameDatabaseConnection("FRDemo");
            
        	// 定义数据集      
        	TableData tableData = new DBTableData(dbConn, "SELECT top 20 * FROM ORDERS");
            // 添加数据集ds1      
            workSheet.putTableData("ds1", tableData);      
            
            // 表头样式
            Style headStyle = NameStyle.getInstance("Head");
            // 表体样式
            Style cellStyle = NameStyle.getInstance("cell");
            
            // 添加表头
        	CellElement a1 = new DefaultCellElement(0, 0, "PAYMETHOD");
        	a1.setStyle(headStyle);
    		workSheet.addCellElement(a1); 
    		
    		CellElement b1 = new DefaultCellElement(1, 0, "ORDERID");
    		b1.setStyle(headStyle);
    		workSheet.addCellElement(b1);
    		
    		CellElement c1 = new DefaultCellElement(2, 0, "AMOUNT");
    		c1.setStyle(headStyle);
    		workSheet.addCellElement(c1);
    		
    		// 添加表体
        	CellExpandAttr cellExpandAttr = new CellExpandAttr();
        	cellExpandAttr.setDirection(Constants.TOP_TO_BOTTOM);
        	
    		DSColumn a2data = new DSColumn();
    		a2data.setDSName("ds1");
    		a2data.setGrouper(new FunctionGrouper());
    		a2data.setColumn(TableDataColumn.createColumn("PAYMETHOD"));
        	
    		CellElement a2 = new DefaultCellElement(0, 1, a2data);
    		a2.setCellExpandAttr(cellExpandAttr);
    		workSheet.addCellElement(a2);
    		a2.setStyle(cellStyle);
 
    		DSColumn b2data = new DSColumn();
    		b2data.setDSName("ds1");
    		b2data.setGrouper(new FunctionGrouper());
    		b2data.setColumn(TableDataColumn.createColumn("ORDERID"));
        	
    		CellElement b2 = new DefaultCellElement(1, 1, b2data);
    		b2.setCellExpandAttr(cellExpandAttr);
    		workSheet.addCellElement(b2);
    		b2.setStyle(cellStyle);
    		
    		DSColumn c2data = new DSColumn();
    		c2data.setDSName("ds1");
    		c2data.setGrouper(new FunctionGrouper());
    		c2data.setColumn(TableDataColumn.createColumn("AMOUNT"));
        	
    		CellElement c2 = new DefaultCellElement(2, 1, c2data);
    		c2.setCellExpandAttr(cellExpandAttr);
    		workSheet.addCellElement(c2);
    		c2.setStyle(cellStyle);
        } catch (Exception exp) {
        	FRContext.getLogger().severe(exp.getMessage());
            exp.printStackTrace();      
        }      

        return workSheet;
    }
}

 

  要预览报表,访问

  http://localhost:8080/FineReport/ReportServer?reportlet=fr.report.GroupReportletDemo

  • 大小: 4.5 KB
  • 大小: 2 KB
  • 大小: 5.2 KB
1
0
分享到:
评论

相关推荐

    windows_x64_FineReport-CN_2021-05-26.rar

    FineReport设计器支持拖拽式操作,使得非编程背景的用户也能轻松创建复杂的数据报表。jar包是Java应用程序的集合,这个特定版本的jar包包含了2021年5月26日更新的功能和优化,确保了用户可以利用最新的功能进行报表...

    报表开发工具FineReport中如何把报表放到网页中显示

    ### 报表开发工具FineReport中如何把报表放到网页中显示 #### 一、背景介绍 随着信息技术的发展,越来越多的企业倾向于使用基于浏览器/服务器(Browser/Server,简称BS架构)的系统来处理业务流程。这类系统通常...

    FineReport 实现动态列报表

    此外,FineReport作为一个报表工具,它的很多高级功能往往需要通过脚本语言进行更细致的定制,这要求用户不仅要了解报表工具的界面操作,还要有一定的编程基础。 最后,在实现动态列报表时,还需要考虑报表的展示...

    FineReport报表软件技术指南.pdf"

    - **高效性**:利用FineReport的设计工具,用户可以实现无编码形式的报表设计,大大提高了工作效率。 - **灵活性**:支持数据的双向扩展,用户可以根据实际需求自由选择数据展示方式。 - **安全性**:提供完善的权限...

    FineReport报表工具的使用与集成

    FineReport的特点在于其易用性和高效的报表设计方案,它采用了数据双向扩展、真正的无编码形式设计报表,用户不需要掌握复杂的编程技能即可设计出符合业务逻辑的报表,从而满足报表使用者的需求。此外,FineReport还...

    FineReport报表软件技术白皮书

    ### FineReport报表软件技术白皮书关键知识点解析 #### 一、产品概述 **FineReport**是一款集数据展示(报表)和数据录入(表单)功能于一体的报表工具软件,主要面向软件开发者。它能显著提升软件开发过程中的...

    关于Web报表FineReport打印的开发应用案例.

    在现代Web报表开发中,报表打印是一个不可或缺的功能,尤其在一些需要将报表信息整理成纸质...在实际应用中,结合具体的业务场景和技术要求,对FineReport的打印功能进行相应的定制和优化,是实现高效报表打印的关键。

    《FineReport报表软件白皮书》

    FineReport的拖拽式设计比水晶报表的编程方式更易于上手,而水晶报表则在复杂报表和集成度上有一定优势。 6. **应用领域**:FineReport广泛应用于金融、电信、制造、政府等行业的数据分析和报表制作,能有效提升...

    报表工具FineReport使用教程之自动计算日期.docx

    FineReport是一款功能强大且国际通用的报表软件,广泛应用于企业的报表制作中。在日常工作中,我们经常需要制作以各种数据报表,来分析公司的经营业务的情况。今天,我们将为大家介绍FineReport软件的一些日常操作...

    报表工具FineReport根据条件控制参数控件是否显示

    FineReport提供了丰富的脚本支持,尤其是JavaScript,允许用户在参数控件间设置逻辑关系,通过编程的方式实现复杂的报表控制逻辑。在本案例中,我们使用JavaScript来实现当某个参数控件(例如“用户名”)有值时,另...

    使用FineReport报表二次开发详述

    FineReport允许开发者通过编程方式对单元格的格式进行自定义设置,包括字体样式、边框、背景色等,这为定制化报表提供了极大的灵活性。 ##### 3.3 将模板通过指定打印机打印 在某些应用场景下,需要将报表直接打印...

    FineReport报表二次开发(详细).docx

    通过编程方式创建网络模板,可以实现动态生成报表模板,提高报表的灵活性。 ### 9. 读取模板报表 可以读取已存在的模板报表,以便进行编辑、更新或分析。 综上所述,FineReport 的二次开发功能提供了极大的灵活性...

    报表工具FineReport正则表达式定义规则

    ### 报表工具FineReport正则表达式定义规则 #### 一、正则表达式概述 正则表达式是一种强大的文本处理工具,在多种编程语言中都有应用,它可以帮助我们完成字符串搜索、替换等一系列复杂的文本处理任务。在报表...

    FineReport三张典型报表图制作代码

    4. 编程实现动态比较:在JavaScript中处理用户输入,实时更新报表内容。 以下代码用于根据用户选择的日期范围动态更新对比报告: ```javascript var startDate = $('#startDateInput').val(); var endDate = $('#...

    FineReport-任意时刻只允许在一个客户端登陆账号的插件

    FineReport是一款流行的报表系统,通常被企业用来制作各类数据报表。在使用FineReport时,出于账户安全的考量,某些企业需要实施一个功能:确保同一个账号在任意时刻只能在一台计算机(客户端)上登录。为了实现这一...

    报表开发工具FineReport视图树超链

    在FineReport报表开发工具中,视图树超链是一种实现动态树节点和子模板联动的技术。该技术使得开发人员可以设计出一种报表布局,在报表的左侧显示一个树状结构的视图树,而右侧则显示相应的子模板内容。通过这种布局...

    finereport.rar

    FineReport提供了直观的拖拽式报表设计界面,用户无需编程基础即可轻松创建各种复杂的报表,如表格、图表、仪表盘等。它支持多种数据源类型,包括数据库、Excel、Web服务等,能够快速连接并处理来自不同来源的数据。...

    Finereport功能介绍

    而Finereport则是在这两种报表工具的基础上进行了创新,实现了数据列和单元格的完美结合。用户可以通过简单的拖拽操作将数据列放置到单元格中,轻松构建复杂的报表格式。此外,Finereport还支持多源分片、不规则分组...

    FineReport报表二次开发(详细).pdf

    开发者可以创建程序化的网络模板,将报表与Web应用无缝集成,实现动态数据交互。 9. **读取模板报表** 可以通过编程方式读取已存在的模板报表,进行数据更新或进一步处理。 总的来说,FineReport的二次开发能力...

Global site tag (gtag.js) - Google Analytics