diff --git a/sky-server/src/main/java/com/sky/controller/admin/ReportController.java b/sky-server/src/main/java/com/sky/controller/admin/ReportController.java index c32e421..a9d2e8b 100644 --- a/sky-server/src/main/java/com/sky/controller/admin/ReportController.java +++ b/sky-server/src/main/java/com/sky/controller/admin/ReportController.java @@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import javax.servlet.http.HttpServletResponse; import java.time.LocalDate; @RestController @@ -85,4 +86,14 @@ public class ReportController { return Result.success(vo); } + + /** + * 使用响应对象,导出报表数据 + * @param response + */ + @ApiOperation("导出报表数据") + @GetMapping("/export") + public void exportExcel(HttpServletResponse response) throws Exception { + reportService.exportExcel(response); + } } diff --git a/sky-server/src/main/java/com/sky/service/ReportService.java b/sky-server/src/main/java/com/sky/service/ReportService.java index 4c2847a..5a50950 100644 --- a/sky-server/src/main/java/com/sky/service/ReportService.java +++ b/sky-server/src/main/java/com/sky/service/ReportService.java @@ -5,6 +5,7 @@ import com.sky.vo.SalesTop10ReportVO; import com.sky.vo.TurnoverReportVO; import com.sky.vo.UserReportVO; +import javax.servlet.http.HttpServletResponse; import java.time.LocalDate; public interface ReportService { @@ -39,4 +40,6 @@ public interface ReportService { * @return */ SalesTop10ReportVO getTop10(LocalDate begin, LocalDate end); + + void exportExcel(HttpServletResponse response) throws Exception; } diff --git a/sky-server/src/main/java/com/sky/service/impl/ReportServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/ReportServiceImpl.java index 877c9fb..3fa4ad4 100644 --- a/sky-server/src/main/java/com/sky/service/impl/ReportServiceImpl.java +++ b/sky-server/src/main/java/com/sky/service/impl/ReportServiceImpl.java @@ -5,14 +5,19 @@ import com.sky.entity.Orders; import com.sky.mapper.OrderMapper; import com.sky.mapper.UserMapper; import com.sky.service.ReportService; -import com.sky.vo.OrderReportVO; -import com.sky.vo.SalesTop10ReportVO; -import com.sky.vo.TurnoverReportVO; -import com.sky.vo.UserReportVO; +import com.sky.service.WorkspaceService; +import com.sky.vo.*; import org.apache.commons.lang3.StringUtils; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; @@ -31,6 +36,9 @@ public class ReportServiceImpl implements ReportService { @Autowired private UserMapper userMapper; + @Autowired + private WorkspaceService workspaceService; + /** * 统计指定时间内每天的营业额数据 @@ -230,4 +238,58 @@ public class ReportServiceImpl implements ReportService { return salesTop10ReportVO; } + + @Override + public void exportExcel(HttpServletResponse response) throws Exception { + //准备30天的今日数据(工作台模块实现完毕!!) + LocalDate now = LocalDate.now();//今日日期 + LocalDate beginDate = now.minusDays(30);//开始日期 + LocalDate endDate = now.minusDays(1);//结束日期 + + LocalDateTime beginTime = LocalDateTime.of(beginDate, LocalTime.MIN); + LocalDateTime endTime = LocalDateTime.of(endDate, LocalTime.MAX); + + //查询近30天的每日数据 + BusinessDataVO businessData = workspaceService.getBusinessData(beginTime, endTime); + + //使用输入流读取服务器的模版,将30天的商业数据,填充到模版中 + InputStream in = this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx"); + XSSFWorkbook excel = new XSSFWorkbook(in); + XSSFSheet sheet = excel.getSheetAt(0); + //时间范围填充 + sheet.getRow(1).getCell(1).setCellValue(beginDate.toString()+"至"+endDate.toString()); + //概览数据填充 + sheet.getRow(3).getCell(2).setCellValue(businessData.getTurnover()); + sheet.getRow(3).getCell(4).setCellValue(businessData.getOrderCompletionRate()); + sheet.getRow(3).getCell(6).setCellValue(businessData.getNewUsers()); + sheet.getRow(4).getCell(2).setCellValue(businessData.getValidOrderCount()); + sheet.getRow(4).getCell(4).setCellValue(businessData.getUnitPrice()); + + //填充明细数据,一共30行 + for (int i = 0; i < 30; i++) { + //从开始日期,动态获取近30天的每天的日期 + LocalDate date = beginDate.plusDays(i);//1-1 1-2 1-3 -----1-30 + + BusinessDataVO data = workspaceService.getBusinessData(LocalDateTime.of(date,LocalTime.MIN), LocalDateTime.of(date,LocalTime.MAX)); + //获取动态的row + XSSFRow row = sheet.getRow(7 + i); + //动态填充一行数据 + row.getCell(1).setCellValue(date.toString()); + row.getCell(2).setCellValue(data.getTurnover()); + row.getCell(3).setCellValue(data.getValidOrderCount()); + row.getCell(4).setCellValue(data.getOrderCompletionRate()); + row.getCell(5).setCellValue(data.getUnitPrice()); + row.getCell(6).setCellValue(data.getNewUsers()); + + } + //填充完毕excel文件数据之后,通过响应对象的输出流,将excel字节数据输出到对应的客户端浏览器中 + + ServletOutputStream out = response.getOutputStream(); + excel.write(out); + + //资源释放 + out.close(); + excel.close(); + + } } diff --git a/sky-server/src/main/resources/template/运营数据报表模板.xlsx b/sky-server/src/main/resources/template/运营数据报表模板.xlsx new file mode 100644 index 0000000..76806c5 Binary files /dev/null and b/sky-server/src/main/resources/template/运营数据报表模板.xlsx differ