Java 开发实习任务总结
文章目录
- 前言
- 一、需求任务
- 1.1 明确需求
- 1.2 确定方向
- 二、编写代码
- 2.1 导入依赖
- 2.2 编写实体类
- 2.3 接口上添加抽象方法
- 2.4 实现类实现抽象方法
- 2.5 ReportMapper添加方法
- 2.6 ReportMapper.xml中编写Sql
- 2.7 编写Controller层代码
- 2.8 测试
- 总结
前言
文章主要记录本人到公司实习的工作任务,解决任务思路以及错误排查以此来达到分享和开发过程总结的目的。
一、需求任务
1.1 明确需求
从数据库表中导出 excel 表形式的数据,导出的数据如下:
用户信息表
用户记录表
1.2 确定方向
使用 Springboot 框架结合JAVA解析Excel工具 EasyExcel 来实现。
EasyExcel官网:https://github.com/alibaba/easyexcel
Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便。
二、编写代码
2.1 导入依赖
<!--EasyExcel相关依赖-->
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version>
</dependency>
2.2 编写实体类
@Data
public class ReportExcelBean {@ExcelProperty(value = "年龄", index = 0)private Integer age;@ExcelProperty(value = "性别", index = 1)private Integer sex;@ExcelProperty(value = "设备型号", index = 2)private String deviceVersion;@ExcelProperty(value = "手机号码", index = 3)private String phone;@ExcelProperty(value = "累计访问次数", index = 4)private Integer reportVisitNum;@ExcelProperty(value = "累计生成报告数", index = 5)private Integer reportNum;@ExcelProperty(value = "首次访问日期", index = 6)@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")private Date dateCreated;@ExcelProperty(value = "最后访问日期", index = 7)@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")private Date dateUpdated;@ExcelProperty(value = "7日留存", index = 8)private String isSaveSevenDay;@ExcelProperty(value = "30日留存", index = 9)private String isSaveThirtyDay;@ExcelProperty(value = "90日留存", index = 10)private String isSaveNinetyDay;@ExcelProperty(value = "左眼视力", index = 11)private String leftEye;@ExcelProperty(value = "右眼视力", index = 12)private String rightEye;@ExcelProperty(value = "左眼视力变化", index = 13)private String leftEyeChange;@ExcelProperty(value = "右眼视力变化", index = 14)private String rightEyeChange;
}
导出 Excel 时,若需要表头在属性上@ExcelProperty(value = “id”, index = 0) 注解。其中 value 代表在导出 Excel 时,该字段对应的表头名称;index 代表该字段对应的表头位置(从0开始)。如下图:
2.3 接口上添加抽象方法
public interface ReportManager extends IService<Report> {//导出用户数据void export(HttpServletResponse response) throws IOException;}
2.4 实现类实现抽象方法
@Service
public class ReportManagerImpl extends ServiceImpl<ReportMapper, Report> implements ReportManager {@AutowiredReportMapper reportMapper;@Overridepublic void export(HttpServletResponse response) throws IOException {List<ReportExcelBean> reportExcelBeanList = reportMapper.userOtherInfo();//导出String fileName = "report数据";response.setContentType("application/vnd.ms-excel;charset=utf-8");response.setCharacterEncoding("utf-8");response.setHeader("Content-Disposition", "attachment;filename=" + new String( fileName.getBytes("gb2312"), "ISO8859-1" ) + ".xlsx");ServletOutputStream out = response.getOutputStream();EasyExcel.write(response.getOutputStream()).head(ReportExcelBean.class).excelType(ExcelTypeEnum.XLSX).sheet("report数据").doWrite(reportExcelBeanList);out.flush();response.getOutputStream().close();out.close();}
}
2.5 ReportMapper添加方法
在 ReportMapper.java 中 添加 userOtherInfo() 方法返回 ReportExcelBean 的List集合。
@Mapper
public interface ReportMapper extends BaseMapper<Report> {List<ReportExcelBean> userOtherInfo();
}
2.6 ReportMapper.xml中编写Sql
查询符合条件的用户信息
<select id="userOtherInfo" resultType="com.boe.visual.chart.service.bean.ReportExcelBean">SELECTuser.age as age,user.sex as sex,user.device_version as deviceVersion,user.phone as phone,IFNULL(a.report_visitNum, 0) AS reportVisitNum,IFNULL(a.report_num, 0) AS reportNum,user.date_created as dateCreated,IFNULL(user.date_updated, '') AS dateUpdated,IF(IFNULL(TIMESTAMPDIFF(DAY,user.date_created,user.date_updated),'')<=7 AND IFNULL(TIMESTAMPDIFF(DAY,user.date_created,user.date_updated),'') > 0,"是","否") as isSaveSevenDay,IF(IFNULL(TIMESTAMPDIFF(DAY,user.date_created,user.date_updated),'')<=30 AND IFNULL(TIMESTAMPDIFF(DAY,user.date_created,user.date_updated),'') > 7,"是","否") as isSaveThirtyDay,IF(IFNULL(TIMESTAMPDIFF(DAY,user.date_created,user.date_updated),'')<=90 AND IFNULL(TIMESTAMPDIFF(DAY,user.date_created,user.date_updated),'') >30,"是","否") as isSaveNinetyDay,IFNULL(a.last_left_eye, '') AS leftEye,IFNULL(a.last_right_eye, '') AS rightEye,IFNULL(CONCAT(a.last_left_eye, '-', b.first_left_eye),'') AS leftEyeChange,IFNULL(CONCAT(a.last_right_eye, '-', b.first_right_eye),'') AS rightEyeChangeFROMt_electronic_vision_user `user`LEFT JOIN (SELECTANY_VALUE(rr.left_eye) AS last_left_eye,ANY_VALUE(rr.right_eye) AS last_right_eye,re.report_visitNum,re.report_num,re.user_id,rr.date_createdFROMt_electronic_vision_report rr,(SELECTuser_id,COUNT(is_visitor) AS report_visitNum,COUNT(id) AS report_num,MAX(date_created) AS last_test_timeFROMt_electronic_vision_reportGROUP BYuser_id) reWHERErr.user_id = re.user_idAND re.last_test_time = rr.date_createdGROUP BYrr.user_id,rr.date_created) a ON user.user_id = a.user_idLEFT JOIN (SELECTANY_VALUE(rr.left_eye) AS first_left_eye,ANY_VALUE(rr.right_eye) AS first_right_eye,re.report_visitNum,re.report_num,re.user_id,rr.date_createdFROMt_electronic_vision_report rr,(SELECTuser_id,COUNT(is_visitor) AS report_visitNum,COUNT(id) AS report_num,MIN(date_created) AS first_test_timeFROMt_electronic_vision_reportGROUP BYuser_id) reWHERErr.user_id = re.user_idAND re.first_test_time = rr.date_createdGROUP BYrr.user_id,rr.date_created) b ON user.user_id = b.user_idORDER BYuser.device_version ASC,user.user_id ASC
</select>
2.7 编写Controller层代码
@RestController
@Api(tags = "EasyExcelController" , value = "EasyExcel导出测试")
@RequestMapping("/admin")
public class EasyExcelController{@AutowiredReportManager reportManager;@GetMapping("userOtherInfo/excel")public void excelExportOther(HttpServletResponse response) throws IOException {reportManager.export(response);}}
2.8 测试
启动项目输入请求路径,出现下载好的report数据(10).xlsx
打开report数据(10).xlsx
总结
刚开始做时有的导出的列为空值,没有数据可以通过debug调试,查看要查出的列是否为null。如果是的话大概率是在2.6 ReportMapper.xml中编写Sql中查询的列名和实体类ReportExcelBean的属性名不一致导致的。如下要一一对应:
Java 开发实习任务总结相关推荐
- 2021年4月22日 阿里供应链Java开发实习面试(三面)(含总结)
title: 2021年4月22日 阿里供应链Java开发实习面试(三面) tags: 面经 2021年4月22日 阿里供应链Java开发实习面试(三面) 上来就手撕一道代码--输入一个数,然后顺时针 ...
- 2021年3月16日 北京快手Java开发实习面试(海外增长方向)
title: 2021年3月16日 北京快手Java开发实习面试(海外增长方向) tags: 面经 2021年3月16日 北京快手Java开发实习面试(海外增长方向) 自我介绍你能讲一下你的项目吗?你 ...
- 2021年3月12日 北京格灵深瞳Java开发实习面试(一面)
title: 2021年3月12日 北京格灵深瞳Java开发实习面试 tags: 面经 2021年3月12日 北京格灵深瞳Java开发实习面试(一面) 首先上来问你问什么不做算法,转做开发呢?(因为我 ...
- [3]Java开发实习面试打卡
[2]Java开发实习面试打卡 1.创建索引的原则(重中之重) 最好符合以下几个原则: 1.最左前缀匹配原则,组合索引非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>,<,be ...
- 唯品会——java开发实习生机试
唯品会--java开发实习生机试 共一个小时. 题型:共三种题型:单选17道,不定项选择3道,问答题5道.只有两道单选不是技术,其他都是技术题. 涉及面包括 1.spring中事务控制的注解 2.设计 ...
- Java 开发实习经验
半年的实习结束了,总结了一下自己实习经验,希望对即将入职场的同学有些启发. 1.勤记录 进入一个项目组,有一系列需要熟悉的东西,比如文件名,函数,环境配置,或者是分配的任务. 这些基础的东西反复问别人 ...
- 网易java开发实习日记
2014.05.14 心心念念的网易杭州,我来啦! 第一天入职,感觉很棒!被分到了支付部,这一个很年轻的部门,只有五十多个人.所以办公室也显得格外宽敞. 支付部主要做网易宝开发,我被安排到了理财开发小 ...
- Java开发实习经历01——寻找到入职(真实实习经历,希望对各位有帮助)
省流小助手(总结): 1.直接海投,其他都别管,先快速积累大量面试经验,无论面试情况多糟糕都不要在意. 2.在无数次面试中总结面试官的常问问题以及套路,重点放在国企或千人以上的厂. 3.说什么要培训, ...
- 大四 Java开发实习近一年 记录(每6至12月更新一次)
17年7月4号是我实习生入职的日子,因为是校企合作,所以没有面试.老师推荐.直接入职.刚来北京第一个感觉就是人多,还有就是热.刚到公司第一天,部门经理安排了我的mentor,他也是我的项目经理,安排座 ...
- 计算机网络管理员工作周记,计算机java开发实习周记20篇
Log4j 由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式.日志信息的优先级从高到低有ERROR.WARN. INFO.DEBUG,分别用来指定这条日志信息的重要程度 ...
最新文章
- ActiveReports 报表应用教程 (2)---清单类报表
- python3精要(10)-while,for
- 华为k662c的虚拟服务器,华为k662c路由器怎么设置
- javac compiling error ( mising package)
- php的字符串、双引号输出变量的问题、转义字符
- sqli-lab———writeup(11~17)
- 4000多人全靠报表自动化,效率提高60%,这套数据平台方法论真强
- FineReport10.0功能说明
- MATLAB矩阵计算大全
- VsCode之在vue中HTML代码使用自动补全插件
- 【Python 24】52周存钱挑战4.0(函数)
- Unity3D 显示FPS
- excel自动换行快捷键_Excel中Alt键的10大应用技巧解读
- 2D横板动作游戏常用角色移动逻辑(转)
- openstack restful api 使用
- opencv-12-高斯滤波-双边滤波(附C++代码实现)
- 关于Idea 下载Maven依赖时出现的 “unexpected markup <!d (position: START_DOCUMENT seen \r\n<!d... @2:4) “ 错误.
- CAD引线标注文字大小怎么调整?
- 火狐浏览器无法正常访问(ADsafe)
- gmail收件箱标签设置_如何在Gmail中自动分类的收件箱选项卡之间移动电子邮件...
热门文章
- Unity花屏解决方案
- 谈谈安卓的Bitmap与Drawable
- 我的下一步的计算机学习计划
- 基于C51单片机+DS18B20温度传感器+LCD1602显示器的智能水温控制系统(PID)
- 逻辑与和按位与、逻辑或和按位或的区别
- 有奖调研 | 2021白帽调研启动!
- android中setBackgroundResource(int color) 与 setBackgroundColor(int color) 区别
- 使用Docker-compose部署wordpress
- 向量范数与矩阵范数的理解
- 基于超级网银异地多活项目的多活类项目测试经验分享,了解金融行业软件测试实践