文章目录

  • 前言
  • 一、需求任务
    • 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),'')&lt;=7 AND IFNULL(TIMESTAMPDIFF(DAY,user.date_created,user.date_updated),'') &gt; 0,"是","否") as isSaveSevenDay,IF(IFNULL(TIMESTAMPDIFF(DAY,user.date_created,user.date_updated),'')&lt;=30 AND IFNULL(TIMESTAMPDIFF(DAY,user.date_created,user.date_updated),'') &gt; 7,"是","否") as isSaveThirtyDay,IF(IFNULL(TIMESTAMPDIFF(DAY,user.date_created,user.date_updated),'')&lt;=90 AND IFNULL(TIMESTAMPDIFF(DAY,user.date_created,user.date_updated),'') &gt;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 开发实习任务总结相关推荐

  1. 2021年4月22日 阿里供应链Java开发实习面试(三面)(含总结)

    title: 2021年4月22日 阿里供应链Java开发实习面试(三面) tags: 面经 2021年4月22日 阿里供应链Java开发实习面试(三面) 上来就手撕一道代码--输入一个数,然后顺时针 ...

  2. 2021年3月16日 北京快手Java开发实习面试(海外增长方向)

    title: 2021年3月16日 北京快手Java开发实习面试(海外增长方向) tags: 面经 2021年3月16日 北京快手Java开发实习面试(海外增长方向) 自我介绍你能讲一下你的项目吗?你 ...

  3. 2021年3月12日 北京格灵深瞳Java开发实习面试(一面)

    title: 2021年3月12日 北京格灵深瞳Java开发实习面试 tags: 面经 2021年3月12日 北京格灵深瞳Java开发实习面试(一面) 首先上来问你问什么不做算法,转做开发呢?(因为我 ...

  4. [3]Java开发实习面试打卡

    [2]Java开发实习面试打卡 1.创建索引的原则(重中之重) 最好符合以下几个原则: 1.最左前缀匹配原则,组合索引非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>,<,be ...

  5. 唯品会——java开发实习生机试

    唯品会--java开发实习生机试 共一个小时. 题型:共三种题型:单选17道,不定项选择3道,问答题5道.只有两道单选不是技术,其他都是技术题. 涉及面包括 1.spring中事务控制的注解 2.设计 ...

  6. Java 开发实习经验

    半年的实习结束了,总结了一下自己实习经验,希望对即将入职场的同学有些启发. 1.勤记录 进入一个项目组,有一系列需要熟悉的东西,比如文件名,函数,环境配置,或者是分配的任务. 这些基础的东西反复问别人 ...

  7. 网易java开发实习日记

    2014.05.14 心心念念的网易杭州,我来啦! 第一天入职,感觉很棒!被分到了支付部,这一个很年轻的部门,只有五十多个人.所以办公室也显得格外宽敞. 支付部主要做网易宝开发,我被安排到了理财开发小 ...

  8. Java开发实习经历01——寻找到入职(真实实习经历,希望对各位有帮助)

    省流小助手(总结): 1.直接海投,其他都别管,先快速积累大量面试经验,无论面试情况多糟糕都不要在意. 2.在无数次面试中总结面试官的常问问题以及套路,重点放在国企或千人以上的厂. 3.说什么要培训, ...

  9. 大四 Java开发实习近一年 记录(每6至12月更新一次)

    17年7月4号是我实习生入职的日子,因为是校企合作,所以没有面试.老师推荐.直接入职.刚来北京第一个感觉就是人多,还有就是热.刚到公司第一天,部门经理安排了我的mentor,他也是我的项目经理,安排座 ...

  10. 计算机网络管理员工作周记,计算机java开发实习周记20篇

    Log4j 由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式.日志信息的优先级从高到低有ERROR.WARN. INFO.DEBUG,分别用来指定这条日志信息的重要程度 ...

最新文章

  1. ActiveReports 报表应用教程 (2)---清单类报表
  2. python3精要(10)-while,for
  3. 华为k662c的虚拟服务器,华为k662c路由器怎么设置
  4. javac compiling error ( mising package)
  5. php的字符串、双引号输出变量的问题、转义字符
  6. sqli-lab———writeup(11~17)
  7. 4000多人全靠报表自动化,效率提高60%,这套数据平台方法论真强
  8. FineReport10.0功能说明
  9. MATLAB矩阵计算大全
  10. VsCode之在vue中HTML代码使用自动补全插件
  11. 【Python 24】52周存钱挑战4.0(函数)
  12. Unity3D 显示FPS
  13. excel自动换行快捷键_Excel中Alt键的10大应用技巧解读
  14. 2D横板动作游戏常用角色移动逻辑(转)
  15. openstack restful api 使用
  16. opencv-12-高斯滤波-双边滤波(附C++代码实现)
  17. 关于Idea 下载Maven依赖时出现的 “unexpected markup <!d (position: START_DOCUMENT seen \r\n<!d... @2:4) “ 错误.
  18. CAD引线标注文字大小怎么调整?
  19. 火狐浏览器无法正常访问(ADsafe)
  20. gmail收件箱标签设置_如何在Gmail中自动分类的收件箱选项卡之间移动电子邮件...

热门文章

  1. Unity花屏解决方案
  2. 谈谈安卓的Bitmap与Drawable
  3. 我的下一步的计算机学习计划
  4. 基于C51单片机+DS18B20温度传感器+LCD1602显示器的智能水温控制系统(PID)
  5. 逻辑与和按位与、逻辑或和按位或的区别
  6. 有奖调研 | 2021白帽调研启动!
  7. android中setBackgroundResource(int color) 与 setBackgroundColor(int color) 区别
  8. 使用Docker-compose部署wordpress
  9. 向量范数与矩阵范数的理解
  10. 基于超级网银异地多活项目的多活类项目测试经验分享,了解金融行业软件测试实践