参考代码
public List<SalaryDetail> monthFormListFormat(List<SalaryDetail> oriSalaryList) {
//未作任何处理的list
if(oriSalaryList==null||oriSalaryList.size()==0)
return null;
int len = oriSalaryList.size();
//目的List
List<SalaryDetail> desSalaryList = oriSalaryList;
//第一行的对象
SalaryDetail firstLineSalary = oriSalaryList.get(0);
//小计的对象
SalaryDetail subtotalSalary = new SalaryDetail();
//最后总计的对象
SalaryDetail sumtotalSalary = new SalaryDetail();
//存放小计对象的位置,以及小计对象
Map<Integer,SalaryDetail> subtotalMap = new HashMap<Integer,SalaryDetail>();
//插入了几行数据
int n = 0;
for(int i = 0;i<len;i++){
if(firstLineSalary.getUserType().equals(oriSalaryList.get(i).getUserType())) {
if(i==len-1){
subtotalSalary = getSubTotalSum(subtotalSalary, oriSalaryList.get(i),"1");
subtotalSalary.setUserType("小计");
subtotalSalary.setRowSpanCount(1);
subtotalMap.put(i, subtotalSalary);
sumtotalSalary = getSubTotalSum(sumtotalSalary, subtotalSalary,"1");
break;
}
//如果用户类型相同则进行相加,以便得到小计的值
subtotalSalary = getSubTotalSum(subtotalSalary, oriSalaryList.get(i),"1");
}else{
if(i==len-1){
//把最后一条记录以上的计算一下,并清空【小计】
subtotalSalary.setUserType("小计");
subtotalSalary.setRowSpanCount(1);
sumtotalSalary = getSubTotalSum(sumtotalSalary, subtotalSalary,"1");
subtotalMap.put(i-1, subtotalSalary);
subtotalSalary = new SalaryDetail();
//最后一条记录的处理
subtotalSalary = getSubTotalSum(subtotalSalary, oriSalaryList.get(i),"1");
subtotalSalary.setUserType("小计");
subtotalSalary.setRowSpanCount(1);
sumtotalSalary = getSubTotalSum(sumtotalSalary, subtotalSalary,"1");
subtotalMap.put(i, subtotalSalary);
break;
}
//把每种用户类型的第一行修改,并在List副本里面加上一个小计的对象,
firstLineSalary = oriSalaryList.get(i);
subtotalSalary.setUserType("小计");
subtotalSalary.setRowSpanCount(1);
subtotalMap.put(i-1, subtotalSalary);
sumtotalSalary = getSubTotalSum(sumtotalSalary, subtotalSalary,"1");
subtotalSalary = new SalaryDetail();
//把新的“第一个值”增加到小计中
subtotalSalary = getSubTotalSum(subtotalSalary, firstLineSalary,"1");
}
}
for(int i = oriSalaryList.size()-1;i>=0;i--){
if(subtotalMap.containsKey(i)){
// if(i == oriSalaryList.size()-1){
oriSalaryList.add(i+1,subtotalMap.get(i));
// }else{
// oriSalaryList.add(i,subtotalMap.get(i));
// }
}
}
//插入最后一列
sumtotalSalary.setUserType("总计");
sumtotalSalary.setRowSpanCount(1);
desSalaryList.add(desSalaryList.size(), sumtotalSalary);
//新的第一行
firstLineSalary = oriSalaryList.get(0);
len = oriSalaryList.size();
int rowSpan = 0;
//加上rowspan
for(int i = 0;i<len;i++){
if(i<len-1){
SalaryDetail nextLineSalary = oriSalaryList.get(i+1);
if("小计".equals(nextLineSalary.getUserType())||"总计".equals(nextLineSalary.getUserType())){
if(!"小计".equals(firstLineSalary.getUserType())&&!"总计".equals(firstLineSalary.getUserType())){
firstLineSalary.setRowSpanCount(rowSpan+1);
}
continue;
}
if(firstLineSalary.getUserType().equals(nextLineSalary.getUserType())){
rowSpan ++;
firstLineSalary.setRowSpanCount(rowSpan+1);
}else{
rowSpan = 0;
firstLineSalary = nextLineSalary;
}
}
}
return oriSalaryList;
}
/**
* 把原对象的值和目的对象的值相加,并返回目的对象
* @param desSalary
* @param oriSalary
* @return
*/
private SalaryDetail getSubTotalSum(SalaryDetail desSalary,SalaryDetail oriSalary,String flg){
//desSalary.setUserType("小计");
if("1".equals(flg)){
desSalary.setEleYjdf(oriSalary.getEleYjdf()+(desSalary.getEleYjdf()==null?0:desSalary.getEleYjdf()));
desSalary.setEleJxzxh(oriSalary.getEleJxzxh()+(desSalary.getEleJxzxh()==null?0:desSalary.getEleJxzxh()));
desSalary.setEleHgkjxs(oriSalary.getEleHgkjxs()+(desSalary.getEleHgkjxs()==null?0:desSalary.getEleHgkjxs()));
desSalary.setEleYdkhxs(oriSalary.getEleYdkhxs()+(desSalary.getEleYdkhxs()==null?0:desSalary.getEleYdkhxs()));
desSalary.setEleGlkpxs(oriSalary.getEleGlkpxs()+(desSalary.getEleGlkpxs()==null?0:desSalary.getEleGlkpxs()));//管理考评
//desSalary.setEleTcbl(oriSalary.getEleTcbl()+(desSalary.getEleTcbl()==null?0:desSalary.getEleTcbl()));//提成比例,不需要进行计算
}
if("2".equals(flg)){
//设置虚拟的编号
desSalary.setVid(oriSalary.getVid());
desSalary.setUserCount(oriSalary.getUserCount()+desSalary.getUserCount());
}
desSalary.setEleQmkhzc(oriSalary.getEleQmkhzc()+(desSalary.getEleQmkhzc()==null?0:desSalary.getEleQmkhzc()));//期末客户资产
desSalary.setEleYjfy(oriSalary.getEleYjfy()+(desSalary.getEleYjfy()==null?0:desSalary.getEleYjfy()));//一级费用
desSalary.setEleCjl(oriSalary.getEleCjl()+(desSalary.getEleCjl()==null?0:desSalary.getEleCjl()));
desSalary.setEleSsyj(oriSalary.getEleSsyj()+(desSalary.getEleSsyj()==null?0:desSalary.getEleSsyj()));//实收佣金
desSalary.setEleYysjfj(oriSalary.getEleYysjfj()+(desSalary.getEleYysjfj()==null?0:desSalary.getEleYysjfj()));//营业税及附加
desSalary.setEleTzzbhjj(oriSalary.getEleTzzbhjj()+(desSalary.getEleTzzbhjj()==null?0:desSalary.getEleTzzbhjj()));//投资者保护基金
desSalary.setOthField1(oriSalary.getOthField1()+(desSalary.getOthField1()==null?0:desSalary.getOthField1()));//净佣金
desSalary.setEleYyjjsr(oriSalary.getEleYyjjsr()+(desSalary.getEleYyjjsr()==null?0:desSalary.getEleYyjjsr()));//月佣金净收入
desSalary.setSalYxtc(oriSalary.getSalYxtc()+(desSalary.getSalYxtc()==null?0:desSalary.getSalYxtc()));
desSalary.setSalJbgzBefore(oriSalary.getSalJbgzBefore()+(desSalary.getSalJbgzBefore()==null?0:desSalary.getSalJbgzBefore())); //调整前基本工资
desSalary.setSalJbgz(oriSalary.getSalJbgz()+(desSalary.getSalJbgz()==null?0:desSalary.getSalJbgz()));
desSalary.setSalGljt(oriSalary.getSalGljt()+(desSalary.getSalGljt()==null?0:desSalary.getSalGljt()));
desSalary.setSalKhjljcj(oriSalary.getSalKhjljcj()+(desSalary.getSalKhjljcj()==null?0:desSalary.getSalKhjljcj()));
desSalary.setSalJjrjcj(oriSalary.getSalJjrjcj()+(desSalary.getSalJjrjcj()==null?0:desSalary.getSalJjrjcj()));
desSalary.setSalJxzxhj(oriSalary.getSalJxzxhj()+(desSalary.getSalJxzxhj()==null?0:desSalary.getSalJxzxhj()));
desSalary.setSalZqfxsczgj(oriSalary.getSalZqfxsczgj()+(desSalary.getSalZqfxsczgj()==null?0:desSalary.getSalZqfxsczgj()));
desSalary.setSalQtcxwsr(oriSalary.getSalQtcxwsr()+(desSalary.getSalQtcxwsr()==null?0:desSalary.getSalQtcxwsr()));
desSalary.setSalZyf(oriSalary.getSalZyf()+(desSalary.getSalZyf()==null?0:desSalary.getSalZyf()));
desSalary.setSalJjx(oriSalary.getSalJjx()+(desSalary.getSalJjx()==null?0:desSalary.getSalJjx()));
desSalary.setSalYfs(oriSalary.getSalYfs()+(desSalary.getSalYfs()==null?0:desSalary.getSalYfs()));
desSalary.setRzrqYxjl(oriSalary.getRzrqYxjl()+(desSalary.getRzrqYxjl()==null?0:desSalary.getRzrqYxjl()));
desSalary.setSalCpxsjl(oriSalary.getSalCpxsjl()+(desSalary.getSalCpxsjl()==null?0:desSalary.getSalCpxsjl()));
desSalary.setSalCpxssy(oriSalary.getSalCpxssy()+(desSalary.getSalCpxssy()==null?0:desSalary.getSalCpxssy()));
desSalary.setSalCpyjbl(oriSalary.getSalCpyjbl()+(desSalary.getSalCpyjbl()==null?0:desSalary.getSalCpyjbl()));
return desSalary;
}
分享到:
相关推荐
### Java报表最优解决方案 #### B/S环境复杂报表开发困境 随着互联网技术的飞速发展,B/S架构的应用程序越来越受到欢迎。在这种模式下,用户可以通过浏览器访问和操作应用程序,这大大提高了应用程序的可访问性和...
在Java环境中,水晶报表通过Java API与应用程序集成,为用户提供了一种直观且强大的报表设计和展示方式。 首先,了解Java水晶报表的基本概念至关重要。水晶报表主要由以下几个部分组成: 1. 报表设计:在水晶报表...
Java报表解决方案是针对企业信息化系统中的数据展示需求而设计的一种技术方案,特别是在中国的环境中,由于业务规则复杂,报表往往需要具备强大的数据处理、格式化和展示能力,这被称为“中国式复杂报表”。...
《Java报表开发技术深入解析》是一本专注于Java平台上的报表开发技术的专业书籍。该书针对Java开发者,旨在帮助他们理解和掌握如何在Java应用程序中设计、创建和展示复杂的报表。通过阅读此书,读者将能够了解到Java...
JasperReport与iReport是Java报表开发领域的强大工具组合,通过本手册的学习,开发者将能够掌握这些工具的基本操作和高级功能,从而在实际项目中高效地完成报表设计与开发工作。无论是入门还是进阶,这份手册都将是...
在Java环境中,通过Java API与水晶报表进行集成,可以实现动态报告的创建、修改和展现。 1. **水晶报表的使用场景** - 企业报表:用于生成销售报告、财务报表、库存分析等各类业务报表。 - 数据可视化:将复杂的...
总的来说,构建Web Intelligence Java报表面板是一项涉及广泛技术的挑战,需要开发者具备深厚的Java、Web开发和商业智能领域的知识。通过学习和实践,可以创建出高效、用户友好的报表解决方案。
3. **表达式和脚本**:在JRXML中,可以使用Java表达式进行计算和逻辑处理。同时,JasperReports支持JavaScript和Groovy脚本,使得在报表中实现更复杂的业务逻辑成为可能。 4. **报表填充**:使用JasperFillManager...
Java水晶报表,全称为Crystal Reports for ...Java水晶报表对于需要进行数据可视化和分析的Java开发者来说,是一个强大而灵活的工具。通过熟练掌握其设计和开发技巧,可以大大提高工作效率,提供高质量的报表解决方案。
在Java应用中,可以通过JDBC驱动程序将报表连接到后端数据库,获取并处理数据。 ### 4. 报表参数 水晶报表支持定义参数,使得报表能够根据用户的输入动态生成内容。开发者可以设定参数类型、默认值以及参数之间的...
百灵报表(BIRT)是一款基于Java的开源报表系统,由Eclipse基金会开发并维护,广泛应用于企业级的报表设计和生成。它提供了一个强大的、灵活的报告设计环境,能够生成各种复杂的数据可视化效果,包括列表、交叉表、...
7. **性能优化**:在处理大量数据时,性能优化至关重要。这可能涉及数据库查询优化、数据缓存策略、异步加载等技术,以确保报表的快速响应。 8. **数据源**:报表的数据可以来自各种来源,如数据库、文件、API接口...
在实际项目中,使用Java报表的例子可能包括: 1. 销售报告:展示销售数据分析,如销售额、利润、产品类别等。 2. 客户报表:汇总客户信息,包括联系方式、购买历史、信用评级等。 3. 财务报告:生成财务报表,如...
总之,在Java报表工具的选择上,需要充分考虑实际需求和工具的特性,以确保选择的工具能有效地提升工作效率,同时满足用户的多样化需求。希望以上的分析能为你的报表工具决策提供有价值的参考。
在JEE应用中,BIRT报表引擎作为JAR包集成,通过POJOs进行报表处理。报表与应用的集成主要包括UI参数、报表运行、数据访问和展现。报表参数可以是静态或动态的,报表运行由报表引擎处理,数据访问则依赖于Java对象...
例如,子报表允许你在主报表中嵌入另一个报表,这在处理复杂的数据关系时非常有用。分组功能可以帮助组织数据,便于分析。汇总则可以对特定字段进行计算,如求和、平均值等。条件格式化允许根据特定条件改变报表元素...
Java报表系统是软件开发中的重要组成部分,用于生成和展示数据的统计分析结果。在这个场景中,我们关注的是基于Java的报表工具——JasperReports和iReport。这两个组件结合使用,可以构建出强大的动态报表解决方案。...
6. 报表分组和汇总:对数据进行分组和计算总和、平均值等统计信息。 7. 输出格式:选择不同的输出格式,如PDF、Excel、HTML等。 在实际应用中,JFreeChart与水晶报表的结合可以提供更丰富的可视化体验,特别是在...
在"Java报表开发ReportsCharts.docx"的描述中,主要涉及了数据填充、分组报表构造、图表生成以及个人档案的PDF输出四个关键知识点。 1. **数据填充**: - **Parameters(参数)填充**:参数主要用于在运行时将程序...
### 使用JasperReport和iReport进行Java报表开发 JasperReport是一款开源报表工具,常用于Java应用程序中生成复杂的报表。结合iReport设计工具,开发者可以轻松地创建、编辑和预览报表模板。接下来,我们将探讨如何...