本头条号主要是Java常用关键技术点,通用工具类的分享;以及springboot+springcloud+Mybatisplus+druid+mysql+redis+swagger+maven+docker等集成框架的技术分享;datax、kafka、flink等大数据处理框架的技术分享。文章会不断更新,欢迎码友关注点赞收藏转发!

关注多的话,后面会录制一些视频教程,图文和视频结合,比如:图书介绍网站系统、抢购系统、大数据中台系统等。技术才是程序猿的最爱,码友们冲啊

正文

在java开发中,几乎所有系统都有报表统计的功能,而报表统计的其中一个参数就是时间段,有环比同比时间段统计,有时间段统计,有周统计,有趋势图统计等,所以封装了该工具类,避免在每个统计方法中重复的计算这样那样的日期。

照旧先上工具类使用栗子:

System.out.println("201909环比日期="+ReportDateUtil.getHbMonth("201909")); System.out.println("201909同比日期="+ReportDateUtil.getTbMonth("201909")); System.out.println("201901-201909相隔月数="+ReportDateUtil.getPeriodAmount("20190101", "20190901", ReportDateUtil.MONTH)); // 用于趋势图中显示日期,当统计值为0时也是要显示的哦 System.out.println("201901-201909之间的日期列表="+ReportDateUtil.getPeriodDateList("20190101", "20190901", ReportDateUtil.MONTH)); ReportDateUtil.getMonthWeekGroupList("201909").forEach((k, v) -> { // 计算9月份共有多少周,每周的日期System.out.println("201909第"+k+"周:"+v.toString()); }); System.out.println("201909中的自然周为="+ReportDateUtil.getMonthWeekList("201909"));

上面使用例子打印如下

201909环比日期=201908 201909同比日期=201809 201901-201909相隔月数=8 201901-201909之间的日期列表=[201901, 201902, 201903, 201904, 201905, 201906, 201907, 201908, 201909] 201909第1周:[2019-09-01, 2019-09-02, 2019-09-03, 2019-09-04, 2019-09-05, 2019-09-06, 2019-09-07] 201909第2周:[2019-09-08, 2019-09-09, 2019-09-10, 2019-09-11, 2019-09-12, 2019-09-13, 2019-09-14] 201909第3周:[2019-09-15, 2019-09-16, 2019-09-17, 2019-09-18, 2019-09-19, 2019-09-20, 2019-09-21] 201909第4周:[2019-09-22, 2019-09-23, 2019-09-24, 2019-09-25, 2019-09-26, 2019-09-27, 2019-09-28] 201909第5周:[2019-09-29, 2019-09-30] 201909中的自然周为=[201939, 201936, 201938, 201937, 201940]

下面给出完整的工具类,这是我项目中在报表统计时经常用到的,有需要的码友可以先收藏,说不定哪天就用到了。

