使用POI需要导入下面2个坐标:
- <dependency>
- <groupId>org.apache.poigroupId>
- <artifactId>poiartifactId>
- dependency>
- <dependency>
- <groupId>org.apache.poigroupId>
- <artifactId>poi-ooxmlartifactId>
- dependency>
在sky-server\src\test\java\com\sky\test下面创建一个POITest类,写入如下代码:
- public class POITest {
- /*
- * 通过POI创建Excel文件并且写入文件内容
- * */
- @Test
- public void writeTest() throws IOException {
- //在内存中创建一个Excel文件
- XSSFWorkbook excel = new XSSFWorkbook();
- //在Excel文件中创建一个Sheet页
- XSSFSheet sheet = excel.createSheet("info");
- //在Sheet中创建行对象,rownum编号从0开始
- XSSFRow row = sheet.createRow(1); //1代表第2行
- row.createCell(1).setCellValue("姓名");//创建单元格写入内容
- row.createCell(2).setCellValue("城市");
- //创建一个新行
- row = sheet.createRow(2);//第3行
- row.createCell(1).setCellValue("张三");//创建单元格写入内容
- row.createCell(2).setCellValue("厦门");
-
- row = sheet.createRow(3);//第4行
- row.createCell(1).setCellValue("李四");//创建单元格写入内容
- row.createCell(2).setCellValue("南京");
- //上面写的都是在内存,现在想在磁盘看到
- FileOutputStream out = new FileOutputStream(new File("C://software/info.xlsx"));//设置文件
- excel.write(out);//写入到文件
- //关闭资源
- out.close();
- excel.close();
-
- }
- }
最终效果如下:
把文本读取出来。
在sky-server\src\test\java\com\sky\test下面的POITest类,写入如下代码:
- @Test
- public void readTest() throws IOException{
- FileInputStream in = new FileInputStream(new File("C://software/info.xlsx"));
- //读取磁盘上已经存在的Excel文件
- XSSFWorkbook excel = new XSSFWorkbook(in);
- //读取Excel文件中的第一个Sheet页
- XSSFSheet sheet = excel.getSheetAt(0);
- //获取Sheet中最后一行行号
- int lastRowNum = sheet.getLastRowNum();
- for(int i=1;i<=lastRowNum;i++){
- //获得某一行
- XSSFRow row = sheet.getRow(i);
- //获得单元格对象
- String cellValue1 = row.getCell(1).getStringCellValue();
- String cellValue2 = row.getCell(2).getStringCellValue();
- System.out.println(cellValue1+" "+cellValue2);
- }
- //关闭资源
- in.close();
-
- }
导出Excel形式的报表文件;导出最近30天的运营数据。
接口没有返回数据,导出报表本底是文件下载。服务端会通过输出流将Excel文件下载到客户端浏览器。
一般是先创建原始的Excel文件,这个文件被称为模板文件,先设置好包括颜色和字体等。
步骤:①设计Excel模板文件②查询近30天的运营数据③将查询到的运营数据写入模板文件④通过输出流将Excel文件下载到客户端浏览器。下面这个是模板文件
在sky-server的service层的ReportService接口,写入如下代码:
先在resources下面创建一个template包,然后把运营数据报表模块.xlsx复制进去。
在sky-server的controller层的admin下的ReportController类,写入如下代码:
- //导出运营数据报表
- @GetMapping("/export")
- @ApiOperation("导出运营数据报表")
- public void export(HttpServletResponse response){
- reportService.exportBusinessData(response);
- }
在sky-server的service层的ReportService接口,写入如下代码:
void exportBusinessData(HttpServletResponse response);
在sky-server的service层的Impl下的ReportServiceImpl类,写入如下代码:
- @Autowired
- private WorkspaceService workspaceService;
- //统计指定时间区间内的销量排名前10
- public SalesTop10ReportVO getSalesTop10(LocalDate begin, LocalDate end) {
- LocalDateTime beginTime = LocalDateTime.of(begin, LocalTime.MIN);
- LocalDateTime endTime = LocalDateTime.of(end,LocalTime.MAX);
- List
salesTop10 = orderMapper.getSalesTop10(beginTime, endTime); - List
names = salesTop10.stream().map(GoodsSalesDTO::getName).collect(Collectors.toList()); - String nameList = StringUtils.join(names, ",");
- List
numbers = salesTop10.stream().map(GoodsSalesDTO::getNumber).collect(Collectors.toList()); - String numberList = StringUtils.join(numbers, ",");
- return SalesTop10ReportVO.builder().nameList(nameList).numberList(numberList).build();
- }
- @Autowired
- private WorkspaceService workspaceService;
- //导出运营数据报表
- public void exportBusinessData(HttpServletResponse response){
- //1.查询数据库,获取营业数据--查询最近30天的运营数据
- LocalDate dateBegin = LocalDate.now().minusDays(30); //减30天的时间
- LocalDate dateEnd = LocalDate.now().minusDays(1);
- BusinessDataVO businessDatavo = workspaceService.getBusinessData(LocalDateTime.of(dateBegin, LocalTime.MIN), LocalDateTime.of(dateEnd, LocalTime.MAX));
- //2.通过POI将数据写入到Excel文件中
- InputStream in = this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx");//在类路径下读取资源返回输入流对象
-
- try {
- //基于模板文件创建一个新的Excel文件
- XSSFWorkbook excel = new XSSFWorkbook(in);
- //获取表格文件的Sheet文件
- XSSFSheet sheet = excel.getSheet("Sheet1");
- //填充数据--时间
- sheet.getRow(1).getCell(1).setCellValue("时间:"+dateBegin+"至"+dateEnd);
- //获得第4行
- XSSFRow row = sheet.getRow(3);
- row.getCell(2).setCellValue(businessDatavo.getTurnover()); //第3个单元格
- row.getCell(4).setCellValue(businessDatavo.getOrderCompletionRate());
- row.getCell(6).setCellValue(businessDatavo.getNewUsers());
- //获得第5行
- row = sheet.getRow(4);
- row.getCell(2).setCellValue(businessDatavo.getValidOrderCount());
- row.getCell(4).setCellValue(businessDatavo.getUnitPrice());
- //填充明细数据
- for(int i=0;i<30;i++){
- LocalDate date = dateBegin.plusDays(i);
- //查询某一天的营业数据
- workspaceService.getBusinessData(LocalDateTime.of(date,LocalTime.MIN),LocalDateTime.of(date,LocalTime.MAX));
- //获得某一行
- row = sheet.getRow(7+i);
- row.getCell(1).setCellValue(date.toString());
- row.getCell(2).setCellValue(businessDatavo.getTurnover());
- row.getCell(3).setCellValue(businessDatavo.getValidOrderCount());
- row.getCell(4).setCellValue(businessDatavo.getOrderCompletionRate());
- row.getCell(5).setCellValue(businessDatavo.getUnitPrice());
- row.getCell(6).setCellValue(businessDatavo.getNewUsers());
- }
- //3.通过输出流将Excel文件下载到客户端浏览器
- ServletOutputStream out = response.getOutputStream();
- excel.write(out);
- //关闭资源
- out.close();
- excel.close();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
-
- }
点击数据导出后会有一个xlsx文件被下载下来