目录
1、业务场景
2、开发环境和工具
3、代码思路
4、参考代码
controller层
service层
1、业务场景
(1)、前置条件:查询接口已经做好,可直接调用;
(2)、需要实现:
前端:点击查询结果数据列表右上方的导出按钮后,导出一个对应数据列表的excel文件,文件名由前端定义;
后端:接收到导出请求后,首先进行身份验证(这里以companyId为例),然后执行创建excel文件的一系列操作,sheet(工作薄)名称和表头都需要按照需求定义设计;
2、开发环境和工具
因为该业务功能是在我实习公司已有项目下的拓展,所以环境依赖较多,我将重点阐述我所负责的后端代码逻辑,开发环境和工具只会简单带过;
(1)、IDE:IntelliJ IDEA 2022.1
(2)、测试:Postman
(3)、JDK:jdk-11.0.15
(4)、Spring Boot Version:2.2.5.RELEASE
(5)、modelVersion:4.0.0
(6)、pomVersion:0.0.1-SNAPSHOT
3、代码思路
4、参考代码
实体类(代码中体现为:EntityClassVo+数字)请根据实际的业务需求自行构建,我的理解就是把数据库对应属性放进去,然后添加属性方法(get和set)即可。
controller层
/**
* 导出设备信息数据列表
* @param vo
* @param request
* @param response
* @return: xxx.utils.util.CommonResponse
* @author Mike-GY
* @since: 2022/8/2
*/
@RequestMapping(value ="/exportDeviceInfoList" ,method = RequestMethod.POST)
public void exportDeviceInfoList(@RequestBody EntityClass1Vo vo, HttpServletRequest request, HttpServletResponse response) throws IOException{
//通过前端获取公司ID,即保证只能查询和导出自己公司的数据
int companyId = Integer.parseInt(HttpUtil.getCompanyId(request));
vo.setCompanyId(companyId);
//创建一个新的.xls文件
ServletOutputStream outputStream = ExportUtil.getServletOutputStream(request, response, "设备信息数据列表.xls");
//调用service层的代码完成具体实现
workerHomePageV2Service.exportDeviceInfoList(vo,outputStream);
//关闭并释放输出流资源
outputStream.close();
}
}
service层
/**
* 导出人员设备信息数据列表
* @param vo
* @param outputStream
* @return: "人员设备信息数据列表.xls"
* @author Mike—GY
* @since: 2022/8/2
*/
public void exportDeviceInfoList(EntityClass1Vo vo,ServletOutputStream outputStream) throws IOException {
HSSFWorkbook wb = new HSSFWorkbook();
//创建一个新的table工作薄
HSSFSheet sheet = wb.createSheet("设备信息");
// 行
HSSFRow row;
// 单元格
HSSFCell cell;
// 表头
String[] ths = {"序号","组织","日期","设备总数","在线设备","离线设备","在线率"};
// 构建表头
row = sheet.createRow(0);
for(int i = 0; i< ths.length;i++) {
cell = row.createCell(i);
cell.setCellValue(ths[i]);
}
//查询要导出的数据并将结果赋给data,目的是使代码简洁直观(有数据类型转换)
List<EntityClass2Vo> data = (List<EntityClass2Vo>)this.queryInterface(vo).getResultData();
if(CollectionUtils.isNotEmpty(data)) {
for (int i = 0;i< data.size(); i++) {
EntityClass2Vo entityClass2Vo = data.get(i);
HSSFRow createRow = sheet.createRow(i + 1);
//序号
int number = i + 1;
HSSFCell numberCell = createRow.createCell(0);
numberCell.setCellValue(number);
//组织名称
String deptName = entityClass2Vo.getDeptName();
HSSFCell deptNameCell = createRow.createCell(1);
if (StringUtils.isNotEmpty(deptName)) {
deptNameCell.setCellValue(deptName);
}
//记录日期
String recordDate = entityClass2Vo.getRecordDate();
HSSFCell recordDateCell = createRow.createCell(2);
if (StringUtils.isNotEmpty(recordDate)) {
recordDateCell.setCellValue(recordDate);
}
//设备总数
Integer deviceTotalNum = entityClass2Vo.getDeviceTotalNum();
HSSFCell deviceTotalNumCell = createRow.createCell(3);
if (deviceTotalNum != null) {
deviceTotalNumCell.setCellValue(deviceTotalNum);
}
//在线设备
Integer onlineNum = entityClass2Vo.getOnlineNum();
HSSFCell onlineNumCell = createRow.createCell(4);
if (onlineNum != null) {
onlineNumCell.setCellValue(onlineNum);
}
//离线设备
Integer offlineNum = entityClass2Vo.getOfflineNum();
HSSFCell offlineNumCell = createRow.createCell(5);
if (offlineNum != null) {
offlineNumCell.setCellValue(offlineNum);
}
//在线率
BigDecimal onlineRate = entityClass2Vo.getOnlineRate();
HSSFCell onlineRateCell = createRow.createCell(6);
if (onlineRate != null) {
onlineRateCell.setCellValue(onlineRate.toString());
}
}
}
//将数据写入之前创建的.xls文件
wb.write(outputStream);
//关闭HSSFWorkbook
wb.close();
}
我遇到的问题:
(1)、我后端创建.xls文件时明明在controller层定义了文件名称,可使用postman自测时创建得到的文件名仍然是乱码,最后由前端完成了文件名称命名这个操作;
(2)、在进行数据插入excel文件的操作过程中(for循环里),不同数据类型的判空操作和赋值操作有所出入(可能涉及到数据类型转换),请依靠开发工具提示和其他参考资料自行选择适用的方法。
|