import java.time.DayOfWeek; import java.time.LocalDate; import java.time.Period; import java.time.YearMonth; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAdjusters; import java.time.temporal.WeekFields; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; /*** 报表日期工具类** @author liang - liangxn* @date 2019/9/19 10:17*/ public class ReportDateUtil { private static final DateTimeFormatter DTF_YYYYMMDD = DateTimeFormatter.ofPattern("yyyyMMdd"); private static final DateTimeFormatter DTF_YYYYMM = DateTimeFormatter.ofPattern("yyyyMM"); private static final DateTimeFormatter DTF_YYYY = DateTimeFormatter.ofPattern("yyyy"); private static final String PATTERN_WEEK = "yyyyw"; public static final int YEAR = 1; public static final int MONTH = 2; public static final int DAY = 3; public static void main(String[] args) { System.out.println("201909环比日期="+ReportDateUtil.getHbMonth("201909")); System.out.println("201909同比日期="+ReportDateUtil.getTbMonth("201909")); System.out.println("201901-201909相隔月数="+ReportDateUtil.getPeriodAmount("20190101", "20190901", ReportDateUtil.MONTH)); System.out.println("201901-201909之间的日期列表="+ReportDateUtil.getPeriodDateList("20190101", "20190901", ReportDateUtil.MONTH)); ReportDateUtil.getMonthWeekGroupList("201909").forEach((k, v) -> { System.out.println("201909第"+k+"周:"+v.toString()); }); System.out.println("201909中的自然周为="+ReportDateUtil.getMonthWeekList("201909")); } /*** 获取月的第一天** @param currMonth 当前日期字符串,格式yyyyMM* @return*/ public static String getFirstOfMonth(String currMonth) { currMonth = currMonth + "01"; LocalDate d = LocalDate.parse(currMonth, DTF_YYYYMMDD); return DTF_YYYYMMDD.format(d.with(TemporalAdjusters.firstDayOfMonth())); } /*** 获取月的最后一天** @param currMonth 当前日期字符串,格式yyyyMM* @return*/ public static String getLastOfMonth(String currMonth) { currMonth = currMonth + "01"; LocalDate d = LocalDate.parse(currMonth, DTF_YYYYMMDD); return DTF_YYYYMMDD.format(d.with(TemporalAdjusters.lastDayOfMonth())); } /*** 获取年的第一天** @param currYear 当前日期字符串,格式yyyy* @return*/ public static String getFirstOfYear(String currYear) { currYear = currYear + "0101"; LocalDate d = LocalDate.parse(currYear, DTF_YYYYMMDD); return DTF_YYYYMMDD.format(d.with(TemporalAdjusters.firstDayOfYear())); } /*** 获取年的最后一天** @param currYear 当前日期字符串,格式yyyy* @return*/ public static String getLastOfYear(String currYear) { currYear = currYear + "0101"; LocalDate d = LocalDate.parse(currYear, DTF_YYYYMMDD); return DTF_YYYYMMDD.format(d.with(TemporalAdjusters.lastDayOfYear())); } /*** 计算环比月** @param currMonth 当前日期字符串,格式yyyyMM* @return*/ public static String getHbMonth(String currMonth) { currMonth = currMonth + "01"; LocalDate d = LocalDate.parse(currMonth, DTF_YYYYMMDD); return DTF_YYYYMM.format(d.minusMonths(1L)); } /*** 计算同比月** @param currMonth 当前日期字符串,格式yyyyMM* @return*/ public static String getTbMonth(String currMonth) { currMonth = currMonth + "01"; LocalDate d = LocalDate.parse(currMonth, DTF_YYYYMMDD); return DTF_YYYYMM.format(d.minusYears(1L)); } /*** 计算两个日期之间的年(或月或日)的集合** @param startDate 开始的日期 yyyyMMdd* @param endDate 结束的日期 yyyyMMdd* @param unit 年(或月或日)的标识,默认日* @return*/ public static List getPeriodDateList(String startDate, String endDate, int unit) { List l = new ArrayList<>(); LocalDate start = LocalDate.parse(startDate, DTF_YYYYMMDD); LocalDate end = LocalDate.parse(endDate, DTF_YYYYMMDD); Period p = Period.between(start, end); if (ReportDateUtil.YEAR == unit) { for (int i = 0; i <= p.getYears(); i++) { l.add(DTF_YYYY.format(start.plusYears(i))); } } else if (ReportDateUtil.MONTH == unit) { for (int i = 0; i <= p.getMonths(); i++) { l.add(DTF_YYYYMM.format(start.plusMonths(i))); } } else if (ReportDateUtil.DAY == unit) { for (int i = 0; i <= p.getDays(); i++) { l.add(DTF_YYYYMMDD.format(start.plusDays(i))); } } return l; } /*** 计算两个日期之间的年(或月或日)的集合** @param startDate 开始的日期 yyyyMMdd* @param endDate 结束的日期 yyyyMMdd* @param unit 年(或月或日)的标识,默认日* @return*/ public static List getPeriodDateList(String startDate, String endDate, int unit, String pattern) { DateTimeFormatter dtf = DateTimeFormatter.ofPattern(pattern); List l = new ArrayList<>(); LocalDate start = LocalDate.parse(startDate, DTF_YYYYMMDD); LocalDate end = LocalDate.parse(endDate, DTF_YYYYMMDD); Period p = Period.between(start, end); if (ReportDateUtil.YEAR == unit) { for (int i = 0; i <= p.getYears(); i++) { l.add(dtf.format(start.plusYears(i))); } } else if (ReportDateUtil.MONTH == unit) { for (int i = 0; i <= p.getMonths(); i++) { l.add(dtf.format(start.plusMonths(i))); } } else if (ReportDateUtil.DAY == unit) { for (int i = 0; i <= p.getDays(); i++) { l.add(dtf.format(start.plusDays(i))); } } return l; } /*** 计算某个月的的每一周在一年中属于第几周的集合,如2019年9月有6周(周一为一周开始),则返回结果为:[201934,201935,201936,201937,201938,201939]** @param currMonth 年月字符串 yyyyMM* @return*/ public static List getMonthWeekList(String currMonth) { return getMonthWeekList(currMonth, PATTERN_WEEK); } /*** 计算某个月的的每一周在一年中属于第几周的集合,如2019年9月有6周(周一为一周开始),则返回结果为:[201934,201935,201936,201937,201938,201939]** @param currMonth 年月字符串 yyyyMM* @return*/ public static List getMonthWeekList(String currMonth, String pattern) { final DateTimeFormatter DTF_WEEK = DateTimeFormatter.ofPattern(pattern); YearMonth yearMonth = YearMonth.parse(currMonth, DTF_YYYYMM); LocalDate start = LocalDate.now().with(yearMonth).with(TemporalAdjusters.firstDayOfMonth()); LocalDate end = LocalDate.now().with(yearMonth).with(TemporalAdjusters.lastDayOfMonth()); if(end.isAfter(LocalDate.now())){ end = LocalDate.now(); } // 按周分组,设置一周的开始日期为 星期天 Map> collect = Stream.iterate(start, localDate -> localDate.plusDays(1L)) .limit(ChronoUnit.DAYS.between(start, end) + 1) .collect(Collectors.groupingBy(localDate -> DTF_WEEK.format(localDate))); List l = new ArrayList<>(); collect.forEach((k, v) -> l.add(k)); return l; } /*** 计算某个月的自然周数的集合,按周分组,并列出每周的天日期,例如201909月有5周,每周的日期如下:* 第1周:[2019-09-01, 2019-09-02, 2019-09-03, 2019-09-04, 2019-09-05, 2019-09-06, 2019-09-07]* 第2周:[2019-09-08, 2019-09-09, 2019-09-10, 2019-09-11, 2019-09-12, 2019-09-13, 2019-09-14]* 第3周:[2019-09-15, 2019-09-16, 2019-09-17, 2019-09-18, 2019-09-19, 2019-09-20, 2019-09-21]* 第4周:[2019-09-22, 2019-09-23, 2019-09-24, 2019-09-25, 2019-09-26, 2019-09-27, 2019-09-28]* 第5周:[2019-09-29, 2019-09-30]** @param currMonth 年月字符串 yyyyMM* @return*/ public static Map> getMonthWeekGroupList(String currMonth) { YearMonth yearMonth = YearMonth.parse(currMonth, DTF_YYYYMM); LocalDate start = LocalDate.now().with(yearMonth).with(TemporalAdjusters.firstDayOfMonth()); LocalDate end = LocalDate.now().with(yearMonth).with(TemporalAdjusters.lastDayOfMonth()); // 按周分组,设置一周的开始日期为 星期天 return Stream.iterate(start, localDate -> localDate.plusDays(1L)) .limit(ChronoUnit.DAYS.between(start, end) + 1) .collect(Collectors.groupingBy(localDate ->localDate.get(WeekFields.of(DayOfWeek.SUNDAY, 1).weekOfMonth()))); } /*** 计算两个日期相隔多少年(或月或日)** @param startDate 开始的日期 yyyyMMdd* @param endDate 结束的日期 yyyyMMdd* @param unit 计算年(或月或日)的标识,默认日* @return*/ public static int getPeriodAmount(String startDate, String endDate, int unit) { LocalDate start = LocalDate.parse(startDate, DTF_YYYYMMDD); LocalDate end = LocalDate.parse(endDate, DTF_YYYYMMDD); Period p = Period.between(start, end); if (ReportDateUtil.YEAR == unit) { return p.getYears(); } else if (ReportDateUtil.MONTH == unit) { return p.getMonths(); } return p.getDays(); } }

大部分系统都是有图表统计的,有图表统计的话基本都能使用到这个工具类。这也是我在多个项目中都用到,所以封装了这个工具类。

以上就是本站»报表统计怎么做(月报表的统计制作方法)的相关内容了,更多精彩请关注作者:万年知识

声明:本文由本站【创业者资源平台】作者编辑发布,更多技术关注万年技术!

怎么做一个汇总统计表

汇总统计表具体做法如下:

1、在电脑上打开表格后,点击数据。

2、在数据界面,选中需要汇总的表格。

3、点击分类汇总。

4、选择需要汇总的项目,点击确定。

5、自动生成汇总表。

总结:

1、打开表格,点击数据。

2、选中需要汇总的表格,点击分类汇总。

3、选择汇总项目,点击确定。

生产统计表怎么做

问题一:如何做生产销售统计表厂产品生产销售月报统计表
――――――――矗―――――――――
日期-产品名称-生产数量-销售数量-库存-备注
●●你划上格就可以了

问题二:怎样做好生产统计表一般表格类,网上都会有无数的模版,建议您根据公司的性质和所在的行业,百度一下,相信会有您要的东西,再根据自己公司的实际情况,再来进行表格调整,相信您也可以拥有像深圳乔本金刚石刀具有限公司的客户管理表格一样方便而又实用的EXCEL哦~

问题三:生产配件如何用excel表格做计件统计表,一,新建一个EXCEL表格,命名为“计件工资明细表”,
其次,在Sheet1,命名为“员工编号”,当然,这个员工编号,是所有计件人员的编号。
二,在Sheet2,命名为“工价表”,此份工价表的要求是,工序号是唯一,不能重复。
三、为了防止有人在工价表中更改单价,还可以将工价表的单价加密。
方法:
(1)选中整个单元格,
(2)右击,选择设置单元格格式,如图,
四、在保护菜单下,把锁定与隐藏选项注销,单击确定
(3)选中该表格中要加密的行列,如,此表中须将工序号与单价加密,则选中A列与G列,右击,选择“设置单元格格式”,出现上图,在保护菜单下,勾选锁定,或选隐藏,也可不选。
(4)在工具菜单下,选择保护-――保护工作簿,直接输入密码,单击确定,回到工作薄,再次单击单价单元格,出现如下图所示,就表示已起到保护作用。
五,在Sheet3,命名为制单号,输入当前期所有的生产制单,这可方便为做成本核算的工资汇总提供依据,制令单号为唯一,如图格式:
六,添加一个工作表,命名“当月工资明细”,如下图格式
七.为了工作方面,可以适当在表格中添加函数,如C例,可以通过插入VLOOKUP函数,方法:在C2单元格中输入“=IF(B2=0,” “,VLOOKUP(B2,制单!B:C,2,0)”,此函数的意思是,如果B2单元格为0,则C2为空格,否则就会引入制单表格中,相同制单的产品型号。同样的,可以在F2及I2中,均可插入VLOOKUP函数,方法像上所示,末了,如须将有函数部分的单元格保护或隐藏,请参照步骤二所示。
八,回到员工编号工作表,在B2单元格内输入SUMIF函数,把当月计件工资汇总,方法:=SUMIF(当月工资表!E:E,员工编号!A2,当月工资表!J:J),同样地,也可以在制单工作表内计件工资单元额E2中输入:“=SUMIF(当月工资表!B:B,B2,当月工资表!J:J)”即可。

问题四:车间日生产统计报表怎么做,格式你是什么产什么产品的车间,产品和工序不一样,统计报表格式也不一样的

问题五:车间生产统计报表格式生产车间报表格式需要根据产品具体技术要求制定,包括如下:
生产的产量以及合格量;
生产的产品返修以及检查标准;
总结日(月)产量所消耗的材料用量等。

问题六:工厂计件统计表怎么做大帮手计件工资软件里有“计件计时工资明细表及月计件工资横表”,可供参考,可登录大帮手软件网站查看。

问题七:如何做生产投入产出统计表没有什么要求,不会说。

问题八:生产统计员要制作哪些表格?1、生产领料统计表;
2、生产日报表;
3、生产入库表;
4、不良统计表(分来料、制程);
5、其他主管人员要求表格;
注:以上表格分日、周、月、季、年;

问题九:统计表怎么做?统计表是由纵横交叉线条所绘制的表格来表现统计资料的一种形式. 根据《中国小学教学百科全书》介绍,它是用原始数据制成的一种表格.为了实际需要,人们常常要把工农业生产、科学技术和日常工作中所得到的相互关联的数据,按照一定的要求进行整理、归类,并按照一定的顺序把数据排列起来,制成表格,这种表格叫做统计表. 它的作用是:①用数量说明研究对象之间的相互关系.②用数量把研究对象之间的变化规律显着地表示出来.③用数量把研究对象之间的差别显着地表示出来.这样便于人们用来分析问题和研究问题.统计表的形式繁简不一,通常按项目的多少,分为单式统计表和复式统计表两种.只对某一个项目的数据进行统计的表格,叫做单式统计表,也叫做简单统计表.统计项目在两个或两个以上的统计表格,叫做复式统计表.统计表的内容一般都包括总标题、横标题、纵标题、数字资料、单位、制表日期.总标题是指表的名称,它要能简单扼要地反映出表的主要内容,横标题是指每一横行内数据的意义;纵标题是指每一纵栏内数据的意义;数字资料是指各空格内按要求填写的数字;单位是指表格里数据的计量单位.在数据单位相同时,一般把单位放在表格的左上角.如果各项目的数据单位不同时,可放在表格里注明.制表日期放在表的右上角,表明制表的时间.各种统计表都应有“备考”或“附注”栏,以便必要时填入不属于表内各项的事实或说明.在WORD可以画得